[英].NET SerialPort Write/Read optimization
我有一个UART设备,正在向它写入命令(通过System.IO.Ports.SerialPort),然后该设备将立即响应。
所以基本上我的方法是:
->写入串行端口->等待Task.Delay->从端口读取。
//The port is open all the time.
public async byte[] WriteAndRead(byte[] message){
port.Write(command, 0, command.Length);
await Task.Delay(timeout);
var msglen = port.BytesToRead;
if (msglen > 0)
{
byte[] message = new byte[msglen];
int readbytes = 0;
while (port.Read(message, readbytes, msglen - readbytes) <= 0)
;
return message;
}
这在我的计算机上工作正常。 但是,例如,如果我在另一台计算机上尝试使用,则bytesToRead属性有时会不匹配。 其中有空字节或答案未完成。 (例如,如果我希望一个字节,则得到两个字节:0xBB,0x00或0x00、0xBB)
我也研究了SerialPort.DataReceived事件,但是它触发的频率太高,并且(据我所知)对于这种读写方法实际上没有用。 (因为我期望设备立即提供答案)。
是否有更好的读写方式?
仔细阅读https://msdn.microsoft.com/zh-cn/library/ms143549(v=vs.110).aspx中的备注。您不应依赖BytesToRead值来指示消息长度。 您应该知道,希望读取多少数据才能分解消息。 另外,正如@ itsme85所注意到的,您没有更新readbytes,因此,您总是将接收到的字节写到数组的开头。 更新readbytes的正确代码应如下所示:
int r;
while ((r = port.Read(message, readbytes, msglen - readbytes)) <= 0){
readbytes += r;
}
但是,在您读取数据期间,可能会收到更多数据,并且您的“消息”可能不完整。 重新思考,您想要实现的目标。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.