一、stmCubeMX串口通信的步骤
1、新建一个文件,选择自己的芯片
2、配置时钟
3、配置串口
串口的模式解析可以跳转到以下文章查看
示例配置
假设你需要配置一个异步模式的USART1,波特率为115200,8个数据位,1个停止位,无奇偶校验,并启用中断:
- 选择USART1。
- 设置模式为异步模式。
- 设置波特率为115200。
- 设置数据位为8。
- 设置停止位为1。
- 设置奇偶校验为无。
- 启用中断:在“NVIC Settings”中勾选相应的中断。
-
4、配置时钟树
5、命名,保存项目
6、选择生成文件配置
二、生成的keil文件处理过程
1、usart.c
#include "stdio.h"
extern UART_HandleTypeDef huart1; //声明串口
/**
* 函数功能: 重定向c库函数printf到DEBUG_USARTx
* 输入参数: 无
* 返 回 值: 无
* 说 明:无
*/
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
return ch;
}
/**
* 函数功能: 重定向c库函数getchar,scanf到DEBUG_USARTx
* 输入参数: 无
* 返 回 值: 无
* 说 明:无
*/
int fgetc(FILE *f)
{
uint8_t ch = 0;
HAL_UART_Receive(&huart1, &ch, 1, 0xffff);
return ch;
}
2、main.c文件
命名一个数组,用来接收存储数据
#include "string.h"//需要额外包含的头文件
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#define RXBUFFERSIZE 256
char RxBuffer[RXBUFFERSIZE];
uint8_t aRxBuffer; //接收中断缓冲
uint8_t Uart1_Rx_Cnt = 0; //接收缓冲计数
想要验证输出,直接main函数中的循环里面,用printf串口打印自己想要输出的内容就可以
下面的代码是用来实现串口收发功能的,直接定义在main.c文件中就可以
在main函数的循环以外线调用一次接收中断函数
HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1);//接收中断
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
/* Prevent unused argument(s) compilation warning */
UNUSED(huart);
/* NOTE: This function Should not be modified, when the callback is needed,
the HAL_UART_TxCpltCallback could be implemented in the user file
*/
if(Uart1_Rx_Cnt >= 255) //溢出判断
{
Uart1_Rx_Cnt = 0;
memset(RxBuffer,0x00,sizeof(RxBuffer));
HAL_UART_Transmit(&huart1, (uint8_t *)"数据溢出", 10,0xFFFF);
}
else
{
RxBuffer[Uart1_Rx_Cnt++] = aRxBuffer; //接收数据转存
if(HAL_UART_GetState(&huart1) != HAL_UART_STATE_BUSY_RX) // 检查UART状态,判断是否接收完成
{
HAL_UART_Transmit(&huart1, (uint8_t *)&RxBuffer, Uart1_Rx_Cnt,0xFFFF); //将收到的信息发送出去
while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX);//检测UART发送结束
Uart1_Rx_Cnt = 0;
memset(RxBuffer,0x00,sizeof(RxBuffer)); //清空数组
}
}
HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1); //再开启接收中断
}