【发布时间】:2009-09-28 18:48:56
【问题描述】:
通过不同的线程(一个读线程和一个写线程)同时读写一个串口是否安全?是否有必要在每个线程中添加围绕读/写的锁定?
【问题讨论】:
标签: c# .net serial-port
通过不同的线程(一个读线程和一个写线程)同时读写一个串口是否安全?是否有必要在每个线程中添加围绕读/写的锁定?
【问题讨论】:
标签: c# .net serial-port
从不同线程“同时”读取和写入串行端口是处理串行端口通信的标准方式:一个线程处理读取,一个线程处理写入。可以接受。
有许多基于串行的设备会异步向主机发送数据,同时仍允许向设备本身发送命令:条码扫描仪、标签扫描仪和相机等设备。
有问题?
当您尝试同步与设备之间的通信时会出现问题。
例如,您想编写一个命令,然后立即读回任何响应。好吧,在这种情况下,您将暂停读取线程并在编写命令后手动读取所有串行端口数据。命令处理完毕后,读取线程可以重新启动。
总结
总的来说,我建议只使用一个额外的线程来处理端口数据的所有读取并触发事件,例如DataReceived,并从主线程执行所有写入。
【讨论】:
来自SerialPort的文档:
此类型的任何公共静态(在 Visual Basic 中为共享)成员都是线程安全的。不保证任何实例成员都是线程安全的。
由于读取和写入不是静态的,它们不会是线程安全的。无论如何,这是一个非常糟糕的主意,因为 SerialPort 类为您维护内部缓冲区。
您需要将 I/O 与串行端口同步。
【讨论】:
我希望您描述的特定情况下,1 个读取和 1 个写入线程是安全的。
硬件上的读取和写入通道设计为全双工使用,软件也应设计为支持该功能。
尽管我找不到关于此的明确声明,但MSDN Page for the SerialPort 上的示例也从主线程写入,同时读取另一个线程。没有锁定。
【讨论】: