蓝桥杯嵌入式2——串口的使用
六、串口配置(usart_app.c)
6.1 CubeMX配置
调试器的串口模式与usart1相连
6.2 代码部分
6.2.1 需要补充的代码
#include "bsp_system.h"
typedef struct __FILE FILE;//重定向函数使用uint8_t uart_rx_buffer[128];
uint8_t uart_rx_index;
uint32_t uart_rx_ticks;
需外部调用
重定向函数需牢记
int fputc(int ch,FILE *str)
{HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 10);//使用串口1,发送1字节,最大等待时间10msreturn ch;
}
在串口初始化的函数里打开串口接收中断
HAL_UART_Receive_IT(&huart1,uart_rx_buffer,1);//串口1接收1字节数据到rx_buffer中
6.2.2 底层代码
串口的接收回调函数属于弱定义
#include "uart_app.h"void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if (huart->Instance == USART1){uart_rx_ticks = uwTick;uart_rx_index++;HAL_UART_Receive_IT(&huart1, &uart_rx_buffer[uart_rx_index], 1);}
}
void uart_proc(void)
{if(uart_rx_index == 0) return;// 如果从最后一次接收到数据到现在已经超过100msif(uwTick - uart_rx_ticks > 100) // 100ms内没有收到新的数据{printf("uart data:%s\n",uart_rx_buffer);// 清空接收缓冲区, 将接收索引置零memset(uart_rx_buffer, 0, uart_rx_index);//指向要清空数据的指针 0代表所有字节被设为0 要清空的字节数uart_rx_index = 0;// 将UART接收缓冲区指针重置为接收缓冲区的起始位置huart1.pRxBuffPtr = uart_rx_buffer;//将串口1接收缓冲的句柄指向buffer}
}
6.3 串口使用DMA
typedef struct __FILE FILE;
uint8_t uart_rx_dma_buffer[128];//添加在初始化中HAL_UARTEx_ReceiveToIdle_DMA(&huart1,uart_rx_dma_buffer,sizeof(uart_rx_dma_buffer));__HAL_DMA_DISABLE_IT(&hdma_usart1_rx,DMA_IT_HT);//关闭 半传输中断(HT):当DMA传输了一半数据时触发。int fputc(int ch,FILE *str)
{HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,10);return ch;
}
由于串口的DMA配置的为正常模式,所以要在DMA完成一次传送后重新初始化
//业务逻辑写在此处即可
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{//串口接收事件处理 printf("uart dma:%s",uart_rx_dma_buffer); memset(uart_rx_dma_buffer,0,sizeof(uart_rx_dma_buffer));
}