1 回答

TA貢獻1836條經驗 獲得超13個贊
我找到了解決辦法!
在StartReceivingAsync
方法byte[] mainBuffer
中初始化一次。
初始化后會出現“一會兒...”實際流讀取數據的循環。
我不知道 FTDI 芯片的確切規格,但在不斷發送時,它確實會以相當隨機的部分發送數據(發送方和接收方沒有超時)
所以,執行時int bytesRead = await _port.BaseStream.ReadAsync(mainBuffer, 0, _completeCommandSizeWithSep, _receiveToken);
我會收到發送的數據的隨機部分。該數據將按照預期寫入 mainBuffer
字節數組,然后將其添加到 _receivedBuffer
。
事情來了:mainBuffer
當流接收到小于 _completeCommandSizeWithSep
的數據部分時,不會被清理。
BaseStream 讀取器只是從 0 索引處替換收到的 mainBuffer
中的盡可能多的字符,忽略其余部分。
解決方法是僅添加長度等于
bytesRead
的子字符串 值而不是整個mainBuffer
到接收緩沖區:
int bytesRead = await _port.BaseStream.ReadAsync(mainBuffer, 0, _completeCommandSizeWithSep, _receiveToken);
Bad code:
string rawData = Encoding.GetEncoding(_port.Encoding.CodePage).GetString(mainBuffer);
Working code:
string rawData = Encoding.GetEncoding(_port.Encoding.CodePage).GetString(mainBuffer).Substring(0, bytesRead);
替代解決方案是在 While 循環內重新初始化mainBuffer 數組。
- 1 回答
- 0 關注
- 262 瀏覽
添加回答
舉報