Ошибка 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
}
}
}