Problemy z klasą SerialPort
Mam wiele problemów podczas próby uzyskania portu szeregowego, aby otrzymać prawidłowy komunikat. Ciągle obcina wiadomości. Oto mój kod i postaram się rozwinąć po kodzie.
public SerialComms(SerialPort sp)
{
this.sp = sp;
this.sp.Open();
this.sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
do
{
Console.WriteLine("port open waiting message");
Console.ReadKey();
} while(!_terminate);
this.sp.Close();
}
void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
string dataReceived;
StringComparer strComp = StringComparer.OrdinalIgnoreCase;
SerialPort sp = (SerialPort)sender;
int i = sp.BytesToRead;
byte[] _byte = new byte[i];
char[] _char = new char[i];
sp.read(_byte, 0, i);
dataReceived = Encoding.UTF8.GetString(_byte);
//dataReceived = new string(_char);
//dataReceived = sp.ReadExisting();
if (strComp.Equals("00000000000000"), dataReceived))
_terminate = true;
Console.WriteLine(dataReceived);
}
Teraz mam projekt testowy, którego używamy do testowania naszych seryjnych komunikatów w produkcji za pomocą starszego oprogramowania - wiem, że działa dobrze. Do portu podłączyłem monitor szeregowy, a wiadomość przechodzi przez transmisje bez żadnych problemów. Kiedy wysyłam wiadomość, taką jak 012345678901234, po raz pierwszy przechodzi ona zwykle dobrze, a po stronie odbiorcy monitor pokazuje to, co nadchodzi; jednak po wydrukowaniu na konsoli zostaje obcięty po pierwszej wiadomości. Dołączam zrzuty ekranowe wiadomości przechodzącej przez monitor portu i wyjście konsoli (pojawiająca się buźka i serce to konwertowane przedrostki bajtów - dlaczego to serce i buźka nie mam pojęcia)
Ok, więc nie mogę opublikować obrazu, ponieważ nie mam wystarczającej reputacji, aby to zrobić. Napiszę, jak wygląda wyjście na konsoli poniżej (w tym przypadku z jakiegoś powodu obcięło również pierwszą wiadomość :()
Na monitorze portu szeregowego przesyłana wiadomość jest następująca (wysłałem ją trzy razy z kilkoma sekundami „opóźnienia” między wysłaniem każdej wiadomości):
02 31 32 33 34 35 36 37 38 39 30 31 32 33 34 03 .12345678901234.
02 31 32 33 34 35 36 37 38 39 30 31 32 33 34 03 .12345678901234.
02 31 32 33 34 35 36 37 38 39 30 31 32 33 34 03 .12345678901234.
Na konsoli otrzymałem następujące (znaki ☺ i ♥ to 02 i 03, są to komunikaty STX i ETX, które są standardowe dla naszych transmisji):
45123456
78901234 ♥
☺
123
456
7890
123
4 ♥
☺
123
456
7890
123
4 ♥
Ten problem doprowadza mnie do szału !!! Proszę pomóż! Dziedzictwo używa przestarzałego MSCommLib i przechodzimy do .Net 4