gpt4 book ai didi

c# - 如何使用 .NET/C# 进行可靠的 SerialPort 编程?

转载 作者:IT王子 更新时间:2023-10-29 04:19:06 27 4
gpt4 key购买 nike

我正在编写一个 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 秒)等。

如果我启动 HyperTerminal 并连接到同一个 COM 端口,HyperTerminal 会告诉我该端口当前正在使用中。如果我在 HyperTerminal 中重复按 ENTER,尝试重新打开重试几次后它将成功的端口。

这会在我的工作线程中导致 IOExceptions,这是预期的。但是,即使我关闭 super 终端,我的工作线程中仍然会出现相同的 IOException。唯一的解决方法实际上是重新启动计算机。

此时其他程序(未使用 .NET 库进行端口访问)似乎正常工作。

关于造成这种情况的原因有什么想法吗?

最佳答案

@thomask

是的, super 终端确实在 SetCommState 的 DCB 中启用了 fAbortOnError,这解释了 SerialPort 对象抛出的大部分 IOExceptions。一些个人电脑/手持设备也有默认打开错误标志的 UART——因此串行端口的初始化例程必须清除它(微软忽略了这样做)。我最近写了一篇很长的文章来更详细地解释这一点(如果您有兴趣,请参阅 this)。

关于c# - 如何使用 .NET/C# 进行可靠的 SerialPort 编程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/441559/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com