.Net SerialPort对象获胜';不要交流

本文关键字:SerialPort 对象 获胜 Net | 更新日期: 2023-09-27 18:01:05

通过测试,我发现两台笔记本电脑拒绝通过.Net SerialPort对象进行通信。我可能应该先说应用程序正在使用.Net 4.0。这是设置:

  • 两台笔记本电脑都使用这些串行端口与Tera Term通信
  • 主板上的内部串行端口或任何USB串行端口模拟器上都没有通信
  • 正在测试的端口已在使用中
  • 未触发任何异常
  • 该软件可以打开COM端口,但不能传输任何数据
  • 未调用ErrorReceived事件处理程序

以下是对象在使用前的初始化方式:

serialPort = new SerialPort();
serialPort.PortName = SelectSerialPort.GetSerialPort();
serialPort.BaudRate = 9600;
serialPort.Parity = Parity.None;
serialPort.DataBits = 8;
serialPort.StopBits = StopBits.One;
serialPort.Handshake = Handshake.RequestToSend;
serialPort.ReadTimeout = 10000;
serialPort.WriteTimeout = 1000;
serialPort.ErrorReceived += OnSerialError;

这个设置已经在至少20台其他计算机上进行了测试,它运行得很好。要写入端口,我只需调用:

serialPort.Write(packet, 0, nBytes);

其中,数据包是byte[],nBytes是要发送的数据的长度。写入超时似乎是被触发的,因为软件将打开串行端口,延迟后端口关闭而不传输任何数据。

我能够用串行端口监视器捕获以下日志。第一个日志是我期望看到的,打开并配置COM端口,然后发送数据。第二个日志来自其中一台笔记本电脑。您可以看到端口打开,但端口只是关闭,没有传输任何内容。

我注意到日志文件中有两个主要区别。笔记本电脑的日志包含RTS off,而好的日志不包含。此外,笔记本电脑的日志似乎将写入超时设置为零。在好日志中:

Set timeouts: ReadInterval=-1, ReadTotalTimeoutMultiplier=-1, ReadTotalTimeoutConstant=10000, WriteTotalTimeoutMultiplier=0, WriteTotalTimeoutConstant=1000

笔记本电脑的日志:

Set timeouts: ReadInterval=-1, ReadTotalTimeoutMultiplier=-1, ReadTotalTimeoutConstant=-2, WriteTotalTimeoutMultiplier=0, WriteTotalTimeoutConstant=0

是什么导致了这个问题,我能做些什么来阻止它?

.Net SerialPort对象获胜';不要交流

我似乎在为另一个项目做研究时找到了这个问题的解决方案。我在Arduino论坛上偶然发现了一篇帖子,有人对Atmega32U4(它有一个适当的USART(有类似的问题。

似乎SerialPort有两个性质我忽略了——SerialPort.DtrEnableSerialPort.RtsEnable

获胜的组合似乎是以下配置:

serialPort = new SerialPort();
serialPort.PortName = SelectSerialPort.GetSerialPort();
serialPort.BaudRate = 9600;
serialPort.Parity = Parity.None;
serialPort.DataBits = 8;
serialPort.StopBits = StopBits.One;
serialPort.Handshake = Handshake.None;
serialPort.DtrEnable = true;
serialPort.RtsEnable = true;
serialPort.ReadTimeout = 10000;
serialPort.WriteTimeout = 1000;
serialPort.ErrorReceived += OnSerialError;

一旦这两个属性被设置为true,不需要握手的通信就开始工作。但是,该可执行文件必须以管理员身份运行,否则我将收到拒绝访问的消息。