我必须通过FTDI RS485连接器(具有通常的comport软件接口(interface))在Mono中与设备进行通讯,波特率为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上在Windows上上运行相同的代码时,它成功地与设备通信并收到与python相同的消息。
那么在Mono上SerialPort有什么收获呢?我会错过某些设置或配置吗?
最佳答案
发现在mono上读取FTDI设备的问题是由bug with baud rate引起的。
错误的想法:如果设置的波特率大于921600,则实际波特率设置为9600。
有趣的是(如果您浪费时间试图弄清为什么无法与Mono上的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);
hack并不是很漂亮,但是最终FTDI Modem可以在Mono + Linux和.Net + Windows上运行。
其他解决方法可能是实现自己的串行端口包装器并P调用它,或者按照@skolima建议修复单色错误。
如果波特率不是ASCII,则更新,因此不能使用stty,可以将python用作解决方案。请参阅下面的评论。感谢@Dorian Scholz。
关于c# - 在Mono Linux上使用SerialPort出现高波特率错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13206524/