簡體   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