serial puerto leer c# .net serial-port

leer - C#comprueba si un puerto COM(serie) ya está abierto



serial port c# (4)

¿Existe una manera fácil de verificar mediante programación si un puerto COM en serie ya está abierto / en uso?

Normalmente usaría:

try { // open port } catch (Exception ex) { // handle the exception }

Sin embargo, me gustaría verificar programáticamente para poder intentar usar otro puerto COM o algo así.


La clase SerialPort tiene un método abierto , que arrojará algunas excepciones. La referencia anterior contiene ejemplos detallados.

Ver también, la propiedad IsOpen .

Una simple prueba:

using System; using System.IO.Ports; using System.Collections.Generic; using System.Text; namespace SerPort1 { class Program { static private SerialPort MyPort; static void Main(string[] args) { MyPort = new SerialPort("COM1"); OpenMyPort(); Console.WriteLine("BaudRate {0}", MyPort.BaudRate); OpenMyPort(); MyPort.Close(); Console.ReadLine(); } private static void OpenMyPort() { try { MyPort.Open(); } catch (Exception ex) { Console.WriteLine("Error opening my port: {0}", ex.Message); } } } }


Necesitaba algo similar hace algún tiempo, para buscar un dispositivo.

Obtuve una lista de puertos COM disponibles y luego simplemente repetí sobre ellos, si no arrojaba una excepción intenté comunicarme con el dispositivo. Un poco duro pero trabajando.

var portNames = SerialPort.GetPortNames(); foreach(var port in portNames) { //Try for every portName and break on the first working }


Puede intentar seguir el código para verificar si un puerto ya está abierto o no. Supongo que no sabes específicamente qué puerto quieres verificar.

foreach (var portName in Serial.GetPortNames() { SerialPort port = new SerialPort(portName); if (port.IsOpen){ /** do something **/ } else { /** do something **/ } }


Así es como lo hice:

[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] internal static extern SafeFileHandle CreateFile(string lpFileName, int dwDesiredAccess, int dwShareMode, IntPtr securityAttrs, int dwCreationDisposition, int dwFlagsAndAttributes, IntPtr hTemplateFile);

luego más adelante

int dwFlagsAndAttributes = 0x40000000; var portName = "COM5"; var isValid = SerialPort.GetPortNames().Any(x => string.Compare(x, portName, true) == 0); if (!isValid) throw new System.IO.IOException(string.Format("{0} port was not found", portName)); //Borrowed from Microsoft''s Serial Port Open Method :) SafeFileHandle hFile = CreateFile(@"//./" + portName, -1073741824, 0, IntPtr.Zero, 3, dwFlagsAndAttributes, IntPtr.Zero); if (hFile.IsInvalid) throw new System.IO.IOException(string.Format("{0} port is already open", portName)); hFile.Close(); using (var serialPort = new SerialPort(portName, 115200, Parity.None, 8, StopBits.One)) { serialPort.Open(); }