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

时间:2009-09-28 18:48:57

标签: c# .net serial-port

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

3 个答案:

答案 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上的示例也在主线程中写入,同时读取另一个。没有锁定。