gpt4 book ai didi

c# - 在 Mono Linux 上使用 SerialPort 时出现高波特率错误

转载 作者:太空狗 更新时间:2023-10-29 11:46:11 26 4
gpt4 key购买 nike

我必须通过 FTDI RS485 连接器(具有常用的 comport 软件接口(interface))以 1000000 波特率与设备进行单声道通信。操作系统 - Linux(Ubuntu...特别是 Mint13),单声道 2.10.2。

首先我在 Linux 上运行简单的 python 测试程序:

 >> import serial
>> ser = serial.Serial("/dev/ttyUSB0",1000000, timeout=0.5)
>> ser.write(":DCS3FF8;") # Some message to the device with crc
>> ser.readall()
':CDS P0 M0 E0 L1 S07B3B;' #This is the correct response from the device

>> print ser
Serial<id=0x2ce71d0, open=True>(port='/dev/ttyUSB0', baudrate=1000000, bytesize=8, parity='N', stopbits=1, timeout=0.5, xonxoff=False, rtscts=False, dsrdtr=False)

设备正确响应。一切正常。这表明在 Linux 上一切正常。

然后我退出 python 并尝试通过代码使用 Mono:

     var serialPort = new SerialPort();
serialPort.PortName = "/dev/ttyUSB0";
serialPort.BaudRate = 1000000;

serialPort.Open();
serialPort.Write(":DCS3FF8;");
Thread.Sleep(150);
Console.WriteLine("BytesToRead: '{0}'", serialPort.BytesToRead);
Console.WriteLine("Existing : '{0}'", serialPort.ReadExisting());

编译运行命令:

     dmcs serial_try.cs && mono serial_try.exe

并获取 TimeoutException,serialPort.BytesToRead 为 0。与此同时,我看到连接器双灯闪烁(有东西正在传输)。

当我在 Windows 的 .NET 上运行相同的代码时,它成功地与设备通信并收到与 python 相同的消息。

那么单声道上的 SerialPort 有什么问题?我是否遗漏了某些设置或配置?

最佳答案

在单声道上读取FTDI设备的问题被发现是由bug with baud rate引起的.

错误的想法:如果设置的波特率大于 921600,则实际波特率设置为 9600。

有趣的是(如果你浪费时间试图找出为什么你不能在单声道上与 SerialPort 通信),这与 older bug 有关.其中声明不可能设置波特率 921600。所以看起来这个错误一直修复到 921600 而不是更高一点。

要解决此错误,可以在端口打开后调用 stty 来设置实际波特率。所以添加这个函数:

    private void ForceSetBaudRate(string portName, int baudRate)
{
if (Type.GetType ("Mono.Runtime") == null) return; //It is not mono === not linux!
string arg = String.Format("-F {0} speed {1}",portName , baudRate);
var proc = new Process
{
EnableRaisingEvents = false,
StartInfo = {FileName = @"stty", Arguments = arg}
};
proc.Start();
proc.WaitForExit();
}

并在串行打开后立即调用:

    _serialPort.PortName = PortName;
_serialPort.BaudRate = BaudRate;
_serialPort.Open();
ForceSetBaudRate(PortName, BaudRate);

黑客并不漂亮,但最终 FTDI 调制解调器可以在 Mono + Linux 和 .Net + Windows 上运行。

其他解决方法可能是实现您自己的串行端口包装器并调用它,或者按照@skolima 的建议修复单声道错误。

更新 如果波特率不是ASCII 所以不能使用stty,可以使用python 作为解决方案。请参阅下面的评论。感谢@Dorian Scholz。

关于c# - 在 Mono Linux 上使用 SerialPort 时出现高波特率错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13206524/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com