stm32的串口中断接收数据怎么处理

如题所述

第1个回答  2016-12-02
  int UART_WriteBuf(u8 byCom, u8 *pBuf, u16 Len)
{
int i = 0;;
if(Len == 0)
return 0;
switch(byCom)
{
case 1 :
Uart_data.send_len = Len - 1;
Uart_data.j = 1;
memmove(Uart_data.send_buff,pBuf,Len);
USART_ITConfig(USART1, USART_IT_TC, ENABLE);
USART_SendData(USART1, *pBuf);
break;
case 2 :
Uart_data.send_len = Len - 1;
Uart_data.j = 1;
memmove(Uart_data.send_buff,pBuf,Len);
USART_ITConfig(USART2, USART_IT_TC, ENABLE);
USART_SendData(USART2, *pBuf);
break;
case 3 :
Uart_data.send_len = Len - 1;
Uart_data.j = 1;
memmove(Uart_data.send_buff,pBuf,Len);
USART_SendData(USART3, *pBuf);

USART_ITConfig(USART3, USART_IT_TXE, ENABLE);
break;

}
return Len;
}
void USART3_IRQHandler(void)
{
int j = 0;
if(USART_GetITStatus(USART3,USART_IT_RXNE))
{
USART_ClearITPendingBit(USART3,USART_IT_RXNE);
Uart_data.rec_buff[Uart_data.rec_len] = USART_ReceiveData(USART3);
Uart_data.rec_len ++;
if(Uart_data.rec_len >= UART_DATA_SIZE) //防止数组越界
Uart_data.rec_len = UART_DATA_SIZE - 1;
}
else if(USART_GetITStatus(USART3,USART_IT_TXE))
{
USART_ClearITPendingBit(USART3,USART_IT_TXE);
USART_ClearFlag(USART3,USART_FLAG_TC);
if(Uart_data.j <= Uart_data.send_len)
{
// printf("TC = %d,TXE = %d,FLAG_TC = %d\n\r",USART_GetITStatus(USART3,USART_IT_TC),USART_GetITStatus(USART3,USART_IT_TXE),USART_GetFlagStatus (USART3,USART_FLAG_TC));
USART_SendData(USART3,Uart_data.send_buff[Uart_data.j]);
while(j < 800)
j++;
// printf("interrupt:j = %d,len = %d,buff[%d] = %c,buff = %s\n\n\r",Uart_data.j,Uart_data.len,Uart_data.j,Uart_data.buff[Uart_data.j],Uart_data.buff);
}
else
USART_ITConfig(USART3, USART_IT_TXE, DISABLE);
Uart_data.j++;
}
}本回答被网友采纳

STM32串口接收不定长数据(接收中断+超时判断)
接收中断:当接收到数据时,中断触发并读取数据,然后清除中断标志。超时判断:在中断处理中,设置定时器,检查数据接收是否在预设时间内完成。硬件准备:使用像正点原子M48Z这样的开发板和ST-Link调试工具。编程实战:初始化串口并启用接收中断,接收字符后打印并判断数据帧完成。总结来说,通过接收中断和超时...

STM32串口接收不定长数据(空闲中断+DMA)
1. 固定格式:通过约定数据包的起始和结束标志,如AA BB和BB AA,接收端在接收到这些标志后,就可以确定数据包的边界,从而存储接收到的数据。2. 接收中断+超时判断:串口接收到数据会触发接收中断。通过设置一个计时器,如果在预设时间内没有接收到新的数据,就认为一帧数据接收完成。3. 空闲中断:...

STM32串口接收不定长度
处理STM32单片机串口接收不定长度数据的方法主要有三种:利用库配置、使用DMA接收和直接配置接收数据。本文将详细介绍第三种方法,即直接利用正常接收数据的配置。步骤一:配置串口并开启中断。选择异步模式的串口1,PA9作为发送端,P10为接收端,并确保中断功能开启。步骤二:定义变量。定义接收数据的最大长度...

STM32串口UART接收不定长数据最佳方案
以STM32F4的LL库为例,配置中断服务函数如下。采用RTOS的,会在中断处理中设置线程标志,接收线程通过检查此标志获取数据。如果未使用RTOS,可通过全局变量监控中断变化。接收数据时,我们需要区分两种情况:数据位于缓存的起始位置,或者跨越了缓存的末尾。这需要根据起始和结束位置的关系,灵活处理数据读取。...

STM32串口一直接收中断,怎么解决
首先你用示波器来看下到底有没有接收端的数据波形,要是没有的话就是你串口终端初始化有问题,或者就是在你的中断中没有清除标志位。

STM32单片机如何处理QT上位机串口中发过来的数据?
单片机接收处理串口的数据的过程就是配置好波特率、位宽、校验位等,收到数据 后可以引起中断,也可以查询标志位,然后进行相应的处理。1) 串口时钟使能,GPIO 时钟使能。2) 设置引脚复用器映射:调用 GPIO_PinAFConfig 函数。3) GPIO 初始化设置:要设置模式为复用功能。4) 串口参数初始化:设置波特率,...

STM32 发送中断与接收中断是否在一个中断处理函数中进行处理?
RS485通信使用中断收发是放在同一函数中,但是需要用if else来判断SR寄存器的值来区分接收和发送。在stm32的串口中断内,发送完数据后需要手动清除发送中断使能位,不然会一直进入发送中断。

STM32之串口DMA接收不定长数据
为了实现DMA与空闲中断的高效配合,需要理解STM32串口的状态寄存器,特别是idle状态,它表示数据传输完成。通过检测idle中断,即可判断数据接收结束。接收数据后,需要完成数据处理,包括关闭接收DMA通道以避免干扰,清除DMA标志位,从DMA寄存器获取数据长度,重新配置DMA以准备接收下一次数据。此外,处理过程中应...

stm32mac不能接收数据
原因是串口接收的时候出现异常。解决方法:1、中断函数里面获取IDLE空闲中断标志位。2、清除标志位,停止串口DMA传输。3、获取接收到的数据个数,置位接收完成标志,接收数据的处理放在main函数中,即可解决stm32mac不能接收数据的问题。

STM32 USART接收中断程序问题
void USART1_IRQHandler(void)接收中断函数中一直循环,可能是你中断函数的处理程序太多了,导致延时太大,建议你直接在中断处理函数里只放些标志位,中断就改变标志位,在主循环中根据标志位处理判断。并且最好再提高系统时钟频率。你用的115200的速度,有点高! 追问 我发现USART_ClearITPendingBit(USART1,USART_IT_RXNE)...

相似回答