C#定期从串口读取新行
Posted
技术标签:
【中文标题】C#定期从串口读取新行【英文标题】:C# periodic new line reading from serial port 【发布时间】:2012-07-04 23:30:49 【问题描述】:检查了很多页,但我仍然没有回答。
我的问题如下。我有一个设备,通过 RS232 连接到计算机。设备正在发送 TWICE 一秒钟,如下所示:
"*X;0;bbb;cc;d;eee;f\r\n"
这些字段是固定宽度的数字字段。每分钟一次,0 标志上升到 1 并且“cc”更改。那我需要这个号码。
在 C# 应用程序中,我无法让它工作。尝试使用recieve事件获取数据,但刷新结果需要10+秒才能处理。这意味着升旗后 10 秒我得到了结果。有时需要更长的时间。
我首先尝试了 RecieveEvent。我什至尝试填充缓冲区,直到它填满该行,但同样的结果。然后我尝试使用每 300 毫秒调用一次并读取一行的 Timer。还是一样的问题。
所以我的问题是,如何从串口读取和处理最新数据?
【问题讨论】:
你听起来很困惑,可能是我。如果计算一个结果需要 10 秒,而你想要它更快,那么你需要一台时间机器。你没有足够的jiggawatts。 不,这里的问题是有延迟。假设现在发送我感兴趣的字符串(时间= t),我通常会在(时间= t + 10 s)中收到它。它可能包含在某处的缓冲区中,但在 ReadLine() 函数到达它之前,要经过 10 秒或更长时间 【参考方案1】:读取时,串口会缓存数据。这将引入一个小的延迟(但我们说的是毫秒,而不是几十秒)。大多数串行设备驱动程序也允许您配置缓冲,如果它真的很重要的话。
如果您调用 ReadLine,您可能会引入更多延迟,因为它会等到收到换行符后再返回任何数据。您确定您的设备正在发送良好的换行符吗?使用终端模拟器程序来查看设备实际发送的内容,因为设备文档通常很糟糕!
我会从端口读取原始数据,然后自己解析。您可能需要更加小心地接收部分数据包,但是您从图片中删除了所有中间人,并且您可以更加宽容(例如,不关心数据中是否有换行符)。开始读取,然后将您收到的数据写出到调试控制台,您很快就会看到您的程序正在接收什么以及频率等。这还将向您显示延迟是在串行端口中还是在您的处理中消息
【讨论】:
肯定用putty之类的终端仿真器分析输出。并特别分析行尾。真的是\r
,还是\n
?
但是您是通过数据事件还是定期每隔 n 毫秒读取数据?
实际上,目前它只是一个模拟器,因为我这里还没有设备。我从另一个应用程序通过 com0com 将它发送到原始应用程序。我在那里使用 \r\n,正如它在文档中所写的那样。我应该使用 Enviroment.Newline 吗?
我的建议是通过将事件处理程序附加到 DataRecieved 事件来异步读取。这将在收到数据后迅速将数据传送给您——每秒 2 个小数据包,您可能会收到完整的数据包,尽管从技术上讲,您应该准备好接收部分数据包并将它们粘在一起,直到您有足够的数据进行解码。这样您就不必担心换行了,并且在向您交付数据时应该有最小的延迟。
好的,终于可以正常工作了。我使用了 ReadExisting,它在这种情况下工作得很好,然后在 * 出现的地方解析它。谢谢大家的帮助。【参考方案2】:
您可以尝试serialPort1.readExisting();
,然后尝试解析数据。
祝你好运!
【讨论】:
以上是关于C#定期从串口读取新行的主要内容,如果未能解决你的问题,请参考以下文章