我正在寫一個Windows服務與串行磁條閱讀器和中繼板(訪問控制系統)通信。如何使用.NET/C#進行健壯的SerialPort編程?
在另一個程序通過打開與我的服務相同的串行端口「中斷」進程後,我遇到代碼停止工作(我得到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端口,HyperTerminal告訴我該端口當前正在使用。如果我在超級終端中反覆按ENTER鍵,嘗試重新打開 端口,它將在幾次重試後成功。
這會導致在我的工作線程中產生IOExceptions,這是預期的。但是,即使關閉了超級終端,我仍然在我的工作線程中得到相同的IOException。唯一的辦法是重新啓動電腦。
其他程序(不使用.NET庫進行端口訪問)似乎此時正常工作。
任何想法是什麼造成這種情況?
不只是關閉它,也配置它! SerialPort實現IDisposable,所以你可能想使用(SerialPort serialPort = new SerialPort){/ * Daniel's code * /} – 2009-01-14 01:45:17
好點將編輯我的帖子 – trampster 2009-01-14 01:46:51
但是,這並不能解釋爲什麼我的應用程序拒絕打開端口被其他應用程序中斷後。還是呢? – 2009-01-14 01:52:05