【问题标题】:Is it safe to read and write to a serial port at the same time via different threads?通过不同的线程同时读取和写入串行端口是否安全?
【发布时间】:2009-09-28 18:48:56
【问题描述】:

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

【问题讨论】:

    标签: c# .net serial-port


    【解决方案1】:

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

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

    有问题?

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

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

    总结

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

    【讨论】:

    • Mike J,那将是 1 个 额外 线程。我假设你打算从主线程写?
    • 耶。一般来说,这是我发现可以接受的方法。但正如我发现的那样,问题真的在于读写的同步,这可能是一个彻头彻尾的痛苦:-)
    • @MikeJ 重新连接怎么样?我觉得需要一些读写器风格的锁定,从某种意义上说,只有重新打开连接需要锁定,而对于所有其他操作,只要没有重新连接,它们就可以正常完成。
    【解决方案2】:

    来自SerialPort的文档:

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

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

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

    【讨论】:

    • 但 SerialPort 是一种特殊情况,由软件和硬件中的单独读取和写入通道组成。使用 2 个读取线程需要锁定。
    • 是的 - 应该没问题,前提是您的阅读器线程从不写入,而您的写入器线程从不读取,但是 - 这是一个实现细节,文档没有明确说明这是允许的,所以从理论上讲,这可能会在 .NET 的未来版本中发生变化。此外,我不保证这是其他平台上的行为,例如如果您在 CF 上使用 SerialPort。我个人不会这样做,因为 API 的文档没有明确允许这样做。
    • 接受的答案是错误的。 MSDN 充满了缺失的细节。 MSDN 中没有明确提到线程安全这一事实可能只是意味着 Microsoft 的文档团队忘记提及它。在编写答案之前,您应该查看源代码。在内部,SerialPort 使用一个类 SerialStream,它使用 API CreateFile("\\.\COM1") 打开一个双向 COM 端口。使用 ReadFile() 读取数据并使用 WriteFile() API 写入数据。所以如果一个线程只写而另一个线程只读,SerialPort 绝对是线程安全的。
    • 现在,在原始答案十年之后,该链接没有引用的短语。相反,没有提及线程安全。
    • @Elmue 一个令人讨厌的人正在重新打开连接。它可以使正在进行的读取失败,但我认为重新打开没有一些可靠的行为。如果过早恢复使用 SerialPort,即使使用单线程也会遇到麻烦。
    【解决方案3】:

    我希望您描述的特定情况下,1 个读取和 1 个写入线程是安全的。

    硬件上的读取和写入通道设计为全双工使用,软件也应设计为支持该功能。
    尽管我找不到关于此的明确声明,但MSDN Page for the SerialPort 上的示例也从主线程写入,同时读取另一个线程。没有锁定。

    【讨论】:

    • 你“会”期望并且它“应该”被设计......这只是你的理论。这个答案没有帮助。您应该已经查看了 SerialPort 类的源代码。
    猜你喜欢
    • 2017-04-21
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    • 1970-01-01
    • 2017-05-08
    • 1970-01-01
    • 2020-04-27
    相关资源
    最近更新 更多