请查看下面的代码,这是应用程序的一部分,其目的是根据通过串行端口接收的数据绘制在线图表。这部分代码负责回收和绘图:
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
rx_str = serialPort1.ReadTo("\r\n");
//rx_str = serialPort1.ReadExisting();
serialPort1.DiscardInBuffer();
this.Invoke(new EventHandler(rx_parse));
}
private void rx_parse(object sender, EventArgs e)
{
Match mch = Regex.Match(rx_str, ex_reg);
data.Add(Convert.ToInt16(mch.Value.ToString());
chart1.Series["Series1"].Points.AddY(Convert.ToDouble(data[tab_size]));
tab_size++;
}
之前创建的已使用的变量:
rx_str - string
数据 - 双打列表
tab_size - int
ex_reg - 正则表达式的使用模式
在这种情况下,我遇到了从缓冲区同步接收数据的真正问题。 为了测试它,我在mirocontroller中通过ADC测量一些东西并将其作为字符串发送到PC。
让我们举个例子 - 收到的数据可能如下所示:373 \ r \ n
我正在使用正则表达式只从接收到的字符串中取数字。通常,数据从缓冲区到达字符串rx_str,例如:73 \ r \ n3,3,\ n37,\ n3等,而不是每个循环中的373 \ r \ n。所以,然后我处理错误顺序的数据,并在图表中导致错误的结果。
请告诉我如何在每次从缓冲区获取数据时同步它以接收相同的符号顺序。我的意思是获得相同形式的接收数据。 我补充一点,我已经通过终端检查了它,一切都很好,每次都是相同的数据形式。对于这个例子 - 373 \ r \ n
答案 0 :(得分:1)
问题是您丢弃in缓冲区中的数据。 in缓冲区可以包含373 \ r \ n37 你读到\ r \ n并在缓冲区中留下37。然后使用行
丢弃in缓冲区serialPort1.DiscardInBuffer();
这将删除37,下次您阅读时会得到3 \ r \ n
删除该行,它应该是可预测的。
答案 1 :(得分:1)
删除
serialPort1.DiscardInBuffer();
还不够完整。并且还需要调用Invoke,因为图表已在另一个线程中创建。
我通过以这种方式组织传输解决了这个问题:
我创建了完全独立的线程,它只读取了传输。它只是不基于事件serialPort1_DataReceived。然后:
1.我向微控制器发送任何字符以允许传输
2.Microcontroller最后发送到PC测量与char一起
最后我呼叫代表使用图表。
整个解决方案在循环中不断重复,并控制缓冲区内容。
感谢您的帮助