2013-02-01 210 views
1

我想通過/ 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代碼,我認爲最後一個可能證明最簡單的路線,但即使如此,我想了解這裏有什麼問題。

+0

也許這可以幫到您? http://www.advogato.org/person/tripp/diary.html – JCasso

+0

我認爲是這樣的。我使用usbserial_generic驅動程序,所以我不認爲我可以直接使用該修補程序。我以前也發現[this](http://lists.ximian.com/pipermail/mono-list/2008-January/037643.html)錯誤報告,這似乎是同樣的事情。問題是我不知道TIOCMGET應該在哪裏實施。或者如何實現它,但是在這個階段這有點有意義。 – rorold

回答

1

閱讀您的評論:是的,你可以調用C代碼沒有問題,你會發現很多的例子here。儘管如此,你也可以使用UnixStream類這樣的方式:

using System; 
using Mono.Unix.Native; 
using Mono.Unix; 

namespace Test719 
{ 
    class MainClass 
    { 
     public static void Main(string[] args) 
     { 
      var fd = Syscall.open("/dev/ttyUSB0", OpenFlags.O_RDWR); 
      var stream = new UnixStream(fd); 

      stream.ReadByte(); // and so on 
     } 
    } 
} 

希望這會幫助你的。

+0

這看起來很有希望 - 當我有機會時,我會嘗試一下。 – rorold

+0

我花了一點時間尋找Mono.Unix,因爲我的項目中沒有提及Mono.Posix,這是Unix和Unix.Native所在的項目。但是,它不像Stream.ReadByte()那樣拋出任何比SerialPort()更多的異常,並且值得讚賞。 – rorold

+0

謝謝。它的性質應該與C代碼類似,因此你應該能夠達到與前者相同的目標:) –