繁体   English   中英

C#Visual Studio每毫秒通过串行端口读取一个数据包

[英]C# visual studio reading a data pack every ms with the serial port

我有一个窗口窗体应用程序,需要每毫秒一次读取一个字节数组。 字节数组的大小不同,但永远不会超过36个字节。 我目前拥有的代码似乎省略了一些数据包。 包中的一个字节是一个计数,因此我可以告诉您某些包丢失了。 在serialPort1.Read(data,0,bytesToRead)之后,剩下的代码只是将字节数组处理为int数组并将其添加到列表中。 该代码的所有工作都与我期望的一样。

private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{

       int bytesToRead = serialPort1.BytesToRead; 
       byte[] data = new byte[bytesToRead];
       serialPort1.Read(data, 0, bytesToRead); 

       data = replaceBytes(data);
       long[] dataIntigerValuesPlusCountValue = convertDataToInt(data);
       List<long> dataIntigerValuePlusCountValueList = dataIntigerValuePlusCountValue.OfType<long>().ToList();
       dataList.Add(dataIntigerValuePlusCountValueList);

}

我有一个窗口窗体应用程序,需要每毫秒一次读取一个字节数组。

首先,您不必阅读“每毫秒”,如果您处于UI线程中(因为您未使用线程),就可以锁定UI。

字节数组的大小不同,但永远不会超过36个字节。

与其尝试每个MS读取一个数据包,不如一次缓冲36个字节的数据,然后对其进行处理。 例如,准备好36个字节,找到一个告诉您数据包应该多长时间的字节,然后处理那么多字节。 在您下次读取串行端口时,请将所有未使用的字节数组与接下来读取的36个字节连接起来(您的缓冲区数组大小应至少为72个字节,并且在每个循环中,您应检查当前大小是否大于36,如果是,则循环一个额外的时间,以便在给定的时间,字节数组缓冲区中最多有1个完整的数据包)。

另外,应该使用async / await连续读取读取的数据,然后以这种方式处理数据,而不是阻塞UI线程,而不是利用线程。 如何连续不断地异步读取数据

这样,您将获得数据包的大小,然后等待缓冲区为适当的大小,然后处理数据。

您当前的操作方式将删除缓冲区中多余的数据并取消连接的同步。 也就是说,您还应该尝试使用标志字节(或换行符)来表示数据包的开始或结束。 显然,如果不是您的硬件,您将无法控制它,但是如果可以,那将保证流永远不会脱离同步。

TL:DR:时间不可靠,只在接收到数据包时对其进行处理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM