.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
是什么导致了这个问题,我能做些什么来阻止它?
我似乎在为另一个项目做研究时找到了这个问题的解决方案。我在Arduino论坛上偶然发现了一篇帖子,有人对Atmega32U4(它有一个适当的USART(有类似的问题。
似乎SerialPort
有两个性质我忽略了——SerialPort.DtrEnable
和SerialPort.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,不需要握手的通信就开始工作。但是,该可执行文件必须以管理员身份运行,否则我将收到拒绝访问的消息。