Windows 和 Linux 上的串行端口之间的差异 - .NET/Mono

Joe*_*e_K 5 c# linux windows mono serial-port

我正在开发 ac# .NET 程序,最终将在 Linux 上的 Mono 中运行。我正在使用 Visual Studio 2017 在 Windows 10 上使用 C# 进行开发。准备就绪后,我会将其转移到运行最新 Mono (5.4) 的 Linux(Ubuntu 用于测试,Yocto 用于测试和部署)。

在应用程序中,我使用System.IO.Ports中的 2 个 COM 端口。没什么特别的。这些端口用于控制外部硬件。目前,COM 端口通过 USB 转 RS-232 适配器实现。

comDevice = new SerialPort();

if (isWindows())
{
    //- Windows
    comDevice.PortName = "COM15";
}
else
{
    //- Linux
    comDevice.PortName = "/dev/ttyUSB0";
}

comDevice.BaudRate = 19200;
comDevice.DataBits = 8;
comDevice.Parity = Parity.None;
comDevice.StopBits = StopBits.One;
comDevice.Handshake = Handshake.None;
comDevice.ReadBufferSize = 1024;
Run Code Online (Sandbox Code Playgroud)

没有什么花哨。非常基本的端口设置。

当我将设备连接到 Linux (Ubuntu 14.04 LTS) 盒子并使用终端程序 (PuTTY) 时,一切都按预期工作。我可以向其中一台设备发出 2 个命令:

  • 'O'——打开设备
  • “C”——关闭设备

当我打开设备时,设备会响应“O'OK”。当我关闭它时,我看到“C'OK”。当我发出命令让设备执行某些操作时,它会返回我期望的读数:

  • 'D'——执行编程事件

...设备发出蜂鸣声,并返回响应“D'23.215^0131”。

在 Windows 中,“O”和“C”命令在 PuTTY 和我的代码中似乎工作得很好。但是,当我发出“D”命令时,我会在设备发出蜂鸣声后得到“D”。我的代码、PuTTY 或我在 Windows 10 中尝试过的任何 COM 程序都没有返回任何其他数据。

我不认为这是 RTS/CTS 的事情。我没有看到这些线连接在适配器中。我确实让我的应用程序将它们的状态转储到我的日志文件中,以防万一。

我想我可能是错的,但感觉 Linux COM 端口正在自动“做某事”,而 Windows 端口正在等待我手动做。我想知道是否有其他人使用 COM 端口完成过任何 Windows/Linux Mono 工作,并且可能知道一些我不知道的事情?

如果有人能指出正确的方向,告诉我在 Windows 中必须考虑哪些属性,而这些属性在 Linux/Mono 中可能是默认的,那会有很大帮助。