通过测试,我发现两台笔记本电脑拒绝通过.Net SerialPort对象进行通信。我应该首先说应用程序正在使用.Net 4.0。这是设置:
以下是在使用之前如何初始化对象:
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
可能导致此问题的原因,以及如何阻止它呢?
答案 0 :(得分:2)
在我为不同的项目做一些研究时,我似乎找到了解决这个问题的方法。我在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后,无握手的通信开始工作。但是,可执行文件必须以管理员身份运行,否则我将收到拒绝访问的消息。