查看: 1195|回复: 1

如何实现串口的不定长数据包接收?

[复制链接]
  • TA的每日心情
    开心
    2024-3-26 15:16
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3299

    主题

    6546

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    32023
    最后登录
    2024-4-25
    发表于 2019-8-14 08:55:37 | 显示全部楼层 |阅读模式
    在MCU的应用中,经常需要通过串口进行不定长数据包的传输。发送方很简单,不需特别的考虑,而接收方则需要能够侦测到数据包的结束。接收方的简单做法是结合串口的IDLE中断,或使用DMA并利用DMA的超时传输机制。


    但有些MCU在设计时出于成本上的考虑,简化了串口接收的IDLE模式以及DMA超时传输机制。没有串口IDLE中断或者DMA超时传输的机制,我们就不知道什么时候通信结束了。这种情况下,为了实现通过串口传输不定长数据包的要求,需要使用软件和其它片内外设的配合,协同完成指定的功能。


    LPC54101系列的UART模块,支持FIFO的接收超时,能够方便地实现上述功能。除此之外,本文介绍一种基于LPC54101和SDK,通过使用引脚中断和定时器配合,实现串口DMA接收超时,实现串口DMA接收超时的机制。后续还会介绍更多的办法,欢迎朋友们后台讨论或者去www.nxpic.org.cn交流。

    先分析下UART传输的时序,图1是一个典型的8位数据位1位停止位的串口通信数据流。串口每次发送数据时会首先发送一个起始位,在TTL电平逻辑下,Start位首先是一个下降沿信号。
    30.png
    图1. 串口接收数据时序图


    在串口DMA接收超时系统中,我们需要利用MCU的引脚中断功能侦测这个下降沿信号,引脚中断触发后告诉系统开始计时。要特别注意的是,当系统侦测到Start位的下降沿后最好关闭引脚中断,不然后续数据流等信号的下降沿也会触发引脚中断使得整套方案失去了意义(还不如直接用串口接收完成中断)。


    LPC54101的引脚中断可以在任意IO引脚上使能,所以可以直接把LPC54101的串口接收的引脚的中断功能打开,并设置成下降沿触发。


    超时计数器最好是系统里的低功耗定时器,这个例程中我们用的是LPC54101的RIT定时器。超时的时间设置要考虑到当前串口设置的波特率以及一次串口传输的最大包长。


    超时定时器计数溢出产生中断后,软件首先要从DMA的状态寄存器中获取到当前接收到数据的长度(对于LPC54101来说,串口DMA接收数据的长度在XFERCFGn寄存器中的XFERCOUNT位,如图2所示),然后从串口DMA预设置的数据缓冲区获取对应的数据即可。
    31.png
    图2.  LPC54101 DMA传输数据长度计数位


    在初始化设置串口对应的DMA通道时,最好设置传输长度为可能的最大长度,在接收超时后也别忘记重新复位一下串口对应DMA通道的状态,不然本次接收的数据和数据长度还会带入下次传输的过程中。



    图3是例程的流程图,分主程序,串口RX引脚中断服务程序,超时定时器服务程序三个部分。
    32.png
    33.png
    34.png
    图3. 程序流程图


    本文的实现代码,已经贴在“NXP社区”的论坛中,点击此处查看,欢迎在论坛中交流。



    本文介绍的方法比较消耗片上资源,在资源不紧张的时候是个不错的方案。接下来小编会陆续介绍一些其它的方案,还将比较各种方案的差别,敬请期待......、






    作者:@牛                       文章出处:恩智浦MCU加油站

    签到签到
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2022-8-19 21:51
  • 签到天数: 252 天

    [LV.8]以坛为家I

    12

    主题

    598

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1983
    最后登录
    2022-8-19
    发表于 2019-8-14 10:10:09 | 显示全部楼层
    期待后续,其他方法。
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2024-4-25 13:52 , Processed in 0.112861 second(s), 21 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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