1 回答

TA貢獻1836條經(jīng)驗 獲得超13個贊
我找到了解決辦法!
在StartReceivingAsync
方法byte[] mainBuffer
中初始化一次。
初始化后會出現(xiàn)“一會兒...”實際流讀取數(shù)據(jù)的循環(huán)。
我不知道 FTDI 芯片的確切規(guī)格,但在不斷發(fā)送時,它確實會以相當(dāng)隨機的部分發(fā)送數(shù)據(jù)(發(fā)送方和接收方?jīng)]有超時)
所以,執(zhí)行時int bytesRead = await _port.BaseStream.ReadAsync(mainBuffer, 0, _completeCommandSizeWithSep, _receiveToken);
我會收到發(fā)送的數(shù)據(jù)的隨機部分。該數(shù)據(jù)將按照預(yù)期寫入 mainBuffer
字節(jié)數(shù)組,然后將其添加到 _receivedBuffer
。
事情來了:mainBuffer
當(dāng)流接收到小于 _completeCommandSizeWithSep
的數(shù)據(jù)部分時,不會被清理。
BaseStream 讀取器只是從 0 索引處替換收到的 mainBuffer
中的盡可能多的字符,忽略其余部分。
解決方法是僅添加長度等于
bytesRead
的子字符串 值而不是整個mainBuffer
到接收緩沖區(qū):
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 循環(huán)內(nèi)重新初始化mainBuffer 數(shù)組。
- 1 回答
- 0 關(guān)注
- 278 瀏覽
添加回答
舉報