通过不同的线程(一个读取线程和一个写入线程)同时读取和写入串行端口是否安全?是否有必要在每个线程中添加读/写锁定?
答案 0 :(得分:8)
从不同线程“同时”读取和写入串行端口是处理串行端口通信的标准方法:一个线程处理读取,一个处理写入。可以接受的。
有许多基于串行的设备可以异步地向主机发送数据,同时仍允许将命令发送到设备本身:条形码扫描仪,标签扫描仪和相机等设备。
<强>问题吗
当您尝试与设备同步通信时出现问题。
例如,您想要编写命令,然后立即回读任何响应。那么,在这种情况下,您将暂停读取线程并且手动在写入命令后读取所有串行端口数据。处理完命令后,读取线程可以重新启动。
<强>摘要强>
一般情况下,我建议只有一个额外的线程来处理端口数据的所有读取并触发事件,例如DataReceived
并执行主线程中的所有写入。
答案 1 :(得分:5)
来自SerialPort的文档:
此类型的任何公共静态(在Visual Basic中为Shared)成员都是线程安全的。不保证任何实例成员都是线程安全的。
由于Read和Write不是静态的,因此它们不是线程安全的。无论如何,这是一个非常糟糕的主意,因为SerialPort类为您维护内部缓冲区。
您需要将I / O同步到串口。
答案 2 :(得分:2)
我希望你描述的具体情况,1 Read和1 Write线程是安全的。
硬件上的读写通道设计为全双工使用,软件也应设计为支持该功能。
虽然我找不到关于此的明确声明,但MSDN Page for the SerialPort上的示例也在主线程中写入,同时读取另一个。没有锁定。