我的应用程序中有一个奇怪的行为。
我打开一个COM端口,通过蓝牙与设备通信。我执行以下步骤:
读取一个答案字节(来自SerialPort类的ReadByte());
设备工作正常并立即回答,当我通过visual studio以调试模式运行我的应用程序时一切正常。
但是当我尝试直接运行它时(没有使用visual studio和adebugger - 但仍然使用“Debug”选项编译)我在第6步得到超时异常。
该错误是完全可重现的(在Visual Studio中没有超时,每次都没有超时)。
有没有人有任何可能导致此类行为的想法?
以下是第6步的代码
private byte[] ReadResponse() {
try {
int bytes2Read = 6;
do {
this.buffer.Append((byte)ReadByte()); // <- there the timeout occurs
if (this.buffer.Length == 6) { // header receiver
// bytes 2 and 3 contain message length
bytes2Read = this.buffer[2] + (this.buffer[3] << 8);
}
} while (this.buffer.Length < bytes2Read);
return this.buffer.ToArray();
} finally {
this.buffer.Clear();
}
}
该方法位于派生自SerialPort类的类中。
答案 0 :(得分:2)
在调试时,您为端口驱动程序提供了大量时间来接收字节。在您跳过ReadByte()调用之前,超时计时器不会开始运行,驱动程序可能已经接收到该字节,因此ReadByte()会立即返回。当你全速奔跑时,这不会发生。
增加ReadTimeout属性的值。另请考虑使用DataReceived事件。
答案 1 :(得分:1)
某些虚拟COM端口似乎存在一个错误,在写入后会立即立即超时。您可以通过在写入后插入延迟(尝试10-20毫秒)来部分解决它,但我还没有找到一个好的解决方案。
Here is discussion on the bug in an ethernet-> RS232 virtual com port
答案 2 :(得分:0)
超时是SerialPort
的正常行为。它可以防止您的应用程序停止运行。
您应该能够修改ReadTimeout
属性以增加超时所需的时间。
http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.readtimeout.aspx
答案 3 :(得分:0)
听起来像是时间问题。在调试模式下,程序的运行速度比没有连接调试器的程序慢。必须有一个时间问题