Pregunta

Estoy planeando reescribir una aplicación Win32 (C ++ nativo) en .NET, muy probablemente usando mono para poder ejecutarla en Win32, Linux y mac. El problema que estoy tratando de resolver (que realmente solo he desarrollado para Win32) es un problema con la definición del puerto serie. ¿Cómo se suele identificar las diferencias en la plataforma cuando se supone que solo hay un ejecutable? Específicamente, el puerto COM se identifica en Windows como COM1 o algo así (\. \ COM) pero en Linux se especifican como algo como / dev / ttyS0.

¿Se comprueba la plataforma en tiempo de ejecución para obtener esta información?

Creo que la única diferencia estaría en la apertura y cierre del puerto. La lectura y la escritura son lo mismo.

Quizás esta es una pregunta más genérica, ya que se aplica a cualquier material específico de la plataforma en mono / .NET.

¿Cómo manejas esto? ¿En algún recurso de cadena o archivo de configuración, o codificado y cambiar basado en la plataforma de tiempo de ejecución?

¿Alguna muestra de código para esto? Tenga en cuenta que soy un desarrollador de C ++ y no estoy familiarizado con todas las clases disponibles en .NET. ¿hay alguna manera de obtener el esquema de nomenclatura del puerto serie del CLR o hay una manera de obtener el sistema operativo / plataforma del CLR?

hubiera sido bueno para el CLR haber podido presentar los puertos seriales de una manera más independiente. Quizás eso no sea posible.

Gracias Tim

EDITAR

Dada la respuesta hasta ahora, creo que debería probar el
SerialPort.GetPortNames () enumeración primero para ver si funciona. (en ambas plataformas)

En win32 para los números de puerto más altos y para el dongle USB, no es tan simple como la enumeración básica de puertos COM.

Informaré los resultados aquí.

¿Fue útil?

Solución

Acabo de descubrir este hilo, y pensé que debía agregar mis descubrimientos: al azar, también estoy preocupado por esto en una Mac. En Windows y Linux (en VS y Mono por igual) SerialPort.GetPortNames () devuelve una lista, con las siguientes reglas:

1) Windows devuelve una lista de cadenas como Com1, Com4, omitiendo cualquiera que no exista (los adaptadores seriales USB parecen tomar un número COM basado en el enchufe en el que están enchufados) :

Escaneo COM1 Escaneo COM4 Escaneo completo

2) Linux devuelve todos los puertos serie posiblemente tty que el compilador de la distribución de Linux ha habilitado. Esto parece ser alrededor de 8 puertos, que si intenta abrir, arrojará una excepción (desde mi escáner de puerto serie:

Escaneo / dev / ttyS0 Escaneo / dev / ttyS1 Puerto FailedSystem.IO.IOExcepción: error de E / S   en 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 readBufferS) [0x00000]   en (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)   en System.IO.Ports.SerialPort.Open () [0x00000]   en (wrapper remoting-invoke-with-check) System.IO.Ports.SerialPort: Open ()   en HSMScanner.Program.Main (System.String [] args) [0x00000] Escaneo / dev / ttyS2 Puerto FailedSystem.IO.IOExcepción: error de E / S   en 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 readBufferS) [0x00000]   en (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)   en System.IO.Ports.SerialPort.Open () [0x00000]   en (wrapper remoting-invoke-with-check) System.IO.Ports.SerialPort: Open ()   en HSMScanner.Program.Main (System.String [] args) [0x00000] Escaneo / dev / ttyS3 FailedSystem.IO.IOException: error de E / S   en 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 readBufferS) [0x00000]   en (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)   en System.IO.Ports.SerialPort.Open () [0x00000]   en (wrapper remoting-invoke-with-check) System.IO.Ports.SerialPort: Open ()   en HSMScanner.Program.Main (System.String [] args) [0x00000]

3) Macs ...

Oh querido, querido. Macs (cuando un puerto serie usb está enchufado y los controladores y todo está bien) no devuelven nada en GetPortNames (). Nada Mirando en / dev / tty, los dispositivos adicionales aparecen solo cuando el dispositivo está enchufado y tiene nombres como /dev/tty.usbserial-A7006Ro7 desafortunadamente, usando este nombre como un argumento para el programa seguido de serial.open dosnt parece tener algún efecto

Buscando más en ello.

Otros consejos

En .Net, necesita System.IO.Ports. Nombres como " COM1 " y "/ dev / ttyS0" son nombres aleatorios del sistema operativo. ¿Por qué necesitas codificarlos? El usuario debería elegir uno de la lista de puertos disponibles.

Obviamente, usted determina esta lista en tiempo de ejecución. De hecho, con los adaptadores de USB a serie es posible que desee considerar la posibilidad de que el usuario descubra solo después de iniciar su programa que olvidó conectar su adaptador de USB a serie. Eso significa que debe volver a leer esta lista cada vez que muestre el cuadro de diálogo de configuración. Es muy probable que el adaptador USB no sea COM1, por cierto.

(No puedo garantizar la calidad de la implementación Mono de SerialPort. Una búsqueda rápida en Google me dejó un poco preocupado, pero pónganse a prueba)

He echado un vistazo a esto y parece que el código mono para enumerar puertos serie no funcionará en nada más que en Linux.

(de 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 {

En OSX, creo que probablemente podría coincidir con /dev/tty.* (FreeBSD necesitaría / dev / ttyU [0-9] +)

No puedo decir que estoy enamorado de la forma en que elige bajo qué sistema operativo se está ejecutando ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top