文章中若有错误,请在评论区留言,谢谢大家
STM32H7系列教程(5)UART串口通信
设置STM32cubeMX
选择异步通信Asynchronous
查看生成的代码
HAL_UART_Transmit(); //串口发送数据
HAL_UART_Receive(); //串口接收数据
HAL_UART_Transmit_IT(); //串口中断模式发送数据
HAL_UART_Receive_IT(); //串口中断模式接收数据
HAL_UART_Transmit_DMA(); //串口DMA模式发送数据
HAL_UART_Receive_DMA(); //串口DMA模式接收数据
UART串口发送/接收
重定义print函数
重定义函数前需要开启MicroLIB
#include <stdio.h> //添加头文件
extern UART_HandleTypeDef huart8; //声明串口
将下面的函数添加到mian.c文件中
/* USER CODE BEGIN 0 */
/**
* 函数功能: 重定向c库函数printf到DEBUG_USARTx
*/
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart8, (uint8_t *)&ch, 1, 0xffff);
return ch;
}
/**
* 函数功能: 重定向c库函数getchar,scanf到DEBUG_USARTx
*/
int fgetc(FILE *f)
{
uint8_t ch = 0;
HAL_UART_Receive(&huart8, &ch, 1, 0xffff);
return ch;
}
/* USER CODE END 0 */
编写代码
/* USER CODE BEGIN WHILE */
while (1)
{
printf("Uart8 Test!\n\r");
HAL_Delay(1000);
/* USER CODE END WHILE */
将代码上传到开发板,并打开串口助手查看结果
中断接收
//在mian.c文件中添加
#define RXBUFFERSIZE 256 //最大接收字节数
char RxBuffer[RXBUFFERSIZE]; //接收数据
uint8_t aRxBuffer; //接收中断缓冲
uint8_t Uart8_Rx_Cnt = 0; //接收缓冲计数
//在while循环前启动串口中断
HAL_UART_Receive_IT(&huart8, (uint8_t *)&aRxBuffer, 1);
/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
/* 防止未使用的参数编译警告 */
UNUSED(huart);
/* 注意: 需要回调时,不应修改该函数、
可在用户文件中实现 HAL_UART_TxCpltCallback */
if(Uart8_Rx_Cnt >= 255) //溢出判断
{
Uart8_Rx_Cnt = 0;
memset(RxBuffer,0x00,sizeof(RxBuffer));
HAL_UART_Transmit(&huart8, (uint8_t *)"数据溢出", 10,0xFFFF);
}
else
{
RxBuffer[Uart8_Rx_Cnt++] = aRxBuffer; //接收数据转存
if((RxBuffer[Uart8_Rx_Cnt-1] == 0x0A)&&(RxBuffer[Uart8_Rx_Cnt-2] == 0x0D)) //判断结束位
{
printf("Uart8收到的数据:\n\r");
HAL_UART_Transmit(&huart8, (uint8_t *)&RxBuffer, Uart8_Rx_Cnt,0xFFFF); //将收到的信息发送出去
while(HAL_UART_GetState(&huart8) == HAL_UART_STATE_BUSY_TX);//检测UART发送结束
Uart8_Rx_Cnt = 0;
memset(RxBuffer,0x00,sizeof(RxBuffer)); //清空数组
}
}
HAL_UART_Receive_IT(&huart8, (uint8_t *)&aRxBuffer, 1); //再开启接收中断
}
/* USER CODE END 4 */