[英]Error with high baud rates using SerialPort on Mono Linux
我必須以1000000波特率通過FTDI RS485連接器(具有通常的comport軟件接口)在Mono中與設備進行通信。 操作系統-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相同的消息。
那么在Mono上SerialPort有什么收獲呢? 我會錯過某些設置或配置嗎?
發現在單聲道上讀取FTDI設備的問題是由波特率錯誤引起的。
錯誤的想法:如果設置的波特率大於921600,則實際波特率設置為9600。
有趣的是(如果您浪費時間試圖找出為什么無法與Mono上的SerialPort通信的原因),這與一個較舊的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。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.