簡體   English   中英

在Mono Linux上使用SerialPort出現高波特率錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM