我想通過/ dev/ttyUSB0使用串口與USB設備通話。爲什麼SerialPort.Open()失敗?
到目前爲止,我已經使用modprobe使其顯示爲USB0,chmod允許讀寫,而不需要根目錄,並且我有一個實際上可以工作的C庫(稱爲Gant)。但是,我想將它與現有的應用程序集成在一起,該應用程序最初是在C#中爲.Net開發的,但是(希望)很快會在使用mono的Linux上運行。
C代碼使用open("/dev/ttyUSB0")
獲取文件描述符,然後使用read()
和write()
直接與USB設備交談。
C#中的等價物,據我所看到的,將是這樣
SerialPort sp = new SerialPort("/dev/ttyUSB0");
sp.Open();
但給出了一個IOException: Invalid argument at System.IO.Ports.SerialPortStream.SetSignal (SerialSignal signal, Boolean value) [0x00000] in <filename unknown>:0
我已經嘗試了不同組的論據new SerialPort()
以及設定值隨後像sp.BaudRate = 115200
之類的東西,但因爲我不知道究竟是什麼導致了錯誤,所以我必須非常幸運地通過嘗試不同的組合來排序。
從單一的源代碼有點看起來像被稱爲產生錯誤的函數四處是set_signal (fd, signal, value)
set_signal是外部,聲明如下:
[DllImport ("MonoPosixHelper", SetLastError = true)]
static extern int set_signal (int fd, SerialSignal signal, bool value);
據我瞭解,fd是像在C代碼一個文件描述符,SerialSignal是一個枚舉:
enum SerialSignal {
None = 0,
Cd = 1, // Carrier detect
Cts = 2, // Clear to send
Dsr = 4, // Data set ready
Dtr = 8, // Data terminal ready
Rts = 16 // Request to send
}
和布爾value
是否確定特定的SerialSignal是否被設置。
它似乎被調用兩次,一次設置Dtr,一次用於Rts。
因此,畢竟我的問題仍然是爲什麼這是失敗?可能有DTR和RTS的設備特定設置,我還沒有對嗎?它會工作,完全繞過單聲道代碼,並使用一些C外部(這是我認爲單聲道源無論如何,一旦它的水平足夠低)。我可以在C#單聲道項目中使用一些C代碼嗎?
由於我有工作C代碼,我認爲最後一個可能證明最簡單的路線,但即使如此,我想了解這裏有什麼問題。
也許這可以幫到您? http://www.advogato.org/person/tripp/diary.html – JCasso
我認爲是這樣的。我使用usbserial_generic驅動程序,所以我不認爲我可以直接使用該修補程序。我以前也發現[this](http://lists.ximian.com/pipermail/mono-list/2008-January/037643.html)錯誤報告,這似乎是同樣的事情。問題是我不知道TIOCMGET應該在哪裏實施。或者如何實現它,但是在這個階段這有點有意義。 – rorold