我正在编写一个 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 秒)等等。
如果我启动超级终端并连接到同一个 COM 端口,超级终端会告诉我该端口当前正在使用中。如果我在超级终端中反复按 ENTER,尝试重新打开端口,它会在重试几次后成功。
这会在我的工作线程中导致 IOExceptions,这是预期的。但是,即使我关闭了超级终端,我的工作线程中仍然会收到相同的 IOException。唯一的治疗方法实际上是重新启动计算机。
其他程序(未使用 .NET 库进行端口访问)此时似乎可以正常工作。
关于造成这种情况的任何想法?