串口通讯MODBUS接收数据问题

那该多好啊!!! 2024-07-30 18:09:26

请问,当一次接收事件来了,读到数据后,数据会不会从缓存中读走了,在次读的时,缓存中的数据没有了。

因为要判断读到的数据长度是不是够了,如果不够,要在次读,

可是如果首次读走了一半,在次读会不会少一半了

 

      serialPort.Read(readBuffer, 0, readBuffer.Length);

...全文
170 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
BrillianceRen 2024-08-05
  • 打赏
  • 举报
回复

你需要自己缓存, 一个 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);
}
wanghui0380 2024-07-31
  • 打赏
  • 举报
回复

额,串口协议为流式协议。所以不光是够不够的问题,而是头+长度+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的功能都有

111,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