方法描述:使用stm32CubeMX自动配置的工程文件,进行串口的不定长接收(非DMA方式)。
实际问题解决尝试:
1.HAL库函数只有接收定长数据HAL_UART_Receive()和HAL_UART_Receive_IT();函数声明如下:
通过查看论坛等找到的解决方式,一种是通过HAL_UART_Receive_IT(&huart1,(uint8_t *)buffer,1);来进入串口中断回调函数HAL_UART_RxCpltCallback();函数原型如下:
实际测试中,这种方式每次都需要去调用HAL_UART_Receive_IT函数,系统处理效率低。
2.通过审查生成的代码,如下所示: 首先是串口中断的代码,只有一条语句:
进行go to definition,可以看到接收中断会进入UART_Receive_IT这个函数。
继续往下级看,则可看到下图画线处所示,UART的RXNE中断使能被关闭了。
所以,另一种解决方法是将这一句给屏蔽掉,HAL_UART_Receive_IT只需要执行一次就可以了,类似于打开RXNE中断的操作。但是,这种方法不好的地方在于,如果stm32cubeMX里重新配置并生成代码的话,这个地方的屏蔽会重新打开,也就是说每重新生成一次代码,cube工程不在用户操作区的改动都会被撤回。如果代码只是最终版本,这并无多大关系,如果后续还有其他的功能添加,则会很麻烦。
3.如果cubeMX配置的串口没有开启RXNE中断的话,那我们在初始化处添加试试:
经过测试,在经过初始化后,程序能够成功DEBUG进入串口中断函数,所以对串口中断里添加我们自己的处理函数即可,本人的处理代码是通过改编原子的串口代码而成,当然你也可以添加自己的处理算法,根据实际问题而定。这种方式即使重新生成工程,所做的处理也不会更改。
以下是本人实际测试代码:
通过KEIL的DEBUG测试,通过此方法处理的程序,在运行到HAL_UART_IRQHandler函数中时,由于串口ORE位会置位为1, errorflags = (isrflags & (uint32_t)(USART_SR_PE | USART_SR_FE | USART_SR_ORE | USART_SR_NE));相应的不能够为RESET,则UART_Receive_IT函数并未能够进入,所以__HAL_UART_DISABLE_IT(huart, UART_IT_RXNE);这句也就不能够被执行到。
下图为实际测试效果图:
图中时间并不是正确时间,且由图可看出即使间隔10ms发一次数据,串口端都能够对数据进行准确接收方便程序处理。
关键字:stm32CubeMX 自动配置 串口 不定长接收
引用地址:
使用stm32CubeMX自动配置的工程文件,进行串口的不定长接收
推荐阅读最新更新时间:2024-03-16 16:21
STM32串口1重映射到PB6、PB7
void uart_init(u32 bound) { //GPIO端口设置 GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
[单片机]
XMEGA128学习笔记5-串口USART
Xmega128的串口非常强大,最多能支持8个串口。串口又有四种模式: 1、异步 2、同步 3、IRDA红外模式 4、SPI主模式 今天我们就使用CVAVR代码向导生成简单串口测试程序,实现每1s打印“HELLO WORLD”字符串,同时能将接收到数据回显到串口调试助手上。 第一步:打开中断,因为我们需要实现串口回显的功能。 第二步:从开发板的原理图可以看到串口是在PC2和PC3脚,所以需要设置GPIO,经过CVAVR的提示PC3初始输出电平为1能够更加稳定: 第三步设置串口:使能接收和发送功能,并开启接收中断。 第四步:最后生成代码,加入以下代码: 最后编译下载,复位后可以看到效果图:
[单片机]
采用串口光端机,消除强电磁场对485设备线路的干扰
485总线由于其布线简单,抗干扰能力强,支持点对多点通信模式,得以用于工业现场通信。由于485总线采用差分平衡传输模式,采用屏蔽双绞线作为传输介质,其抗干扰能力极强,但是抗干扰能力也有一定的限度,如果485线路处于强电磁环境下的话,还是会被强电磁环境干扰从而导致通信不能正常工作,在这种情况下,采用光纤通信可以解决类似问题,由于光纤通信采用光纤作为传输介质,不受外部电磁环境干扰,利用串口光端机来转换光纤接口和RS-485接口解决接口转换的问题。 某工厂生产车间,其控制系统采用485线路作为通信线路,按照485布线规范布线,但是由于车间内具有多个高压 设备 ,一旦高压 设备 开始运行,就会导致控制系统的控制线路由于强烈的电磁干扰导
[嵌入式]
基于STM32模拟UART串口通信
UART工作原理 UART即通用异步收发器,是一种串行通信方式。数据在传输过程中是通过一位一位地进行传输来实现通信的,串行通信方式具有传输线少,成本底等优点,缺点是速度慢。串行通信分为两种类型:同步通信方式和异步通信方式。 但一般多用异步通信方式,主要因为接受和发送的时钟是可以独立的这样有利于增加发送与接收的灵活性。异步通信是一个字符接着一个字符传输,一个字符的信息由起始位、数据位、奇偶校验位和停止位组成。 每一个字符的传输靠起始位来同步,字符的前面一位是起始位,用下降沿通知收方开始传输,紧接着起始位之后的是数据位,传输时低位在前高位在后,字符本身由5~8位数据位组成。 数据位后面是奇偶校验位,
[单片机]
CT107D蓝桥杯串口实例(3)
今天我给大家讲一下这个板子的串口通信。 这里我们就不需要看板子了,只要会用51芯片的串口就可以了。直接上代码了。 #include reg52.h str AUXR=0x8e; 51特殊寄存器具体不深究 void init_uart() { SCON=0x50; 允许接受串行口中断方式1 即8位异步通讯 AUXR=0x40; 1T TMOD|=0x20; 定时器模式3自动重装 TH1=256 -(11059200 / 9600 / 32); 波特率9600 ES=1; 允许串口中断 TR1=1; 定时器1 EA=1; 总中断 } void main() { unsigned char buf; init_uart()
[单片机]
如何在mcu上使用printf使串口输出
#ifdef __GNUC__ //另外GNU还有一些公用的扩展出来的宏 比如__GNUC__ /* With GCC/RAISONANCE, small printf (option LD Linker- Libraries- Small printf set to 'Yes') calls __io_putchar() */ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif /* __GNUC__ */ /** *
[单片机]
(二)s3c2440——串口实验
介绍: 通用异步收发器(简称UART)。用来传输串行数据。发送数据时,CPU将并行数据写入UART,UART按照一定的格式在一根电线上串行发出;接收数据时, UART检测另一根电线的信号,将串行收集的数据放在缓冲区中,CPU就能读取UART获得这些数据。 一、实验目的:掌握uart的使用方法 二、实验内容: 在串口中输入一个内容,并通过开发板返回在串口中。 三、核心语句 a:在使用UART之前,需要配置如下寄存器: 1、设置波特率(UBRDIVn) 2、传输格式(ULCONn) 3、UART引脚(GPxCON) b: 1、start.S程序
[单片机]
DS18B20温度传感器+12864液晶串口显示
程序的头文件 #include reg52.h #include intrins.h #include math.h sbit CS=P1^0; sbit SCK=P1^2; sbit SID=P1^1; sbit Key=P1^3; sbit DQ = P2 ^ 7; //定义端口DQ unsigned char code AC_TABLE ={ 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97, 0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f, 0x98,0x99,0x9a,0x9b,
[单片机]