Estoy escribiendo un Servicio de Windows para la comunicación con un lector Serial Mag-stripe y una placa de relés (sistema de control de acceso).¿Cómo hacer una programación sólida de SerialPort con .NET/C#?
Me encuentro con problemas donde el código deja de funcionar (obtengo IOExceptions) después de que otro programa ha "interrumpido" el proceso abriendo el mismo puerto serie que mi servicio.
parte del código es el siguiente:
public partial class Service : ServiceBase
{
Thread threadDoorOpener;
public Service()
{
threadDoorOpener = new Thread(DoorOpener);
}
public void DoorOpener()
{
while (true)
{
SerialPort serialPort = new SerialPort();
Thread.Sleep(1000);
string[] ports = SerialPort.GetPortNames();
serialPort.PortName = "COM1";
serialPort.BaudRate = 9600;
serialPort.DataBits = 8;
serialPort.StopBits = StopBits.One;
serialPort.Parity = Parity.None;
if (serialPort.IsOpen) serialPort.Close();
serialPort.Open();
serialPort.DtrEnable = true;
Thread.Sleep(1000);
serialPort.Close();
}
}
public void DoStart()
{
threadDoorOpener.Start();
}
public void DoStop()
{
threadDoorOpener.Abort();
}
protected override void OnStart(string[] args)
{
DoStart();
}
protected override void OnStop()
{
DoStop();
}
}
Mi programa de ejemplo comienza con éxito el trabajo de rosca, y la apertura/cierre y elevación de DTR hace que mi lector de banda magnética para encender (espere 1 segundo), apague (espere 1 segundo) y así sucesivamente.
Si abro HyperTerminal y me conecto al mismo puerto COM, HyperTerminal me dice que el puerto está actualmente en uso. Si presiono repetidamente ENTRAR en HyperTerminal, para intentar reabrir el puerto tendrá éxito después de unos pocos intentos.
Esto tiene el efecto de causar IOExceptions en mi hilo de trabajo, que se espera. Sin embargo, incluso si cierro HyperTerminal, todavía obtengo la misma IOException en mi hilo de trabajo. La única cura es en realidad reiniciar la computadora.
Parece que otros programas (que no utilizan las bibliotecas .NET para acceso a puertos) funcionan normalmente en este punto.
¿Alguna idea de qué está causando esto?
@Zach Saw: Gran artículo que escribió , ¿podría desafiarlo a que prepare una muestra de trabajo para borrar fAbortOnError? :) –
@thomask: Claro. Escribiré algo rápidamente y lo publicaré como un artículo de seguimiento más tarde. –
Aquí está el código. http://zachsaw.blogspot.com/2010/07/serialport-ioexception-workaround-in-c.html –