3

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

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

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

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

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

有任何代码示例吗?请注意,我是一名 C++ 开发人员,并不熟悉 .NET 中可用的所有类。有没有办法从 CLR 获取串行端口命名方案,或者有没有办法从 CLR 获取操作系统/平台?

如果 CLR 能够以更独立的方式呈现串行端口,那就太好了。也许那是不可能的。

谢谢,蒂姆

编辑

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

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

我将在这里报告调查结果。

4

3 回答 3

4

在 .Net 中,您需要 System.IO.Ports。“COM1”和“/dev/ttyS0”之类的名称是随机的操作系统名称。为什么需要对它们进行硬编码?用户应该从可用端口列表中选择一个。

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

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

于 2009-01-12T12:04:48.970 回答
3

我看了一下这个,似乎用于枚举串行端口的单声道代码除了 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]+)

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

于 2011-07-13T12:50:04.747 回答
1

刚刚发现了这个线程,并认为我应该添加我的发现:随机,我也担心在 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) 麦克斯...

哦亲爱的哦亲爱的。Mac(当插入 USB 串行端口并且驱动程序和一切正常时)不会在 GetPortNames() 上返回任何内容。纳达。在 /dev/tty 中查看,额外的设备仅在插入设备并具有 /dev/tty.usbserial-A7006Ro7 之类的名称时才会出现,不幸的是,使用此名称作为程序的参数,然后是 serial.open dosnt 似乎有什么影响。

更深入地研究它。

于 2009-05-14T16:21:01.833 回答