/* 串口接收缓冲区 /在uasrt.h中,定义
uint8_t rx_buffer[100] = “hello”;
/ 串口接收完成标记 /
uint8_t recv_end_flag = 0;
/ 串口接收数据长度 */
uint16_t rx_len =0;
#define BUFFER_SIZE 100在stm32l4xx_it.c中找到相对应的中断函数,修改如下:(需要添加usart.h头文件)
extern uint8_t rx_buffer[];
extern uint8_t recv_end_flag;
extern uint16_t rx_len;
void USART1_IRQHandler(void)在main.c文件中,添加printf重定向语句。
{
/*
USER CODE BEGIN USART1_IRQn 0 /
uint32_t tmp_flag = 0;
uint32_t temp;
HAL_UART_IRQHandler(&huart1);
tmp_flag =__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE); //获取IDLE标志位
if((tmp_flag != RESET))//idle标志被置位
{
__HAL_UART_CLEAR_IDLEFLAG(&huart1);//清除标志位
temp= huart1.Instance->ISR; //清除状态寄存器SR,读取SR寄存器可以实现清除SR寄存器的功能
temp= huart1.Instance->RDR; //读取数据寄存器中的数据
HAL_UART_DMAStop(&huart1);
temp = hdma_usart1_rx.Instance->CNDTR;// 获取DMA中未传输的数据个数
rx_len= BUFFER_SIZE - temp; //总计数减去未传输的数据个数,得到已经接收的数据个数
recv_end_flag= 1; // 接受完成标志位置1
}
/
USER CODE END USART1_IRQn 0 /
HAL_UART_IRQHandler(&huart1);
/
USER CODE BEGIN USART1_IRQn 1 /
/
USER CODE END USART1_IRQn 1 */
}
#ifdef
GNUC主函数while(1)循环前开启空闲中断和DMA服务
#define
PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define
PUTCHAR_PROTOTYPE int fputc(int ch, FILE f)
#endif
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart1 , (uint8_t)&ch, 1 , 0xffff);
return ch;
}
/开启串口空闲中断/在while(1)中添加
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
/启动串口DMA接收/
HAL_UART_Receive_DMA(&huart1,rx_buffer,BUFFER_SIZE);
if(recv_end_flag==1)编译烧录后就能实现串口不定长数据的收发。
{
printf(“rx_len=%drn”,rx_len);//打印接收长度
HAL_UART_Transmit(&huart1,rx_buffer,
rx_len,200);//接收数据打印出来
memset(rx_buffer,0,rx_len); //清除数组,需要添加string.h头文件
rx_len=0;//清除计数
recv_end_flag=0;//清除接收结束标志位
}
HAL_UART_Receive_DMA(&huart1,rx_buffer,BUFFER_SIZE);//重新打开DMA接收
更多回帖