楼主: 技术范儿

[分享] 串口接收不定长数据帧算法

[复制链接]
  • TA的每日心情

    2017-1-4 08:05
  • 签到天数: 11 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    85

    主题

    1629

    帖子

    1

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2569

    优秀版主

    最后登录
    2019-3-28
     楼主| 发表于 2016-12-8 10:29:53 | 显示全部楼层
    香水橙 发表于 2016-12-7 21:39
    IDLE和断帧的概念不同

    可能写的有点不明确,但是最终效果应该一样,idle的算法用过一次,但是接我们的设备段帧
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    郁闷
    2021-2-20 16:41
  • 签到天数: 6 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    1

    主题

    32

    帖子

    0

    注册会员

    Rank: 2

    积分
    62
    最后登录
    2021-2-20
    发表于 2016-12-8 14:13:54 | 显示全部楼层
    自己搞个协议,不就知道数据包是多长的,什么时候结束,收到的包对不对。。。。这些都解决了
    不想上班
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-12-8 10:21
  • 签到天数: 743 天

    连续签到: 1 天

    [LV.9]以坛为家II

    0

    主题

    1650

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    19069
    最后登录
    2021-5-6
    发表于 2016-12-8 14:14:34 | 显示全部楼层
    谢谢分享,真是难得给力的帖子啊
    我又来签到了.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2017-1-4 08:05
  • 签到天数: 11 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    85

    主题

    1629

    帖子

    1

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2569

    优秀版主

    最后登录
    2019-3-28
     楼主| 发表于 2016-12-8 14:46:26 | 显示全部楼层
    佳乐星_乐 发表于 2016-12-8 14:13
    自己搞个协议,不就知道数据包是多长的,什么时候结束,收到的包对不对。。。。这些都解决了 ...

    485定长吗
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    6

    主题

    35

    帖子

    2

    注册会员

    Rank: 2

    积分
    164
    最后登录
    2025-2-9
    发表于 2016-12-11 12:10:36 | 显示全部楼层
    多谢分享
    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    54

    帖子

    0

    注册会员

    Rank: 2

    积分
    181
    最后登录
    2019-11-15
    发表于 2016-12-11 13:40:53 | 显示全部楼层
    看不懂代码。但我知道,不定长数据帧,设个超时,或解析包长度是常用的方法。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2017-1-4 08:05
  • 签到天数: 11 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    85

    主题

    1629

    帖子

    1

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2569

    优秀版主

    最后登录
    2019-3-28
     楼主| 发表于 2016-12-11 17:14:52 | 显示全部楼层
    衔胆栖冰 发表于 2016-12-11 13:40
    看不懂代码。但我知道,不定长数据帧,设个超时,或解析包长度是常用的方法。 ...

    不定长就是不知道数据长度
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    54

    帖子

    0

    注册会员

    Rank: 2

    积分
    181
    最后登录
    2019-11-15
    发表于 2016-12-11 22:26:52 | 显示全部楼层
    技术范儿 发表于 2016-12-11 17:14
    不定长就是不知道数据长度

    一个超时搞定。不定长很常见。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2021-4-20 18:38
  • 签到天数: 341 天

    连续签到: 1 天

    [LV.8]以坛为家I

    8

    主题

    1193

    帖子

    2

    金牌会员

    Rank: 6Rank: 6

    积分
    2370
    最后登录
    2022-4-29
    发表于 2016-12-12 00:58:30 | 显示全部楼层
    根据波特率 用一个定时器定时即可,超时结束
    梵蒂冈
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    郁闷
    2021-1-9 21:21
  • 签到天数: 56 天

    连续签到: 1 天

    [LV.5]常住居民I

    52

    主题

    677

    帖子

    5

    金牌会员

    Rank: 6Rank: 6

    积分
    1470
    最后登录
    2021-1-9
    发表于 2016-12-12 19:06:45 | 显示全部楼层
    若是通讯两端都是自己(或一个项目组,没有外来数据)做,可以在每一帧数据的末尾加终止字符的方式来做,改一下驱动中的代码(坐下判断)即可;若是接收外部数据(自己无法控制传来的内容),则可以使用一个定时器,但是不一定要用中断,可以在接收时判断时长的方法(所有的定时器其背后都是一个计数器,判断计数器增长值即可),当时间超过多少之后没有数据进来即可判断一帧数据结束。
    以下是KSDK中UART阻塞式接收数据的部分代码:
    while (length--)
        {
    #if defined(FSL_FEATURE_UART_HAS_FIFO) && FSL_FEATURE_UART_HAS_FIFO
            while (!base->RCFIFO)
    #else
            while (!(base->S1 & UART_S1_RDRF_MASK))
    #endif
            {
                statusFlag = UART_GetStatusFlags(base);

                if (statusFlag & kUART_RxOverrunFlag)
                {
                    return kStatus_UART_RxHardwareOverrun;
                }

                if (statusFlag & kUART_NoiseErrorFlag)
                {
                    return kStatus_UART_NoiseError;
                }

                if (statusFlag & kUART_FramingErrorFlag)
                {
                    return kStatus_UART_FramingError;
                }

                if (statusFlag & kUART_ParityErrorFlag)
                {
                    return kStatus_UART_ParityError;
                }
            }
            *(data++) = base->D;

    在接收数据前都要执行 while (!(base->S1 & UART_S1_RDRF_MASK))判断是否有数据到来
    while (!(base->S1 & UART_S1_RDRF_MASK))
    {
       。。。 。。。
       //只要在这里判断一下定时器计数器执行的时长,当超过一定时长时返回接收函数即可解决不定长数据接收的问题
    }

    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-18 22:14 , Processed in 0.097219 second(s), 27 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表