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
    +关注

    关注

    147

    文章

    18605

    浏览量

    387041
  • 串口
    +关注

    关注

    15

    文章

    1607

    浏览量

    81936

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    串口空闲中断与串口超时中断介绍

    。 特点 依赖总线物理状态,而非时间。 常用于检测不定长数据帧的结束,无需依赖特定结束符。 应用场景 Modbus通信:不定长数据包接收
    发表于 11-21 08:31

    串口DMA接收数据包丢失怎么解决?

    RTT串口DMA接收数据,超过缓冲区后为什么会吞掉一个数据包呢,不能每次处理完后清除缓冲区数据吗,感觉
    发表于 09-29 07:50

    求助,关于串口设备驱动fifo问题

    目前在做高频数据采集分析,使用串口设备驱动(使用rs485),开启DMA+空闲中断,接收不定长数据接收
    发表于 09-12 08:18

    【RA4M2-SENSOR】—— 12.串口接收不定长度数据

    U1_Rxlen 计算总共收到了多少个字符; 假如一帧的数据接收完成了,那么 U1_Rxlen 变量的值应该维持不变。 第一个步骤比较好实现,还是
    发表于 09-01 11:22

    请问DCTCP与DCUDP 的登录数据包和心跳数据包与服务器端是如何交互的?

    DCTCP与DCUDP 的登录数据包和心跳数据包与服务器端是如何交互的?
    发表于 08-06 06:29

    EZ串行的BLE“无响应写入”, CAN一次通信中接收的最大数据包大小是多少?

    :所有数据都显示与 ez-Serial 和 PUART 连接的 TeraTerm 上 [问题] (1) EZ 串行的 BLE“无响应写入”, CAN 一次通信中
    发表于 07-07 07:33

    蓝牙数据通道空口数据包

    可以用下面的流程图来描述上述过程。 ​ 编辑 MD(1bit) ,more data,用来指示对方我还有数据包要传,请继续打开射频窗口准备接收。比如Nordic nRF51822一个connection
    发表于 06-03 10:51

    【RA-Eco-RA4M2开发板评测】使用RA4M2的串口实现任意任意类型任意长度的数据接收,并将接收到的数据显示串口助手上

    使用RA4M2的串口实现任意任意类型任意长度的数据接收,并将接收到的任意类型任意长度的数据显示
    发表于 05-04 14:11

    【RA-Eco-RA4M2开发板评测】定时器辅助串口不定长数据接收

    assert(status==FSP_SUCCESS); }   2.定时器辅助串口接收实现不定长数据
    发表于 04-30 14:44

    当从接收DMA一次接收一个字节时,如何检查是否已接收到任意长度的所有数据包呢?

    当从接收 DMA 一次接收一个字节时,如何检查是否已接收到任意长度的所有数据包
    发表于 04-21 08:22

    为UART、MCXA142实现ISP通信的主机端,发送Ping数据包并收到预期的响应,发送和接收数据包的典型顺序是什么?

    我想为 UART、MCXA142 实现 ISP 通信的主机端。我发送 Ping 数据包并收到预期的响应。发送和接收数据包的典型顺序是什么? 此刻,我的照片是这样的: 1. 发送 Pi
    发表于 04-03 08:05

    如何使用DMA进行USART不定长接收

    在上一讲,我们对USART进行了简单介绍,并讲解了如何在不使用DMA的情况下进行不定长度数据接收,本讲将着重讲解如何使用DMA进行USART不定长
    的头像 发表于 02-18 17:01 1360次阅读
    如何使用DMA进行USART<b class='flag-5'>不定长</b>度<b class='flag-5'>接收</b>

    I2C总线数据包结构详解

    。以下是I2C总线数据包结构的详解: 一、I2C总线数据包的基本组成 I2C总线上的数据传输以数据包为单位进行,每个数据包包含起始信号、设备
    的头像 发表于 01-17 15:46 1391次阅读

    mtu配置步骤详解 mtu与数据包丢失的关系

    步骤 确定当前MTU值 : 配置MTU之前,首先需要了解当前网络的MTU值。这可以通过使用ping命令(如ping -f -l [数据包长度] [网关IP地址])来测试,并通过逐步调整数据包
    的头像 发表于 12-16 14:33 3753次阅读

    mtu不同网络协议的应用

    包括数据包头和数据负载。MTU的大小决定了网络可以传输的最大数据量,同时也影响了数据包的分片和重组过程
    的头像 发表于 12-16 14:22 1928次阅读