Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .Net SerialPort对象赢了';无法沟通_C#_.net 4.0 - Fatal编程技术网

C# .Net SerialPort对象赢了';无法沟通

C# .Net SerialPort对象赢了';无法沟通,c#,.net-4.0,C#,.net 4.0,通过测试,我发现两台笔记本电脑拒绝通过.Net SerialPort对象进行通信。我应该首先说应用程序正在使用.NET4.0。以下是设置: 两台笔记本电脑都使用这些带有Tera术语的串行端口进行通信 主板上的内部串行端口或任何USB串行端口模拟器上都没有通信 正在测试的端口未在使用中 没有触发任何异常 软件可以打开COM端口,但不能传输任何数据 未调用ErrorReceived事件处理程序 以下是使用前如何初始化对象: serialPort = new SerialPort(); seria

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

  • 两台笔记本电脑都使用这些带有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可接受的电压范围,或者不接受整个范围。笔记本电脑上的端口比台式电脑上的端口更注重节能,所以可能在规格的较低电压范围内工作。