通过不同的线程同时读取和写入串口是否安全?

Tay*_*ese 9 .net c# serial-port

通过不同的线程(一个读取线程和一个写入线程)同时读取和写入串行端口是否安全?是否有必要在每个线程中添加读/写锁定?

Mik*_*e J 8

从不同线程"同时"读取和写入串行端口是处理串行端口通信的标准方法:一个线程处理读取,一个处理写入.可接受的.

有许多基于串行的设备可以异步地向主机发送数据,同时仍允许将命令发送到设备本身:条形码扫描仪,标签扫描仪和相机等设备.

问题?

当您尝试与设备同步通信时出现问题.

例如,您想要编写命令,然后立即回读任何响应.那么,在这种情况下,您将暂停读取线程并在写入命令后手动读取所有串行端口数据.处理完命令后,读取线程可以重新启动.

摘要

一般来说,我建议只有一个额外的线程来处理端口数据的所有读取并触发事件,例如DataReceived从主线程执行所有写操作.


Ree*_*sey 5

SerialPort的文档:

此类型的任何公共静态(在Visual Basic中为Shared)成员都是线程安全的.任何实例成员都不保证是线程安全的.

由于读取和写入不是静态的,因此它们不是线程安全的.无论如何,这是一个非常糟糕的主意,因为SerialPort类为您维护内部缓冲区.

您需要将I/O同步到串行端口.

  • 但SerialPort是一种特殊情况,包括软硬件中的独立读和写通道.使用2个读取线程需要锁定. (2认同)
  • 接受的答案是错误的。MSDN 充满了缺失的细节。MSDN 中没有明确提及线程安全这一事实可能仅仅意味着 Microsoft 的文档团队忘记提及它。在编写答案之前,您应该查看源代码。SerialPort 在内部使用一个 SerialStream 类,它使用 API CreateFile("\\.\COM1") 打开一个双向 COM 端口。使用 ReadFile() 读取数据并使用 WriteFile() API 写入数据。因此,如果一个线程仅写入而另一个线程仅读取,则 SerialPort 绝对是线程安全的。 (2认同)