我正在编写一个Windows服务,用于与串行磁条读卡器和继电器板(门禁系统)通信。
当另一个程序打开与我的服务相同的串口时,我会遇到代码停止工作(我得到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会导致我的磁条阅读器启动(等待1秒),关闭(等待1秒)等等。
If I launch HyperTerminal and connects to the same COM port, HyperTerminal tells me the port is currently in use. If i repeatedly press ENTER in HyperTerminal, to try to reopen the port it will succeed after a few retries.
这会导致我的工作线程产生IOExceptions,这是预期的。然而,即使我关闭HyperTerminal,我仍然会在工作线程中得到相同的IOException。唯一的解决方法是重启计算机。
其他程序(不使用.NET库进行端口访问)此时似乎正常工作。
有什么想法是造成这种情况的原因吗?