C#:等待串口关闭()
C#: wait for serial port to close()
我想实现一个比较简单的函数,输出一个串口的字节数组,例如
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);
我检查接收到的数据是否有 "message end" 包,以便关闭串口,所以……喜欢
if (data = "UA") sp.Close()
所以基本上我想做的是等待关闭,然后再返回数据,这样在顶层视图上程序就不会继续,直到数据已经到达。但是,由于我的数据依赖于事件,因此我无法全神贯注地了解如何以有效且优雅的方式实现此 "waiting" 。任何提示或线索或示例将不胜感激。
如 SerialPort.Close() 文档所述:
The best practice for any application is to wait for some amount of time after calling the Close method before attempting to call the Open method, as the port may not be closed instantly.
没有办法等待它关闭。你可以称它为 "bug" 或 "function as designed"
用同一个程序一遍又一遍地 Open
和 Close
和 SerialPort
是一种不好的做法。您应该保持 SerialPort 打开。
如果你真的想关闭它,稍后再打开它,你可以在返回之前添加一个小睡眠,但没有意义的睡眠是不好的做法。
我觉得这个不错 post
附上一句好话:
This is the worst possible practice for "best practice" advice since it doesn't at all specify exactly how long you are supposed to wait.
串口未打开或关闭。 Open
或 Close
函数打开串行端口驱动程序的句柄。
如果驱动程序没有打开任何句柄,则忽略来自端口的所有输入。
确定是否已接收到所有数据的唯一方法是设计一个协议,为您提供检测传输结束的有保证的方法。
您可以使用以下方法之一执行此操作:
或者 select 一个唯一的结束符,
在消息的开头加入一个长度,表示剩余数据量,或者
等待足够长的时间(这也取决于)以确保没有更多数据待处理。
Open
、Close
隐喻的另一个原因是串行端口通常是独占资源,一次只有一个进程可以访问句柄以防止不兼容(并且可能有危险)无意中访问端口另一端的设备。您应该在整个程序中保持端口打开,以防止连接的设备变得不可访问,因为另一个程序不适当地打开了设备。
缺乏热插拔功能(实际上是设备识别)使串行端口更加静态,保持设备打开应该不是问题。
您似乎赞成第三种选择。通过重置每次接收到数据时设置的计时器来实现此目的,如果超时则假定传输已完成。
我想实现一个比较简单的函数,输出一个串口的字节数组,例如
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);
我检查接收到的数据是否有 "message end" 包,以便关闭串口,所以……喜欢
if (data = "UA") sp.Close()
所以基本上我想做的是等待关闭,然后再返回数据,这样在顶层视图上程序就不会继续,直到数据已经到达。但是,由于我的数据依赖于事件,因此我无法全神贯注地了解如何以有效且优雅的方式实现此 "waiting" 。任何提示或线索或示例将不胜感激。
如 SerialPort.Close() 文档所述:
The best practice for any application is to wait for some amount of time after calling the Close method before attempting to call the Open method, as the port may not be closed instantly.
没有办法等待它关闭。你可以称它为 "bug" 或 "function as designed"
用同一个程序一遍又一遍地 Open
和 Close
和 SerialPort
是一种不好的做法。您应该保持 SerialPort 打开。
如果你真的想关闭它,稍后再打开它,你可以在返回之前添加一个小睡眠,但没有意义的睡眠是不好的做法。
我觉得这个不错 post 附上一句好话:
This is the worst possible practice for "best practice" advice since it doesn't at all specify exactly how long you are supposed to wait.
串口未打开或关闭。 Open
或 Close
函数打开串行端口驱动程序的句柄。
如果驱动程序没有打开任何句柄,则忽略来自端口的所有输入。
确定是否已接收到所有数据的唯一方法是设计一个协议,为您提供检测传输结束的有保证的方法。
您可以使用以下方法之一执行此操作:
或者 select 一个唯一的结束符,
在消息的开头加入一个长度,表示剩余数据量,或者
等待足够长的时间(这也取决于)以确保没有更多数据待处理。
Open
、Close
隐喻的另一个原因是串行端口通常是独占资源,一次只有一个进程可以访问句柄以防止不兼容(并且可能有危险)无意中访问端口另一端的设备。您应该在整个程序中保持端口打开,以防止连接的设备变得不可访问,因为另一个程序不适当地打开了设备。
缺乏热插拔功能(实际上是设备识别)使串行端口更加静态,保持设备打开应该不是问题。
您似乎赞成第三种选择。通过重置每次接收到数据时设置的计时器来实现此目的,如果超时则假定传输已完成。