Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#通过串行端口同步接收的数据_C#_Serial Port - Fatal编程技术网

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测量,最后发送字符

  • 在C#中,我给出: serialport1.ReadTo(“帧末尾的字符”)
  • 最后我调用委托人使用图表

    整个解决方案在循环中不断重复,并提供对缓冲区内容的控制

    感谢您的帮助

    Invoke()调用可能会导致大量延迟。通常非常麻烦,因为它很可能导致Close()调用死锁。但是为了避免rx_str上的线程竞赛错误,这里有必要使用DiscardInBuffer(),它会将您尚未读取的数据丢弃。究竟失去了什么是不可预测的。必须将其从代码中删除。Invoke()引起的延迟仍然可能由于溢出错误而导致额外的数据丢失,请确保还实现了ErrorReceived事件,以便您可以看到这种情况。请注意,这肯定会出错,您永远不会从图表中删除任何数据。这将使它越来越慢。一旦UI无法跟上数据速率,并且串口握手不够可靠,则接收缓冲区将溢出。由于失去对UI的所有控制,通常也很明显。