Transmisja przez RS a kodowanie

0

Witam,

mam taki oto problem. Próbuję napisać aplikację do komunikacji po RS232. Jednak przy testowaniu z użyciem terminala pojawia się mały problem. Znak ASCII wysłany z terminala ma całkiem inną prezentację w aplikacji, a odsyłany później z powrotem ma inny kod HEX. Może mało zrozumiale napisane, więc np. gdy z terminala wysyłam literkę A - 0x41 hex, w aplikacji w textboxie wyświetla się _ - 0x5F hex, a odesłany z powrotem bajt wyświetlany w terminalu ma wartość 0x50. Sprawa rozbija się o kodowanie, ale już nie wiem, jak to ugryźć, żeby było dobrze. Nie ma znaczenia, czy stosuję metodę ReadExisting() czy Read (byte[],.....). Jak się dobrze za to zabrać? Znaki muszą być kodowane w ASCII - aplikacja będzie służyć do sterowania systemem który wysyła/odbiera dane ASCII.

0

nie dobrane szybkości nadajnika i odbiornika

0

Przepraszam, post miał być w dziale C#, zagapiłem się, proszę o przeniesienie. Co do prędkości, są ustawione tak samo, parametry transmisji również

0

pokaż w jaki sposób wysyłasz i odbierasz. upewnij się też że wysyłąsz znak 1-bajtowy (sprawdź kodowanie)

0

Odczyt próbuję w ten sposób:

byte[] tablica = new byte[_serialPort.BytesToRead]
int odczyt = _serialPort.Read(tablica, 0, _serialPort.BytesToRead);
string odebrane_RS = new string (tablica);
textbox.AppendText(odebrane_RS + "\n");

A wysyłka:

_serialPort.Write(tablica, 0, odczyt);

Próby ze zmianami kodowań pominąłem. Za każdym razem, gdy wysyłam z terminala jeden znak, jeden znak się wyświetla i jeden znak wraca. Jestem początkujący w C#, prosiłbym o podpowiedź, jak to właśnie z tym kodowaniem jest, bo nawet jeśli po zmianie tablicy byte na string i wywołaniu metody

Encoding.ASCII.GetBytes()

i wysłaniu tak otrzymanego wyniku nie zgadza się on z tym, co pierwotnie zostało wysłane. Przy otwieraniu portu jeszcze dla pewności ustawiłem _serialPort.Encoding = ASCIIEncoding.ASCII;

0

spróbuj zamiast przez rsa, zapisać w dokładnie taki sam sposób do pliku. Ja kiedyś robiłem jakiemuś gościowi projekt, to zapis to pliku w VB.NET robiłem tak (w C# powinno wyglądać to prawie tak samo):

    Private Sub WriteInt(ByRef fs As IO.FileStream, ByVal d As Integer)
        fs.Write(BitConverter.GetBytes(d), 0, 4)
    End Sub
    Private Function ReadInt(ByRef fs As IO.FileStream) As Integer
        Dim buffer(3) As Byte
        fs.Read(buffer, 0, 4)
        Return BitConverter.ToInt32(buffer, 0)
    End Function
    Private Sub WriteString(ByRef fs As IO.FileStream, ByVal s As String)
        Dim buffer As Byte() = New UTF8Encoding(True).GetBytes(s)
        WriteInt(fs, buffer.Length)
        fs.Write(buffer, 0, buffer.Length)
    End Sub
    Private Function ReadString(ByRef fs As IO.FileStream) As String
        Dim len As Integer = ReadInt(fs)
        Dim buffer As Byte()
        ReDim buffer(len)
        fs.Read(buffer, 0, len)
        Return New UTF8Encoding(True).GetString(buffer)
    End Function
0

Niestety, dalej nic z tego. Ponieważ w C# nie ma metody Write(byte,..) zrobiłem to w następujący sposób:

byte[] bufor = Encoding.UTF8.GetBytes(s);
char[] bufor2 = Encoding.UTF8.GetChars(bufor,0,bufor.Length);
plik.Write(bufor2, 0, bufor2.Length);

ale w pliku nadal zamiast literki A wysłanej z terminala zapisywany jest znak _

0

Ponieważ w C# nie ma metody Write(byte,..)
Niemożliwe, żeby w VB była jakaś funkcja .Net-a a w C# jej nie było. Może używasz starszej wersji Frameworka.

0
Azarien napisał(a)

Ponieważ w C# nie ma metody Write(byte,..)
Niemożliwe, żeby w VB była jakaś funkcja .Net-a a w C# jej nie było. Może używasz starszej wersji Frameworka.

http://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=EN-US&k=k(SYSTEM.IO.STREAMWRITER.WRITE)&rd=true

A jednak. Używam wersji 4.0. Chyba najprostszym sposobem będzie stworzyć sobie po prostu tabelę co mi wychodzi po wysłaniu z terminala kolejnych wartości od 0x0 do 0xFF i odebraniu przez RS i zrobienie własnej funkcji konwersji.

0

Pewnie dlatego, że StreamWriter Implements a TextWriter for writing characters to a stream in a particular encoding.. Użyj BinaryWriter (Writes primitive types in binary to a stream and supports writing strings in a specific encoding.) albo pisz bezpośrednio po Stream.

0
bania_mb napisał(a)
Azarien napisał(a)

Ponieważ w C# nie ma metody Write(byte,..)
Niemożliwe, żeby w VB była jakaś funkcja .Net-a a w C# jej nie było. Może używasz starszej wersji Frameworka.

http://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=EN-US&k=k(SYSTEM.IO.STREAMWRITER.WRITE)&rd=true

A jednak. Używam wersji 4.0. Chyba najprostszym sposobem będzie stworzyć sobie po prostu tabelę co mi wychodzi po wysłaniu z terminala kolejnych wartości od 0x0 do 0xFF i odebraniu przez RS i zrobienie własnej funkcji konwersji.

To żeś jebnął jak łysy grzywką o kawał betonu teraz.

W bazowej Stream jest: http://msdn.microsoft.com/en-us/library/system.io.stream.write.aspx
W konkretnej FileStream nadpisana: http://msdn.microsoft.com/en-us/library/system.io.filestream.write.aspx

0
Rev napisał(a)

Pewnie dlatego, że StreamWriter Implements a TextWriter for writing characters to a stream in a particular encoding.. Użyj BinaryWriter (Writes primitive types in binary to a stream and supports writing strings in a specific encoding.) albo pisz bezpośrednio po Stream.

string odebrane_RS = _serialPort.ReadExisting();
BinaryWriter plik = new BinaryWriter(File.Open(("plik.txt"),FileMode.Open));
byte[] bufor = Encoding.UTF8.GetBytes(s);
plik.Write(bufor, 0, bufor2.Length);
plik.Close();

Nadal to samo - wysyłam literkę A, w pliku jest _

1 użytkowników online, w tym zalogowanych: 0, gości: 1