C#周期性从串口读取换行符的内容

3

我查看了许多页面,但仍未找到答案。

我的问题如下。我有一个设备,通过RS232连接到计算机。该设备每秒发送两次这样的一行:

"*X;0;bbb;cc;d;eee;f\r\n"

这些字段是固定宽度的数字字段。每分钟一次,0标志位升高到1并且“cc”会改变。接下来我需要这个数字。
在C#应用程序中,我无法使其工作。尝试使用接收事件获取数据,但需要10秒以上才能处理刷新的结果。这意味着在标志升起后10秒后我才能得到结果。有时甚至需要更长时间。
我首先尝试了RecieveEvent。我甚至试图填充缓冲区直到填满行,但仍然是相同的结果。然后我尝试使用调用每300毫秒读取一行的计时器。仍然存在相同的问题。
所以我的问题是如何从串口读取和处理最新的数据?

你听起来很困惑,可能是我。如果计算结果需要10秒钟,而你想要更快的话,那么你需要一台时间机器。你没有足够的吉瓦特。 - Hans Passant
不,这里的问题在于有一个延迟。假设我现在(时间=t)发送了我感兴趣的字符串,通常我会在(时间=t+10秒)左右收到它。它可能被包含在缓冲区中,但在ReadLine()函数读取它之前,需要等待10秒或更长时间。 - Matija M.
2个回答

2
阅读串口数据时,串口将缓冲数据。这会引入一些小的延迟(但我们说的是毫秒级别,而不是几十秒)。大多数串口设备驱动程序也允许您配置缓冲区,如果确实很关键的话。
如果调用ReadLine,则可能会引入更多的延迟,因为它将等待收到换行符才返回任何数据。您确定设备发送良好的换行符吗?使用终端仿真器程序精确查看设备实际发送的内容,因为设备文档通常很糟糕!
我会从端口中读取原始数据,然后自己解析。您可能需要更加小心地接收部分数据包,但您可以从图像中删除所有中间人,并且您可以更加宽容(例如,不在乎数据中是否有换行符)。启动读取,然后将接收到的数据写入调试控制台,您很快就会看到程序接收到的内容以及频率等信息。这还将向您显示延迟是在串口还是在消息处理中。

一定要使用终端仿真器(如putty)分析输出。特别是要分析行尾。它是真的\r,还是\n - dialer
你会使用数据事件或每n毫秒定期读取数据吗? - Matija M.
实际上,目前它只是一个模拟器,因为我还没有这个设备。我通过com0com从另一个应用程序发送它到原始应用程序。在那里,我使用\r\n,因为文档中是这样写的。我应该使用Enviroment.Newline吗? - Matija M.
我的建议是通过将事件处理程序附加到DataRecieved事件来异步读取。这样,数据在接收后会快速传递给您 - 每秒2个小数据包,您可能会收到完整的数据包,尽管从技术上讲,您应该准备好接收部分数据包并将它们拼接在一起,直到有足够的数据进行解码。然后,您就不必担心换行符,并且数据传递给您时应该没有延迟。 - Jason Williams
好的,最终成功使其正常工作了。我使用了ReadExisting,在这种情况下它很有效,然后在*出现的位置解析它。感谢大家的帮助。 - Matija M.

0
你可以尝试使用 serialPort1.readExisting(); 然后尝试解析数据。
祝你好运!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接