0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

了解在MCU中实现串口的不定长数据包接收的过程

5RJg_mcuworld 来源:未知 作者:工程师郭婷 2018-08-03 16:37 次阅读

MCU的应用中,经常需要通过串口进行不定长数据包的传输。发送方很简单,不需特别的考虑,而接收方则需要能够侦测到数据包的结束。接收方的简单做法是结合串口的IDLE中断,或使用DMA并利用DMA的超时传输机制。

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

LPC54101系列的UART模块,支持FIFO的接收超时,能够方便地实现上述功能。除此之外,本文介绍一种基于LPC54101和SDK,通过使用引脚中断和定时器配合,实现串口DMA接收超时,实现串口DMA接收超时的机制。

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

了解在MCU中实现串口的不定长数据包接收的过程

图1. 串口接收数据时序图

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

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

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

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

了解在MCU中实现串口的不定长数据包接收的过程

图2. LPC54101 DMA传输数据长度计数位

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

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

了解在MCU中实现串口的不定长数据包接收的过程

了解在MCU中实现串口的不定长数据包接收的过程

了解在MCU中实现串口的不定长数据包接收的过程

图3. 程序流程图

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    146

    文章

    17128

    浏览量

    350999
  • 串口
    +关注

    关注

    14

    文章

    1551

    浏览量

    76431

原文标题:在MCU中,如何实现串口的不定长数据包接收?

文章出处:【微信号:mcuworld,微信公众号:嵌入式资讯精选】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    【代码分享】基于乐鑫ESP32的串口不定长数据接收方法

    【代码分享】基于乐鑫ESP32的串口不定长数据接收方法
    的头像 发表于 11-15 01:02 406次阅读
    【代码分享】基于乐鑫ESP32的<b class='flag-5'>串口</b><b class='flag-5'>不定长</b><b class='flag-5'>数据</b><b class='flag-5'>接收</b>方法

    【AG32开发板免费试用】+串口不定长收超时设置阈值多少合适?

    串口不定长收发超时设置阈值多少合适?这个和波特率有关系吗? 考虑最大接收长度吗?
    发表于 10-31 18:26

    Iphone4上运行UDP接收器,数据包丢失怎么解决?

    ;255.255.255.255\",48899 现在使用 AT CIPSEND 每秒发送 1 个数据包 并非所有的Iphone似乎都受到严重的影响,但Iphone4是最糟糕的。
    发表于 07-18 06:56

    能否ESP结束之前通过串行端口停止传入的UDP数据包的传输以解析下一个UDP数据包

    丢弃ESP完成之前不需要的数据包,以便通过串行端口发送它以接收下一个数据包, 如果没有,我必须按顺序读取所有传入的数据包,需要的和不需要的, 而且波特率不足,主机处理器开销大, 我
    发表于 07-16 06:18

    udp数据的原因?

    编译sdk/examples/protocols/sockets/udp_server 例子程序,修改了代码,把发送回去的代码注释,只是记录上次接收数据包的时间和当前接收数据包的时间间
    发表于 06-25 07:03

    AN65974数据包和零长数据包是什么意思?

    AN65974 ,短数据包和零长数据包是什么意思? 非常感谢!
    发表于 05-30 07:41

    如何在AIROC GUI上获取良好数据包和总数据包

    使用 IQxel-MW LifePoint 作为发生器并发送波形BT_1DH5_00001111_Fs80M.iqvsg,但无法 AIROC 工具接收数据包。 以下是从 IQxel
    发表于 05-22 06:39

    求助,关于串口数据解析疑问求解

    过来,正在中断里面接收数据,此时又来一条,那么串口会不会继续接数据进来? 4. 接收数据
    发表于 04-29 06:34

    stm32f103通过UART_RX空闲中断服务函数接收不定长数据,运行一段时间后会进入HardFault_Handler的原因?

    目的:通过UART RX DMA + UART空闲中断接收不定长数据。 描述:打开UART_RX_DMA接收,通过UART_RX空闲中断服务函数
    发表于 04-26 06:43

    STM32F030串口用IDLE中断接收不定长度数据包,中断异常的原因?

    如题,使用IDLE中断接收不定长度的数据包,发现程序一直处于IDLE中断。程序如下 串口配置
    发表于 04-12 06:08

    STM32 DMA双缓冲发送不定长数据怎么解决?

    STM32 DMA双缓冲发送不定长数据,假如我需要发送100010个数据,开辟了2块1000数据区,数据长度设置为1000,循环发送,最后一
    发表于 04-11 06:58

    用STM32F030F4串口空闲中断接收不定长数据,发生中断后不知道如何计算接收到的字节数?

    我用STM32F030F4串口空闲中断接收不定长数据,发生中断后不知道怎样计算接收到的字节数。
    发表于 04-03 07:12

    stm32f103如何实现spi从机接收不定长数据

    stm32f103 如何实现spi从机接收不定长数据数据首字节说明了数据长度) 求个思路或例程
    发表于 03-28 07:47

    STM32H7接收数据包异常,一接收数据出现两发送的内容怎么解决?

    接收到的数据包:be1c01016de1000000000000000001000000000000000200000000000000030000000000000082ed 前4个字
    发表于 03-08 08:05

    DPDKAI驱动的高效数据包处理应用

    传统的数据包处理方式是数据包先到内核最后再到用户层进行处理。这种方式会增加额外的延迟和CPU开销,严重影响数据包处理的性能。 DPDK 绕过内核,在用户空间中实现快速
    的头像 发表于 02-25 11:28 933次阅读
    DPDK<b class='flag-5'>在</b>AI驱动的高效<b class='flag-5'>数据包</b>处理应用