首页 > 其他分享 >STM32/GD32串口接收不定长数据

STM32/GD32串口接收不定长数据

时间:2023-07-03 09:11:53浏览次数:68  
标签:USART 中断 STM32 USART1 GD32 串口 接收 空闲

RYMCU RYMCU 嵌入式开源https://rymcu.com

编者注:

单片机串口接收不定长数据时,必须面对的一个问题为:怎么判断这一包数据接收完成了呢?常见的方法主要有以下两种:

1.在接收数据时启动一个定时器,在指定时间间隔内没有接收到新数据,认为数据接收完成;2.在数据中加入帧头、帧尾,通过在程序中判断是否接收到帧尾来确定数据接收完毕。这两种方法的缺点为,需要主程序来判断和处理,对主程序造成不小压力。

STM32单片机空闲检测中断可以很好的解决这个问题。他的工作原理为:

当STM32的串口接收完一包数据后,会产生一个空闲中断。这个中断在串口其他任何状态都不产生,只会在接收完一包数据后才会产生,一包数据可以是1个字节或者多个字节。因此,我们可以在这个空闲中断函数中,设置一个接收完成标志位。那么,我们只需要在主程序中检测这个标志位就知道数据是否接收完成了。具体应该怎么操作呢?其他不表,直接上代码:

上述代码几乎是STM32串口的常规配置,无需赘述。增加了第47行的空闲中断使能语句,允许它中断即可:

USART_ITConfig(DEBUG_USARTx, USART_IT_IDLE, ENABLE);//空闲中断使能

下面是主程序和串口中断函数:

先来看第30-36行的中断函数内容,首先是把接收到的字节存到rx_buff中,并且数据长度rx_cnt++,接着调用库函数清除接收中断标志位,属于常规的数据接收操作。

不同的是第38-46行:

判断是不是产生了串口空闲中断(USART_IT_IDLE),然后就是置位接收完成标志位rx_done = 1,并且清除空闲中断标志位。

注意事项:

调用库函数USART_ClearITPendingBit(DEBUG_USARTx, USART_IT_IDLE);是不会清除空闲中断标志位的。应该采用42-43两条语句实现,否则会一直进入中断函数。

temp = USART1->SR; //先读SR,再读DR才能完成idle中断的清零,否则一直进入中断。
temp = USART1->DR;

第9-24行的主函数进行相应的处理便可。

GD32相关代码:

usart_interrupt_enable(USART1, USART_INT_IDLE);//空闲中断使能

if(RESET != usart_interrupt_flag_get(USART1, USART_INT_FLAG_IDLE)) //串口空闲中断标志
{
  temp = USART_STAT(USART1);
  temp = USART_DATA(USART1);
  Uart_Data1.reflag = 1;
}

标签:USART,中断,STM32,USART1,GD32,串口,接收,空闲
From: https://www.cnblogs.com/lijf/p/17521869.html

相关文章

  • 串口接收不定长数据的实现
    使用串口进行数据的收发在嵌入式产品中是很常用的一种通信方式,因为串口的简单使用,很容易就被选为产品中数据交互的通信手段。基于串口进行开发的功能有很多,比如同类/不同类产品之间的通信,RS485通信,RS232通信方式,实现串口命令行终端用于调试等等的。虽然应用的场景有所不同,但是都会......
  • 4.STM32传感器ADC采样+继电器控制实现声光控灯
    找到环境光与声音传感器对应的管教,使能,再在时钟树中设置频率为12Mhz,一般不要太高 在adc.c中可以添加如下代码:enum{ ADCCHN_NOISY, ADCCHN_LUX, ADCCHN_MAX,};intadc_sample_lux_noisy(uint32_t*lux,uint32_t*noisy){ uint8_ti; uint32_ttimeout=0xffffff;......
  • 【雕爷学编程】Arduino动手做(142)---GY-25串口倾斜度模块
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞......
  • 一个基于STM32H743芯片和SOEM协议栈的EtherCAT主站源码。该源码提供了配套的CUBE工程,
    一个基于STM32H743芯片和SOEM协议栈的EtherCAT主站源码。该源码提供了配套的CUBE工程,使用的是SOEM协议栈的1.3.1版本。此外,还可以使用NUCLEO-H743ZI开发板进行配套开发。该系统支持DC同步,并且可以与多种驱动器型号配合使用,包括汇川IS620N、三洋RS3、赛孚德ASD620B、埃斯顿ProNet、......
  • 【雕爷学编程】Arduino动手做(140)---MAX3232串口转换板
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞......
  • 3.串口printf调试输出
    在stm32中先配置使能一个uart串口,保存自动生成uart的.h.c文件接着在头文件中包含stdio.h再在c文件中添加重定向:GCC和keil等不同编译器调用printf时候是不同的可以定义一个宏保证他们的兼容性,即使printf函数重定向 #ifdef__GNUC__//选择gcc编译时才会定......
  • STM32 HAL库关于延时函数
    1堵塞式延时用这种程序会一直等待不能做其它工作,优点是实现简单,适用于断时的单任务等待。HAL_Delay(1000);//延时1000ms2非堵塞式等待借用系统的开机时间,可以边等待边完成其它任务,不占用CPU,比较推荐这种方式。1uint32_tstartTime,now;23startTime=HAL_GetTick();......
  • stm32 IAP升级 OTA升级 野外设备远程升级 自建FTP服务器升级 多App备份 切换,防变砖
    stm32IAP升级OTA升级野外设备远程升级自建FTP服务器升级 多App备份切换,防变砖芯片stm32f103系列4G模块EC200T程序简介:一个bootloader程序 多个主程序程序可相互切换主程序A出厂前烧录,永不更改,用于升级失败后,做应急程序使用,保障单片机不变砖主程序B日常运行,可升级......
  • usb串口移植aarch64
    目标环境:arm架构,openEuler23.03 内核5.10.0开发环境:x86架构,centos7.4系统,内核3.10.0遇到的问题问题1minicom无法编译执行尝试方案1:从官网上找了源码包,并根据虚拟机中的依赖关系,下载了可能的依赖文件,导入服务器(无外网)  根据yum源找到库网址:http://repo.openeuler.org......
  • esp32运行边界路由与nRF52833作为rcp通过串口通讯组建边界路由步骤
    1、首先搭建esp32开发环境,按照官方指导说明,我这里是建立在linux运行环境下的  Linux和macOS平台工具链的标准设置-ESP32-C6-—ESP-IDF编程指南latest文档(espressif.com)   espressif/esp-idfatv5.2-dev(github.com)   去官网下载最新版的esp-id......