我想实现一个相当简单的函数,它输出串行端口的字节数组,例如
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()
所以基本上我要做的是等待关闭,然后再回馈数据,这样在顶级视图中程序不会进展,直到数据到达。但是我无法理解如何以有效和优雅的方式实现这种“等待”,因为我依赖于事件来处理我的数据。任何提示或线索或例子将非常感激。
答案 0 :(得分:0)
正如SerialPort.Close()文档所述:
任何应用程序的最佳做法是在尝试调用Open方法之前等待一段时间后再调用Close方法,因为端口可能不会立即关闭。
没有办法等待它被关闭。你可以称之为" bug"或者"按照设计的功能"
Open
和Close
SerialPort
一遍又一遍地使用相同的程序是一种不好的做法。你应该保持SerialPort打开。
如果你真的想关闭它并稍后再打开它,你可以在返回之前加一个小睡眠,但是没有意义的睡眠是不好的做法。
我找到了这篇不错的帖子https://stackoverflow.com/a/10210279/717559 引用得很好:
对于"最佳实践"这是最糟糕的做法。建议,因为它根本没有说明你应该等待多长时间。
答案 1 :(得分:0)
串口未打开或关闭。 Open
或Close
函数打开串口驱动程序的句柄。
如果没有向驱动程序打开句柄,则忽略端口的所有输入。
您可以确定是否已收到所有数据的唯一方法是设计一种协议,为您提供检测传输结束的有保证的方法。
您可以使用以下方法之一执行此操作:
为邮件末尾选择唯一的终止符
在邮件开头加上指示剩余数据量的长度,或
等待足够长时间(这也取决于)以确保没有更多数据待处理。
Open
,Close
比喻的另一个原因是串行端口通常是独占资源,并且一次只有一个进程可以访问句柄以防止不兼容(并且可能危险)无意中访问端口另一端的设备。您应该在整个程序中保持端口打开,以防止连接的设备无法访问,因为另一个程序不正确地打开了设备。
缺少热插拔设备(实际上是设备识别)使串行端口更加静态,保持设备打开应该不是问题。
你似乎赞成第三种选择。通过重置每次收到数据时设置的计时器来实现这一点,如果它到期则假设传输完成。