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

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

3天内不再提示

三种方法实现串口接收不定长度的数据

CHANBAEK 来源:硬件设计工匠 作者:鱼 2023-09-14 16:16 次阅读

下面三种方式都亲测可用,实际使用时应采用第三种方法,更有效率。

方法一:

先说重点:

1)RXNE,表示一个字节产生一次中断,这里要着重说明一下,是一个字节。原因是DR寄存器是32位,有效位是8位。比如串口发送的字符或字符串,其对应的ASICC码的二进制都是8位的,所以不管是发送“1”,都是8位

2)IDLE,表示DR先有数据(可以是一个字节的数据,也可以是N个字节的数据连续发过来),然后空闲了一个字节的时间,就会产生中断。

图片

如果要让串口发送不定长度的的数据,则先通过RXNE,把数据一个字节一个字节地存起来,当一串信息发送完时,因为要停顿一下,则会产生IDLE中断,利用IDLE中断,表示完成接收数据,具体方法如下:

先定义一个数组和数组长度:

uint8_t Rx1_Buff[50]={'0'};

uint8_t rx_buffer_len=0;

图片

方法二:

使用STM32串口中断实现非阻塞方式接收不定长数据

一、简介

1.1、开发环境

STM32CubeIDE V1.9。

1.2、实现功能

使用STM32的串口1,接收不定长数据,并返回接收数据

二、步骤解析

2.1、配置串口

打开“Device Configuration Tool”(即STM32CubeMX),配置串口1。

图片

注:一定要在“NVIC Settings”栏,勾选“USART1 global interrupt”打开串口中断。

2.2、初始化

初始化过程中,调用函数“HAL_UARTEx_ReceiveToIdle_IT”。

HAL库中对该函数的定义:

HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)。

huart:定义串口,一般填写 &huartx(x为串口号,取1、2、3……)。本案例使用串口1,则填写&huart1;

pData:接收数据存放的首地址,一般填写一维数组名;

Size:定义接收的字节长度,填写接收数据的最大字节数。

2.3、回调函数

调用函数“HAL_UARTEx_ReceiveToIdle_IT”后,当接收长度等于Size,或者串口接收数据过程中产生空闲时,会执行回调函数"HAL_UARTEx_RxEventCallback"。

HAL库中对该函数的定义:

__weak void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)

huart:回调串口号;

Size:实际接收的字节长度。

注:该回调函数为空的弱函数,函数主体需自己重新定义。

三、实例

从串口1接收不定长数据,存放在数组array[50]中,并返回所接收的数据。

3.1、定义

定义一维数组array:

uint8_t array[50];

3.2、主函数

在主函数的初始化过程,调用函数“HAL_UARTEx_ReceiveToIdle_IT”:

void main()

{

HAL_UARTEx_ReceiveToIdle_IT(&huart1, array, 50); //初始化开启串口接收

while(1);

}

3.3、重新定义回调函数

void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)

{

if(huart==&huart1) //判定:串口1接收

{

HAL_UART_Transmit(&huart1,Rx1_Buff,strlen((constchar*)Rx1_Buff),0x000A); //把接收到的数据发送出去

memset(Rx1_Buff,0,strlen((const char*)Rx1_Buff));//清空数组

HAL_UARTEx_ReceiveToIdle_IT(&huart1, array, 50) ; //重新开启串口接收

}

}

初始化打开串口接收中断,当串口接收满50字节,或串口产生空闲时,会执行回调函数。回调函数里判断串口后正确后,执行对应的功能函数,并再次开启串口接收中断。

HAL_UARTEx_ReceiveToIdle_IT(),其实是实现RXNE和IDLE中断,和方式一是一样的原理

图片

图片

以上两种方式,每一个字符都会中断一次,效率不高,采用DMA接收的方式会更高一点,DMA空闲中断的方式见这份文档《STM32F103用hal库使用DMA+串口空闲中断接收数据_L》,或下方第三种方式.

方法三:

1.CUBE的设置就不讲了,CUBE设置完后,就进行第二步。

2.生成代码后,在main函数中打开串口空闲中断,单个字符中断用于接收用的,因为我这例程作用是串口1发送数据并把数据发送回来。

图片

3.在串口中断中添加如下:

图片

4.DMA发送完后,要清除数组Rx1_Buff里的数据,不然下次接收的数据会重复覆盖,有可能覆盖不全。其实HAL_UART_Transmit_DMA(), 这个函数接收完会调用回调函数。

HAL_UART_Transmit_DMA() - >

UART_DMATransmitCplt - >

HAL_UART_TxCpltCallback() - >

__weak void HAL_UART_TxCpltCallback()

