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

    文章

    19314

    浏览量

    405703
  • 串口
    +关注

    关注

    15

    文章

    1633

    浏览量

    83742

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

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    S32E 绿盒上启用以太网接收中断怎么办?

    我正在使用eth_externalloopback_s32z2xx_r52 S32E 绿盒上。禁用 PHY 环回后,我可以成功地在网络上发送和接收数据包。 现在,我想在收到以太网数据包
    发表于 05-19 07:38

    使用ls - addsw命令创建了一个 dpsw,运行测试过程中数据包速率达到1.2Gbps时,dpsw不会遇到缓冲区丢弃如何解决?

    我使用 ls - addsw 命令创建了一个 dpsw,在运行测试过程中,我发现了一个问题。 当我的数据包速率达到 1.2Gbps 时,dpsw 不会遇到缓冲区丢弃的情况,其速率只能达到 945Mbps。 请问我应该如何解决这个问题? 相应的 dprc 资源显示
    发表于 04-23 07:56

    MIMXRT1189奇数长度UDP数据包的最后一个字节出现问题,为什么?如何解决?

    Wireshark 中观察到)。但是,填充数据包无法满足以太网/IP 和 Profinet 一致性要求,这些要求要求数据包具有特定长度。 我试图了解这是否是一个错误,或者是否有任何设
    发表于 04-17 07:47

    CW32R030可以兼容BLE及XN297L数据包,请问这个XN297L数据包是什么?

    CW32R030可以兼容BLE及XN297L数据包,请问这个XN297L数据包是什么?
    发表于 01-20 06:37

    请问CW32L的UART是不是没有空闲中断?

    CW32L083的UART是不是没有空闲中断?大家一般怎么实现不定长数据接收?是串口中断+定时器吗?
    发表于 12-15 07:28

    CW32L052串口数据传输怎么解决?

    CW32L052串口数据传输
    发表于 11-24 07:35

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

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

    使用nrf54L15的NORDIC蓝牙芯片,通过串口发送一帧数据包时,会出现分包发送分析

    使用nrf54L15的NORDIC蓝牙芯片,通过串口发送一帧数据包时,会出现分包发送分析,是什么原因呢
    发表于 11-17 15:52

    【道生物联TKB-623评估板试用】TKB-623评估板双机通讯测试_程序开发

    操作即可: 发送程序设置完成后,就会自动开始数据发送: 发送的过程中接收程序会及时统计收到的数据包的情况: 为了模仿丢情况下,
    发表于 10-18 23:54

    串行通信接口的结构和功能

    串口通讯的数据包由发送设备通过自身的TXD接口传输到接收设备的RXD接口。串口通讯的协议层
    的头像 发表于 10-17 09:39 4410次阅读
    串行通信接口的结构和功能

    串口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