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 关注
- 149 浏览
添加回答
举报