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

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

从SerialPort的文档:

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

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

您需要将I / O与串行端口同步。

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

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

问题?

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

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

摘要

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

我希望你描述的具体情况,1 Read和1 Write线程是安全的。

硬件上的读写通道设计为全双工,软件也应设计为支持全双工。
虽然我找不到关于此的明确声明,但是SerialPort的MSDN页面上的示例也在主线程写入时读取另一个。 没有锁定。