繁体   English   中英

.NET SerialPort写入/读取优化

[英].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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM