c#:等待串口关闭()

本文关键字:串口 等待 | 更新日期: 2023-09-27 18:03:17

我想实现一个相当简单的函数,输出串行端口的字节数组,例如

byte[] o = readAllDataFromSerialPort();

完成实际串口功能的实现。我使用串口接收一些数据,并通过事件DataReceived处理数据。

sp = new SerialPort(portname, 9600, System.IO.Ports.Parity.None, 8, System.IO.Ports.StopBits.One);
sp.Handshake = Handshake.None;
sp.DataReceived += new SerialDataReceivedEventHandler(serialDataReceived);

我检查接收到的数据是否有"消息结束"包,以便关闭串行端口,所以像

if (data = "UA") sp.Close()
所以基本上我想做的是等待闭包,在返回数据之前,这样在顶层视图中程序不会进行,直到数据到达。然而,我不知道如何以一种有效而优雅的方式实现这种"等待",因为我的数据依赖于事件。如有任何提示、线索或例子,我将不胜感激。

c#:等待串口关闭()

串口未打开或关闭。OpenClose函数打开串口驱动句柄

如果没有为驱动程序打开句柄,则忽略来自端口的所有输入。

确定是否已接收到所有数据的唯一方法是设计一个协议,该协议为您提供检测传输结束的保证方法。

你可以这样做:

  • 选择一个唯一的结束符作为消息的结尾,

  • 在消息的开头包含一个长度,表示剩余数据量,或者

  • 等待足够长的时间(这也取决于),以确保没有更多的数据等待。

Open, Close比喻的进一步原因是串行端口通常是独占资源,一次只有一个进程可以访问句柄,以防止不兼容(并且可能危险)无意中访问端口另一端的设备。您应该在整个程序中保持端口打开,以防止由于另一个程序不适当地打开设备而导致连接的设备无法访问。

缺乏热插拔设备(实际上是设备识别)使串行端口更加静态,保持设备打开应该不是问题。

你似乎倾向于第三种选择。通过重置每次接收数据时设置的计时器来实现此功能,如果计时器过期,则假定传输完成。

正如SerialPort.Close()文档中所说:

任何应用程序的最佳实践是在调用Close方法后等待一段时间,然后再尝试调用Open方法,因为端口可能不会立即关闭。

没有办法等待它关闭。你可以称之为"bug"或者"设计好的函数"

在同一个程序中反复使用OpenCloseSerialPort是一种不好的做法。您应该保持SerialPort打开。

如果你真的想关闭它,稍后再打开它,你可以在返回之前添加一个小的sleep,但是没有意义的sleep是不好的做法。

我发现这个很好的帖子https://stackoverflow.com/a/10210279/717559加上一个漂亮的引语:

这是"最佳实践"建议中最糟糕的实践,因为它根本没有指定您应该等待多长时间。