5.构造HAL_UART_TxCpltCallback()函数,不需要添加申明

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

    关注

    2239

    文章

    10673

    浏览量

    348771
  • 中断
    +关注

    关注

    5

    文章

    884

    浏览量

    41025
  • 串口
    +关注

    关注

    14

    文章

    1483

    浏览量

    74514
  • 字符串
    +关注

    关注

    1

    文章

    552

    浏览量

    20128
收藏 人收藏

    评论

    相关推荐

    串口DMA传输不定长度包的方式

    经常看到有人在问用DMA接收不定长包的问题,由于STM32DMA的特殊性,使其对接收不定长数据不太方便,很多人都在为此伤脑筋,也有不少牛人
    发表于 12-26 08:48

    STM32单片机的接收不定长度字节数据方法

    STM32串口使用IDLE中断接收不定长数据原理与源程序转载 2016年07月16日 18:20:24原文来自 今天说一下STM32单片机的接收
    发表于 08-04 09:05

    stm32串口是如何实现接收不定长度数据的呢

    1.不定长度数据为什么会存在串口接收不定长度数据呢?首先,在通信双方进行数据传输的时候,由于不同的设备在
    发表于 08-11 08:18

    STM32单片机的接收不定长度字节数据方法

    最近用到stm32的串口,中断一个字符一个字符接收好心累,网上度了一下发现了一篇好的帖子,和大家分享一下,再次感谢原贴楼主的分享,为了方便大家,我把原文复制过来》今天说一下STM32单片机的接收
    发表于 08-13 06:30

    不定长数据接收的原理是什么?怎么实现串口数据不定长接收

    不定长数据接收的原理是什么?怎么实现串口数据不定长
    发表于 11-16 08:11

    STM32 HAL DMA串口接收不定长度实现方法

    STM32 HAL DMA串口接收不定长度实现方法
    发表于 12-08 07:59

    STM32串口接收不定长数据实现方法

    STM32串口接收不定长数据实现方法
    发表于 12-09 06:17

    STM32单片机的接收不定长度字节数据方法

    来说一下STM32单片机的接收不定长度字节数据方法。由于STM32单片机带IDLE中断,所以利用这个中断,可以接收
    发表于 01-06 08:04

    基于DMA接收利用空闲模式接收不定长数据

    STM32L051 HAL库非DMA模式使用空闲中断接收不定长数据因项目中的上位机与单片机之间的通信协议采用非标准协议,上位机发送的数据长度
    发表于 01-12 07:44

    HAL库下串口接收不定长数据方法

    STM32单片机HAL库下串口接收不定长数据HAL库下的串口接收
    发表于 01-19 06:55

    STM32串口接收不定长数据的程序免费下载

    本文档的主要内容详细介绍的是STM32串口接收不定长数据的程序免费下载。
    发表于 08-26 08:00 47次下载
    STM32<b class='flag-5'>串口</b><b class='flag-5'>接收</b><b class='flag-5'>不定长</b><b class='flag-5'>数据</b>的程序免费下载

    STM32串口接收不定长数据的几种方法

    在使用串口接收其他设备的数据时,应该针对数据的特点,譬如单字节与多字节、数据量大小、速度等,采用不同的
    发表于 11-26 13:21 17次下载
    STM32<b class='flag-5'>串口</b><b class='flag-5'>接收</b><b class='flag-5'>不定长</b><b class='flag-5'>数据</b>的几<b class='flag-5'>种方法</b>

    stm32 串口接收不定长度数据及黏包处理 + 串口DMA接收

    1.不定长度数据 为什么会存在串口接收不定长度数据呢?首先,在通信双方进行数据传输的时候,由于不同的设备在
    发表于 12-23 19:09 26次下载
    stm32 <b class='flag-5'>串口</b><b class='flag-5'>接收</b><b class='flag-5'>不定长度数据</b>及黏包处理 + <b class='flag-5'>串口</b>DMA<b class='flag-5'>接收</b>

    STM32 DMA串口接收不定长数据

    STM32 DMA串口接收不定长数据
    发表于 12-24 18:50 40次下载
    STM32  DMA<b class='flag-5'>串口</b><b class='flag-5'>接收</b><b class='flag-5'>不定长</b><b class='flag-5'>数据</b>

    STM32之串口DMA接收不定长数据

    目录STM32之串口DMA接收不定长数据引言DMA简介什么是DMA在STM32的DMA资源DMA接收数据
    发表于 12-24 19:03 30次下载
    STM32之<b class='flag-5'>串口</b>DMA<b class='flag-5'>接收</b><b class='flag-5'>不定长</b><b class='flag-5'>数据</b>