C# Чтение последовательного порта возвращает случайные разрывы строк - PullRequest
0 голосов
/ 03 августа 2020

Пытаюсь читать со своего ELM327, настроил. В качестве примера в teraterm, когда я отправляю команду ATI, я получил ответ

>ATI
ELM327 v1.3

Я знаю, что возврат каретки должен быть \r, согласно руководству 0x0D для исходящих и входящих. Теперь в моем коде я использую ReadExisting(), и это дает мне несколько пустых строк, иногда отображается ELM327 v1.3, но иногда это может быть:

/>
ATI

ELM3
27 v1.3

Мне трудно сделать это красивым и очистить одну строку ответ.

_serialPort = new SerialPort(ComsList.GetItemText(ComsList.SelectedItem), bauds[2], Parity.None, 8, StopBits.One);
_serialPort.Handshake = Handshake.None;
_serialPort.NewLine = "\r";
_serialPort.DataReceived  += new SerialDataReceivedEventHandler(port_DataReceived);

private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            // Show all the incoming data in the port's buffer
            SerialPort sp = (SerialPort)sender;
            string indata = sp.ReadExisting();
            lastMessage = indata;
            Debug.Print(indata);
        }

1 Ответ

0 голосов
/ 11 августа 2020

Комментарии неверны, использование события DataReceived - правильный способ go об этом. Debug.Print(indata); добавляет в вашу распечатку возврат каретки и перевод строки. Попробуйте использовать Console.Write(indata), так как это не приведет ни к чему дополнительному.

https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.debug.print?view=netcore-3.1

Записывает отформатированную строку с указателем конца строки в прослушиватели трассировки в коллекции Listeners.

...