C#:等待串口关闭()

时间:2015-07-18 14:19:58

标签: c# serial-port

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

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);

我检查收到的数据是否有“消息结束”-package,然后关闭串口,所以......像

if (data = "UA") sp.Close()

所以基本上我要做的是等待关闭,然后再回馈数据,这样在顶级视图中程序不会进展,直到数据到达。但是我无法理解如何以有效和优雅的方式实现这种“等待”,因为我依赖于事件来处理我的数据。任何提示或线索或例子将非常感激。

2 个答案:

答案 0 :(得分:0)

正如SerialPort.Close()文档所述:

  

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

没有办法等待它被关闭。你可以称之为" bug"或者"按照设计的功能"

OpenClose SerialPort一遍又一遍地使用相同的程序是一种不好的做法。你应该保持SerialPort打开。

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

我找到了这篇不错的帖子https://stackoverflow.com/a/10210279/717559 引用得很好:

  

对于"最佳实践"这是最糟糕的做法。建议,因为它根本没有说明你应该等待多长时间。

答案 1 :(得分:0)

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

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

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

您可以使用以下方法之一执行此操作:

  • 为邮件末尾选择唯一的终止符

  • 在邮件开头加上指示剩余数据量的长度,或

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

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

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

你似乎赞成第三种选择。通过重置每次收到数据时设置的计时器来实现这一点,如果它到期则假设传输完成。