2009-01-12 60 views
3

我打算在.NET中重新編寫Win32應用程序(本地C++) - 很可能使用單聲道,因此我可以在Win32,Linux和Mac上運行它。我試圖解決的問題(僅針對Win32開發)是串口定義的問題。當只有一個可執行文件時,如何識別平臺的差異。具體來說,COM端口在Windows中被識別爲COM1或類似的東西(\。\ COM),但在linux上它們被指定爲/ dev/ttyS0之類的東西。Mono中的多個平臺的串行端口(rs232)

是否有人在運行時檢查平臺上的這些信息?

我認爲唯一的區別是在港口的開放和關閉。閱讀和寫作是一樣的。

也許這是一個更通用的問題,因爲它適用於mono/.NET中任何平臺特定的東西。

你是如何處理這個問題的?在某些字符串資源或配置文件中,或基於運行時平臺的硬編碼和開關?

這個任何代碼示例?請注意,C++開發人員並不熟悉.NET中可用的所有類。有沒有辦法從CLR獲取串行端口命名方案,還是有辦法從CLR獲取OS/Platform?

對於CLR能夠以更獨立的方式呈現串行端口,本來是不錯的。也許這是不可能的。

感謝, 添

編輯

給出的反應到目前爲止,我想我應該只是嘗試了
SerialPort.GetPortNames()枚舉先來看看它是否工作。 (在兩個平臺上)

在win32中用於較高端口號和USB加密狗 - 它不像基本的COM端口枚舉那麼簡單。

我會在這裏報告調查結果。

回答

1

剛剛發現這個線程,並認爲我有啥可只加我的發現:隨機,我也擔心這個在Mac上。在Windows和Linux中(在VS和Mono中)SerialPort。GetPortNames()按照以下規則返回一個列表:

1)Windows返回一個像Com1,Com4這樣的字符串列表,並丟失任何不存在的字符串(USB串行適配器似乎根據塞將其插入,consistantly)從我的串行端口掃描器:

Scanning COM1 Scanning COM4 Scanning Complete

2)Linux的返回所有可能的Linux發行版的編譯器,使TTY串行端口。這似乎是約8端口,如果你試圖打開,將拋出一個異常(從我的串行端口掃描器:

Scanning /dev/ttyS0 Scanning /dev/ttyS1 Port FailedSystem.IO.IOException: I/O Error at System.IO.Ports.SerialPortStream..ctor (System.String portName, Int32 baudRate, Int32 dataBits, Parity parity, StopBits stopBits, Boolean dtrEnable, Boolean rtsEnable, Handshake handshake, Int32 readTimeout, Int32 writeTimeout, Int32 readBufferSize, Int32 writeBufferSize) [0x00000] at (wrapper remoting-invoke-with-check) System.IO.Ports.SerialPortStream:.ctor (string,int,int,System.IO.Ports.Parity,System.IO.Ports.StopBits,bool,bool,System.IO.Ports.Handshake,int,int,int,int) at System.IO.Ports.SerialPort.Open() [0x00000] at (wrapper remoting-invoke-with-check) System.IO.Ports.SerialPort:Open() at HSMScanner.Program.Main (System.String[] args) [0x00000] Scanning /dev/ttyS2 Port FailedSystem.IO.IOException: I/O Error at System.IO.Ports.SerialPortStream..ctor (System.String portName, Int32 baudRate, Int32 dataBits, Parity parity, StopBits stopBits, Boolean dtrEnable, Boolean rtsEnable, Handshake handshake, Int32 readTimeout, Int32 writeTimeout, Int32 readBufferSize, Int32 writeBufferSize) [0x00000] at (wrapper remoting-invoke-with-check) System.IO.Ports.SerialPortStream:.ctor (string,int,int,System.IO.Ports.Parity,System.IO.Ports.StopBits,bool,bool,System.IO.Ports.Handshake,int,int,int,int) at System.IO.Ports.SerialPort.Open() [0x00000] at (wrapper remoting-invoke-with-check) System.IO.Ports.SerialPort:Open() at HSMScanner.Program.Main (System.String[] args) [0x00000] Scanning /dev/ttyS3 Port FailedSystem.IO.IOException: I/O Error at System.IO.Ports.SerialPortStream..ctor (System.String portName, Int32 baudRate, Int32 dataBits, Parity parity, StopBits stopBits, Boolean dtrEnable, Boolean rtsEnable, Handshake handshake, Int32 readTimeout, Int32 writeTimeout, Int32 readBufferSize, Int32 writeBufferSize) [0x00000] at (wrapper remoting-invoke-with-check) System.IO.Ports.SerialPortStream:.ctor (string,int,int,System.IO.Ports.Parity,System.IO.Ports.StopBits,bool,bool,System.IO.Ports.Handshake,int,int,int,int) at System.IO.Ports.SerialPort.Open() [0x00000] at (wrapper remoting-invoke-with-check) System.IO.Ports.SerialPort:Open() at HSMScanner.Program.Main (System.String[] args) [0x00000]

3)蘋果電腦......

哦,親愛的哦,親愛的。 Macs(當插入USB串行端口和驅動程序並一切正常時)不會在GetPortNames()上返回什麼。納達。在/ dev/tty中,額外的設備只有在插入設備時纔會出現,並且名稱很不幸,例如/dev/tty.usbserial-A7006Ro7,使用該名稱作爲程序的參數,然後是serial.open dosnt似乎有什麼影響。

展望更多。

+0

感謝您的加入。該項目已經停滯,因爲我沒有從想要使用Mac或Linux的用戶那裏得到很多反饋。我曾以爲會有,但到目前爲止,這個項目只是爲了我的好奇心。 – Tim 2009-05-14 18:45:48

4

在.Net中,您需要System.IO.Ports。像「COM1」和「/ dev/ttyS0」這樣的名稱是隨機的操作系統名稱。你爲什麼需要對它們進行硬編碼?用戶應該從可用端口列表中選擇一個。

顯然,您在運行時確定此列表。實際上,對於USB轉串口適配器,您可能需要考慮用戶在啓動程序後發現他忘記連接USB轉串口適配器的可能性。這意味着每次顯示配置對話框時都應該重讀這個列表。 USB適配器很可能不是COM1,BTW。

(我不能保證單聲道實施的SerialPort的質量。快速谷歌搜索給我留下了有點擔心,但自己測試)

+0

是,關於Linux和單這個「令人不安的」位是這樣的我問的原因。我應該嘗試一下枚舉,看看它是否有效。 – Tim 2009-01-12 14:48:59

2

我看了一下,看起來用於枚舉串行端口的單聲道代碼不適用於Linux以外的任何其他程序。

(從MCS /班/系統/ System.IO.Ports/SerialPort.cs)

  public static string [] GetPortNames() 
      { 
        int p = (int) Environment.OSVersion.Platform; 
        List<string> serial_ports = new List<string>(); 

        // Are we on Unix? 
        if (p == 4 || p == 128 || p == 6) { 
          string[] ttys = Directory.GetFiles("/dev/", "tty*"); 
          foreach (string dev in ttys) { 
            if (dev.StartsWith("/dev/ttyS") || dev.StartsWith("/dev/ttyUSB")) 
              serial_ports.Add(dev); 
          } 
        } else { 

在OSX我會認爲你很可能匹配/dev/tty.*(FreeBSD的需要的/ dev/ttyU [0-9] +)

我不能說我迷戀它選擇哪個操作系統它的下運行要麼..