111,074
社区成员




请问,当一次接收事件来了,读到数据后,数据会不会从缓存中读走了,在次读的时,缓存中的数据没有了。
因为要判断读到的数据长度是不是够了,如果不够,要在次读,
可是如果首次读走了一半,在次读会不会少一半了
serialPort.Read(readBuffer, 0, readBuffer.Length);
你需要自己缓存, 一个 List 就行,
每次都往这个缓存里丢数据, 丢完了就检查一下缓存里有没有整包,
有整包就把需要的数据取出来, 然后删掉.
不要删不相关的缓存数据.
List<byte> Cache {get;} = new ();
void OnDataRecv() {
// 从串口读数据
byte[] buf = ...
// 插缓存
Cache.AddRange(buf);
// 检查 Cache 里是否有整包, 索引ooo, 长度xxx
int ooo, xxx;
// ...
// 取出
var pkg = Cache.Skip(ooo).Take(xxx).toArray();
// 删除
Cache.Remove(ooo, xxx);
}
额,串口协议为流式协议。所以不光是够不够的问题,而是头+长度+crc全过(注意头可以出现在任意地方,而不是buffer[0])
至于细节我已经不想讲,在这里我已经重复贴过无数回了,也没有多少人能听进去。
所以只能说,如果你用的是net4.62以上版本,请直接nuget system.io.pipelines
至于他咋用的看官方说明
https://learn.microsoft.com/zh-cn/dotnet/standard/io/pipelines
当然不同框架下多少有些差异,net4.62下部分system,io.Buffers下面的方法没有。而net4.8 以上基本上目前官方api的功能都有