.Net SerialPort对象无法通信

时间:2014-04-30 18:47:11

标签: c# .net-4.0

通过测试,我发现两台笔记本电脑拒绝通过.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是要发送的数据的长度。似乎触发了写入超时,因为软件将打开串行端口并在延迟后关闭端口而不传输任何数据。

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

我注意到日志文件有两个主要区别。笔记本电脑的日志包含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

可能导致此问题的原因,以及如何阻止它呢?

1 个答案:

答案 0 :(得分:2)

在我为不同的项目做一些研究时,我似乎找到了解决这个问题的方法。我在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后,无握手的通信开始工作。但是,可执行文件必须以管理员身份运行,否则我将收到拒绝访问的消息。