Ошибка C# шкала весов дисплея последовательного порта непрерывно в richtextbox

Я пытаюсь прочитать весы данных на моем компьютере с помощью последовательного порта C#.

в выводе замазки, как это:

60KG

60KG

60KG

60KG

затем я отображаю его в richtextbox, используя скрипт ниже:

private void SerialPortOnDataReceived(object sender, SerialDataReceivedEventArgs serialDataReceivedEventArgs)
        {
            if (InvokeRequired)     //<-- Makes sure the function is invoked to work properly in the UI-Thread
                BeginInvoke(new Closure(() => { SerialPortOnDataReceived(sender, serialDataReceivedEventArgs); }));     //<-- Function invokes itself
            else
            {
                while (_serialPort.BytesToRead > 0) //<-- repeats until the In-Buffer is empty
                {
                    String tampung = _serialPort.ReadExisting();

                    String tampungy = Regex.Replace(tampung, @"[^\d]", "").Trim();

                    richTextBox2.AppendText(tampungy + System.Environment.NewLine);
                    richTextBox2.ScrollToCaret();
        }
            }
        }

но отображается так

6

0

6

0

6

0

Что-то не так?

1 ответ

Похоже, что вы читаете данные по мере поступления каждого символа. Чтобы продемонстрировать это, вы можете сделать это:

var data = new byte[_serialPort.BytesToRead];
_serialPort.Read(data, 0, data.Length);
tampungy = string.Join(" ", data.Select(b => b.ToString("X2"));
richTextBox2.AppendText(tampungy + System.Environment.NewLine);
richTextBox2.ScrollToCaret();

Он должен распечатать шестнадцатеричное кодирование каждого прочитанного байта. 0D 0A (CR LF) и 0A (LF) - разрывы строк. 30 или же 39 цифры (0-9).

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

private StringBuilder _buffer = new StringBuilder();

private void SerialPortOnDataReceived(object sender, SerialDataReceivedEventArgs serialDataReceivedEventArgs)
{
    if (InvokeRequired)     //<-- Makes sure the function is invoked to work properly in the UI-Thread
        BeginInvoke(new Closure(() => { SerialPortOnDataReceived(sender, serialDataReceivedEventArgs); }));     //<-- Function invokes itself
    else
    {
        while (_serialPort.BytesToRead > 0) //<-- repeats until the In-Buffer is empty
        {
            _buffer.Append(_serialPort.ReadExisting());
        }

        // Look for the first linebreak in the buffer
        int index = Enumerable.Range(0, _buffer.Length).FirstOrDefault(i => _buffer[i] == '\n'); // 0 if not found
        while (index > 0) {
            // Extract and remove the first line
            string tampung = _buffer.ToString(0, index);
            _buffer.Remove(0, index + 1);

            String tampungy = Regex.Replace(tampung, @"\D+", "");

            richTextBox2.AppendText(tampungy + System.Environment.NewLine);
            richTextBox2.ScrollToCaret();

            // Look for the next linebreak, if any
            index = Enumerable.Range(0, _buffer.Length).FirstOrDefault(i => _buffer[i] == '\n'); // 0 if not found
        }
    }
}
Другие вопросы по тегам