Я пишу службу Windows для связи с считывателем Serial Mag-stripe и релейной панелью (системой контроля доступа).
Я сталкиваюсь с проблемами, когда код перестает работать (я получаю IOExceptions) после того, как другая программа "прервала" процесс, открыв тот же последовательный порт, что и моя служба.
Часть кода выглядит следующим образом:
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();
}
}
Моя пробная программа успешно запускает рабочую нить, а открытие/закрытие и повышение DTR заставляет мой считыватель Mag-stripe включать (ждать 1сек), выключать (ждать 1 сек) и т.д.
Если я запустил HyperTerminal и подключился к тому же COM-порту, HyperTerminal сообщит, что порт используется. Если я повторно нажимаю ENTER в HyperTerminal, чтобы попытаться снова открыть порт будет успешным после нескольких попыток.
Это приводит к вызову IOExceptions в моем рабочем потоке, который ожидается. Однако, даже если я закрываю HyperTerminal, я все равно получаю то же самое IOException в своей рабочей нити. Единственное средство - фактически перезагрузить компьютер.
Другие программы (которые не используют библиотеки .NET для доступа к портам), как представляется, работают нормально на этом этапе.
Любые идеи относительно того, что вызывает это?