Получить специальный символ из последовательного порта - PullRequest
1 голос
/ 18 октября 2019

Мне нужно получать и передавать данные через последовательный порт. У меня нет проблем с получением и передачей, но я не вижу полученные данные правильно. Если я использую программу ComTestSerial, я вижу правильные данные:

{STX} 1H | \ ^ & ||| cobas6000 ^ 1 ||||| host | RSUPL ^ BATCH | P |1 P | 1 ||||||| U |||||| ^ O | 1 |IANNETTA M BIS | 0 ^ 5016 ^ 1 ^^ S1 ^ SC | ^^^ 480 ^ | R |||||| N |||| 1 ||||||| 20191018113556 ||| FC | 1 | I|^ ^^^ | GR | 1 | ^^^ 480 / | 11 | U / L {ETB} A6

Но если я использую свою программу на c #, с RicheditText или Texbox, я вижуэти неверные данные:

.

Я использую этот простой код (написанный коллегой) для получения:

string cMsg = "";
while (this.ComPort.BytesToRead > 0)
{
    int nChar = this.ComPort.ReadChar();
    cMsg += nChar.ToString();
}
Thread.Sleep(100);
return cMsg;

, который считывает данные изпоследовательное соединение, которое работает отлично. В чем может быть проблема?

Ответы [ 2 ]

2 голосов
/ 18 октября 2019

Вы преобразуете число в строку, так что, скажем, когда nChar равно 2, выводом будет строка "2", а когда nChar = 49, выводом будет "49".

Итак, сообщение начинается с {STX}1. {STX} - это управляющий код ASCII 2, а 1 - это код 49 ASCII. Таким образом, «неправильные данные» начинаются с "249".

Таким образом, данные не ошибочны, и код делаетименно то, что вы сказали, за исключением того, что ваш коллега не имел в виду то, что вы хотели:)

Вместо преобразования ASCII-кодов в строки, конвертируйте их в символы, а также используйте строитель строк, чтобы минимизировать количество разразмер строки изменяется.

StringBuilder message(ComPort.BytesToRead);

while (ComPort.BytesToRead > 0)
{
    message.Append((char)ComPort.ReadChar());
}
return message.ToString();

Но вам не нужно ничего делать! SerialPort.ReadExisting делает то, что вы хотите:

return ComPort.ReadExisting();.

Стилистическое примечание: C # не является Java, и засорение кода с помощью this. не является идиоматическим и не необходимым. Не делайте этого, если нет веской причины.

0 голосов
/ 18 октября 2019

Из вашего кода кажется, что вы получаете целое число от вашего порта, и когда вы используете ToString (), вы просто записываете число в строку

int nChar = this.ComPort.ReadChar();
cMsg += nChar.ToString();

Это целое число должно быть A 21-битная кодовая точка Unicode. Таким образом, вы просто можете использовать метод Char.ConvertFromUtf32 (Int32), он преобразует целое число в фактический символ:
https://docs.microsoft.com/en-us/dotnet/api/system.char.convertfromutf32?view=netframework-4.8
Ваш полный код должен выглядеть следующим образом:

string cMsg = "";
while (this.ComPort.BytesToRead > 0)
{
    int nChar = this.ComPort.ReadChar();
    cMsg += Char.ConvertFromUtf32(nChar);
}
Thread.Sleep(100);
return cMsg;
...