Esto es cómo 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 tarde
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();
}
Me esperaba una solución más 'elegante' ... pero cuando todo lo demás falla ' ¡use cualquier medio posible para que el programa funcione! –
Para que quede claro para alguien que no conoce el comportamiento de SerialPort, la respuesta anterior no usa el puerto. Abrir que solo comprueba si el CALLER ha abierto el puerto, no si, por ejemplo, otra aplicación lo tiene, para eso intenta comunicarse a través el puerto debe ser hecho y una excepción lanzada - puerto en uso, acceso denegado. – Ken