C# .Net SerialPort对象赢了';无法沟通
通过测试,我发现两台笔记本电脑拒绝通过.Net SerialPort对象进行通信。我应该首先说应用程序正在使用.NET4.0。以下是设置:C# .Net SerialPort对象赢了';无法沟通,c#,.net-4.0,C#,.net 4.0,通过测试,我发现两台笔记本电脑拒绝通过.Net SerialPort对象进行通信。我应该首先说应用程序正在使用.NET4.0。以下是设置: 两台笔记本电脑都使用这些带有Tera术语的串行端口进行通信 主板上的内部串行端口或任何USB串行端口模拟器上都没有通信 正在测试的端口未在使用中 没有触发任何异常 软件可以打开COM端口,但不能传输任何数据 未调用ErrorReceived事件处理程序 以下是使用前如何初始化对象: serialPort = new SerialPort(); seria
- 两台笔记本电脑都使用这些带有Tera术语的串行端口进行通信
- 主板上的内部串行端口或任何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);
其中,packet是一个字节[]
,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,无握手的通信就开始工作。但是,该可执行文件必须以管理员身份运行,否则我将收到拒绝访问的消息。由于您的日志指出握手是一个问题,请在禁用握手的情况下重试。可能您的信号稍微超出RS-232可接受的电压范围,或者不接受整个范围。笔记本电脑上的端口比台式电脑上的端口更注重节能,所以可能在规格的较低电压范围内工作。