• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

有关C语言程序设计问题

瞩目人kri 2019-02-19 浏览量:617
串口会陆续接收不同长度以FFFF00,00包头的数据,但是我只需要前6位为FFFF00,00,0A0B的11位数据,如何截取这段数据?不停判断前6位是我需要的再判断数据长度是否为11位吗?如果前六位判断不是我需要的,如何放弃这端等待下一次数据接收?         有没有更好的设计方法?
0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 这是一个典型的串口数据断帧的问题。

    你可以创建一个循环缓存队列,如F[10][20]。
    这个数组可以存储10条数据帧,每条数据帧最大长度为20个字节。

    在串口中断中,只需要将数据写入F这个二维数组中即可。
    数据解析和判断拿到while()函数里面做。

    对于断帧的方式,你可以是串口的IDLE中断(STM32有这个中断)
    也可以使用定时器,每收到一个字节,就给定时器清零,定时器会自动累加计时。
    检测到定时器时间大于设定的5MS,即说明数据帧已经传送完成了。
    下次来的数据一定是一个新的数据帧。

    这个方法是基于时间间隔带缓存的方法。通用的MODBUS里面也有类是的方案,你可以看看这方面的协议
    • 发布于 2019-02-19
    • 举报
    • 评论 0
    • 0
    • 0

其他答案 数量:8
  • 依次判断接收到的数据是否符合预设的前6位数据,只要其中出现不符则复位接收计数,重新开始下一次判断,直到六位数据都符合要求,再依次接收其它数据。
    • 发布于2019-02-19
    • 举报
    • 评论 0
    • 1
    • 0

  • 首先明确一个概念,你不是11位,而是11个char的帧吧。
    • 发布于2019-02-19
    • 举报
    • 评论 0
    • 0
    • 0

  • 在串口接收时就进行处理,符合包头的就缓存下来,不符合的就把接收数据前移一位,当接收到下一位数据时再进行包头判断。
    • 发布于2019-02-19
    • 举报
    • 评论 0
    • 0
    • 0

  • 二楼的方法就是一般通用的方法,通过定时器判断帧停时间,然后再处理数据;如果需要快速处理,可以定时查询,不过会很费资源
    • 发布于2019-02-19
    • 举报
    • 评论 0
    • 0
    • 0

  • 最好通过串口帧超时检测,stm32带这个功能,485通讯就是用的这个机制
    • 发布于2019-02-19
    • 举报
    • 评论 0
    • 0
    • 0

  • 你可以用自定义格式,即长度+帧头,也可以用不定长接收的方式,都可以实现。
    • 发布于2019-02-23
    • 举报
    • 评论 0
    • 0
    • 0

  • 每次中断的时候判断一下收到的数据,确定这包数据是否开始或者结束
    • 发布于2019-02-25
    • 举报
    • 评论 0
    • 0
    • 0

  • 数据帧处理,建议看看 物联网的协议,不同长度的帧,不同长度的数据,怎么打包传送解包提取数据等。
    • 发布于2019-02-25
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

有关C语言程序设计问题