我正在编写一个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的打开/关闭和升高使我的Mag-stripe读取器上电(等待1秒),关闭(等待1秒),依此类推.
如果我启动HyperTerminal并连接到同一个COM端口,HyperTerminal会告诉我该端口当前正在使用中.如果我在HyperTerminal中反复按ENTER键,尝试重新打开端口,它会在重试几次后成功.
这会导致我的工作线程中出现IOExceptions,这是预期的.但是,即使我关闭HyperTerminal,我仍然在我的工作线程中获得相同的IOException.唯一的办法是重启电脑.
其他程序(不使用.NET库进行端口访问)似乎在这一点上正常工作.
关于是什么导致这个的任何想法?
@thomask
是的,Hyperterminal确实在SetCommState的DCB中启用了fAbortOnError,这解释了SerialPort对象抛出的大多数IOExceptions.有些PC /手持设备也有UART,默认情况下会打开错误标志中止 - 所以串口的init例程必须清除它(微软忽略了这一点).我最近写了一篇长篇文章来更详细地解释这个问题(如果你有兴趣,请看这个).