到现在为止,我都是在需要发送数据时打开,然后立即关闭。 我收到随机的“访问端口”错误(尽管我总是在使用后关闭端口), 所以我想也许让它永远打开。
假设我每隔一两分钟就需要在某些 COM 端口发送数据,那么正确的使用方法是什么?
谢谢..
频繁调用SerialPort.Close()是一个错误。 让另一个应用程序窃取您的端口并不是非常可取的。 但更多的问题以及您遇到的问题是 Close() 不会等待由 SerialPort 启动的工作线程退出。 该工作线程引发 DataReceived、PinChanged 和 ErrorReceived 事件。 它需要“一段时间”才能退出,可能在几毫秒到几秒之间。 再次调用 Open() 将失败,直到完成为止。
这是该类中的一个缺陷,但由串行端口的常见用法引起。 应用程序通常不会关闭它们,直到应用程序终止。 包括从不,避免常见的死锁情况。 请注意,MSDN 文章 有关“关闭”的警告:
对于任何应用程序来说,最佳实践是在调用 Close 方法之后等待一段时间,然后再尝试调用 Open 方法,因为端口可能不会立即关闭。
如果您担心打开/关闭和其他应用程序窃取 COM 端口,您可以使用 Microsoft 用于 Windows 嵌入式 GPS 中间驱动程序的方法,即编写一个聚合器,打开端口,保持它打开,然后为其他应用程序提供连接点。
如何创建连接取决于您:您可以深入了解硬件并编写可共享的虚拟 com 端口驱动程序,或者您可以按照我的做法编写一个简单的 win32 套接字服务,允许客户端程序进行连接通过常规 Windows 套接字连接。
也许不是一个直接的答案,但值得深思。
使串行端口保持打开状态几乎没有什么害处,所以是的,保持它打开。它可以节省您打开/关闭它的开销。
我使用“using (Globals.port = new SerialPort(Globals.portName, Globals.BAUDRATE, Globals.parity, Globals.DATABIT, Globals.StopBits)) 得到同样的错误 {}”我应该离开这个吗?