如何修改 Windows C# 代码以在 Linux 中从单声道串行端口读取?

How to modify Windows C# code to read from a serial port in mono in Linux?

我正在尝试将用 C# 为 Windows 系统编写的服务移植到 Linux,目的是完全替换 Windows。 Windows 和 Linux 环境中的硬件保持相同。

到目前为止一切顺利 - 我已经安装了 Mono-complete,修改了那些需要修改的位以阻止它寻找 Nuget,编译软件时只有表面错误,运行 它带有 mono-服务并已与串行端口建立通信。

这就是事情开始出错的地方。

我可以打开该端口,并且可以向该端口发送一条消息,从而得到正确的响应。

通过 运行ning 'cat /dev/ttyUSB0' 我看到端口的正确响应 - 符号 @

然而,符号根本没有被软件读取,我每次都超时。

除了打开端口“/dev/ttyUSB0”而不是 'COM1'(或它需要的任何端口)之外,我没有对代码进行任何更改。

为什么串口只能写,不能读?

我试过弄乱返回位的编码,我认为这可能是大端/小端问题,但它正确地将信号发送到设备("M2" - 没有引号).

Return 通信看起来也不错 - cat /dev/ttyUSB0 显示返回了一系列“@”符号,每个符号占一行。

虽然没有发生什么是软件然后读取这个,而是它正在等待响应超时。

我想知道这是否可能是一个换行符问题 - 但为什么它会在 Windows 系统上按原样工作,为什么它会非常愉快地发送(换行符当前明确设置为 '\r\n')

我是否遗漏了 Linux 的特定内容?

我知道这有点晚了,但我已经把这个项目搁置了一段时间,现在才把它捡起来。

事实证明,问题出在 mono 没有触发 DataReceivedEvents,所以当从 Windows.Net 移植的代码遇到监听它们时,它们没有被拾取,因为它们没有被触发.

我通过生成一个新线程来克服这个问题,该线程的唯一目的是监听端口,当 serialPort.BytesToRead 大于 0 运行 时,任何代码都会 运行事件触发。