我打算在.NET中重写Win32应用程序(本机C ++) - 很可能使用单声道,所以我可以在Win32,Linux和Mac上运行它。我试图解决的问题(仅为Win32开发)是串口定义的问题。当只有一个可执行文件时,通常如何识别平台中的差异。具体来说,COM端口在Windows中被标识为COM1或类似的东西(\。\ COM),但在linux上它们被指定为/ dev / ttyS0。

是否有人在运行时检查平台以获取此信息?

我认为唯一的区别在于港口的开启和关闭。阅读和写作是一样的。

也许这是一个更通用的问题,因为它适用于mono / .NET中任何特定于平台的东西。

你怎么处理这个?在某些字符串资源或配置文件中,还是基于运行时平台进行硬编码和切换?

这是什么代码示例?注意我是一名C ++开发人员,不熟悉.NET中可用的所有类。有没有办法从CLR获得串行端口命名方案,或者有办法从CLR获取OS /平台?

CLR能够以更独立的方式呈现串行端口会很不错。也许这是不可能的。

谢谢, 添

修改

鉴于到目前为止的一个回复,我想我应该尝试一下
SerialPort.GetPortNames()枚举首先查看它是否有效。 (在两个平台上)

在win32中获取更高端口号和USB加密狗 - 它不像基本COM端口枚举那么简单。

我将在此报告调查结果。

有帮助吗?

解决方案

刚刚发现了这个帖子,并认为我只想添加我的发现:随机,我也在mac上担心这个问题。在Windows和Linux中(在VS和Mono中),SerialPort.GetPortNames()返回一个列表,其中包含以下规则:

1)Windows返回一个字符串列表,如Com1,Com4,错过任何不存在的字符串(USB串口适配器似乎根据插入的插头取得一个COM号码,一致)从我的串口扫描仪:

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 ......

亲爱的,亲爱的,亲爱的。 Mac(当插入USB串口并且驱动程序和一切正常时)不会在GetPortNames()上返回任何。纳达。查看/ dev / tty,额外的设备只在设备插入时显示,并且名称如/dev/tty.usbserial-A7006Ro7,不幸的是,使用此名称作为程序的参数,后跟serial.open dosnt似乎有任何影响。

进一步了解它。

其他提示

在.Net中,您需要System.IO.Ports。名称如<!>“; COM1 <!>”;和<!> quot; / dev / ttyS0 <!> quot;是随机的OS名称。你为什么需要对它们进行硬编码?用户应该从可用端口列表中选择一个。

显然,您在运行时确定此列表。实际上,使用USB转串口适配器时,您可能需要考虑用户在启动程序后发现忘记连接USB转串口适配器的可能性。这意味着每次显示配置对话框时都应重新阅读此列表。 USB适配器很可能不是COM1,BTW。

(我不能保证SerialPort的Mono实现的质量。快速谷歌搜索让我有点担心,但测试自己)

我看了一下,看起来枚举串口的单声道代码除了Linux之外什么都不起作用。

(来自mcs / class / System / 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] +)

我不能说我很喜欢它选择运行哪个操作系统的方式..

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top