C1460 2022-02-09 15:36 采纳率: 100%
浏览 1024
已结题

stm32串口如何连续接收帧数据并提取所需数据

如下图所示为设备通信指令解析

img

当发送启动测距指令“01 10 00 28 00 01 02 00 04 A1 BB”之后,设备开始启动测距,并不断发送测距数据。

接收到的数据如下图所示

img

当发送“01 10 00 28 00 01 02 00 04 A1 BB”后
设备会发送一次回复指令和n次测距数据直到收到停止命令 ,窗口助手接收到回复指令“01 10 00 28 00 01 81 C1”,然后就不断地发送测距数据帧 总共有47个字节,每个字符的含义在第一张图的数据解析。我想取出数据帧中的 第15个字节和第17个字节,也就是A基站和B基站的测量数据。

串口接收数据格式为 “一次回复指令+n次测距数据帧”

我使用了中断和IDLE中断,结合判断帧头为 “01 03 2A”的方法没能成功,请教各位实现。

  • 写回答

1条回答 默认 最新

  • 心跳包 2021年博客之星嵌入式领域TOP1 2022-02-09 16:18
    关注

    1.首先确定你的板子收到了串口数据,从串口工具来看,是收到了。
    2.每次发送了测距指令之后,就开始判断是否接收到“01 10 00 28 00 01 81 C1,一个字节一个字节比对。全部正确后,再开始把剩下的所有数据导入你的解析函数
    3.这个时候你应该可以拿到剩下的数据字节数的,除以47,就是你收到了n次测距数据,如果n不是整数,说明是串口接收的后面不是完整帧。
    4.假设n是整数,那么你就可以一个帧一一个帧判断了。再开始判断到“01 03 2A ,这个三个字节没问题,就去判断CRC 就是第46个字节和第47个字节是否正确,正确的话,就去14 15 16 17。然后把它存到一个数组里面,接下来就kiss第二个帧同样的道理。只有一个条件不满足就丢弃,去判断下一帧,第N帧提前成功后,你就可以发送01 10 00 28 00 01 02 00 04 A1 BB。
    5.重复上面的操作。
    注意,串口打印出来了数据,但是你的程序没有完整拿到全部数据,可以适当的加合适的延时。
    (可以多加点打印,可以优化你的打印,不用HEX,代码里面转换为字符串打印等等。)

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 2月17日
  • 已采纳回答 2月9日
  • 创建了问题 2月9日

悬赏问题

  • ¥15 在若依框架下实现人脸识别
  • ¥15 网络科学导论,网络控制
  • ¥100 安卓tv程序连接SQLSERVER2008问题
  • ¥15 利用Sentinel-2和Landsat8做一个水库的长时序NDVI的对比,为什么Snetinel-2计算的结果最小值特别小,而Lansat8就很平均
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同