C#通过串行端口同步接收的数据
请看我下面的代码,这是应用程序的一部分,其目的是根据通过串行端口接收的数据绘制在线图表。该部分代码负责接收和绘制:C#通过串行端口同步接收的数据,c#,serial-port,C#,Serial Port,请看我下面的代码,这是应用程序的一部分,其目的是根据通过串行端口接收的数据绘制在线图表。该部分代码负责接收和绘制: private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) { rx_str = serialPort1.ReadTo("\r\n"); //rx_str = serialPort1.ReadE
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-字符串
数据-双打名单
制表符大小-整数
ex_reg-正则表达式的常用模式
在这种情况下,我在同步从缓冲区接收的数据时遇到了真正的问题。
为了测试它,我通过微控制器中的ADC测量了一些东西,并将其作为字符串发送到PC
让我们举这样的例子-接收到的数据可以如下所示:373\r\n
我使用正则表达式只从收到的字符串中提取数字。数据通常从缓冲区到达字符串rx\u str,例如:73\r\n3、3、\n37、\n3等,而不是每个周期中的373\r\n。所以,我会处理顺序错误的数据,这会在图表中导致错误的结果
请给我一个建议,当我每次从缓冲区获取数据时,如何同步它以接收相同的符号顺序。我的意思是得到相同形式的接收数据。
我补充说,我已经通过终端进行了检查,一切正常,每次都是相同形式的数据。对于本例-373\r\n,问题在于您丢弃了in缓冲区中的数据。 缓冲区中可能包含373\r\n37 您读取到\r\n,这将在缓冲区中留下37个。然后丢弃缓冲区中的行
serialPort1.DiscardInBuffer();
这将删除37,下次阅读时将得到3\r\n
删除该行,它应该是可预测的。删除
serialPort1.DiscardInBuffer()
这还不足以解决问题。还需要调用Invoke,因为图表是在另一个线程中创建的
我通过以下方式组织传输解决了这个问题:
我创建了完全分离的线程,它只读取传输。它只是不基于serialPort1_DataReceived事件。然后:
1.我向微控制器发送任何字符以允许传输
2.微控制器发送至PC测量,最后发送字符