visual studio serie serial recibir puertos puerto por net manejo enviar datos .net mono cross-platform clr serial-port

.net - studio - serial port visual basic 6



Puerto serie(rs232) en Mono para mĂșltiples plataformas (3)

Estoy planeando volver a escribir una aplicación Win32 (C ++ nativo) en .NET, muy probablemente usando mono para poder ejecutarlo en Win32, Linux y Mac. El problema que estoy tratando de resolver (que realmente se desarrolló para Win32) es un problema con la definición del puerto serie. ¿Cómo se identifican típicamente 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.

¿Uno verifica la plataforma en tiempo de ejecución para esta información?

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

Quizás esta sea una pregunta más genérica en cuanto a que se aplica a cualquier cosa específica de la plataforma en mono / .NET.

Como manejas esto? ¿En algún recurso de cadena o archivo de configuración, o codificado de forma rígida y basado en la plataforma de tiempo de ejecución?

¿Algun ejemplo 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 forma de obtener el esquema de nombres de puertos en serie del CLR o hay alguna forma de obtener el OS / Platform del CLR?

Hubiera sido bueno para el CLR haber podido presentar los puertos serie de una manera más independiente. Tal vez eso no es posible.

Gracias, Tim

EDITAR

Dada la única 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 en el dongle USB, no es tan simple como la enumeración del puerto COM básico.

Informaré los hallazgos aquí.


En .Net, necesita System.IO.Ports. Los nombres como "COM1" y "/ dev / ttyS0" son nombres de sistemas operativos al azar. ¿Por qué necesitas codificarlos? El usuario solo debe 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. El adaptador USB es bastante probable que 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 ponte a prueba)


Acabo de descubrir este hilo, y pensé que simplemente debía agregar mis descubrimientos: al azar, también estoy preocupado por esto en un 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 USB en serie parecen tomar un número COM basado en el conector en el que están enchufados, de forma constante) Desde mi escáner de puerto en serie:

Scanning COM1 Scanning COM4 Scanning Complete

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

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

Oh querido cariño. Mac (cuando un puerto serie usb está conectado y los controladores y todo está bien) no devuelve nada en GetPortNames (). Nada. Al mirar 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 argumento para el programa seguido de dosificación serial.open parecen tiene algún efecto.

Mirando más adentro.


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

(desde 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 el sistema operativo bajo el que funciona.