这篇文章将详细介绍 串口 发送数据,接受数据。
如果想了解串口的基础知识可以参考我之前的文章:
STM32Cube串口USART发送接收数据
STM32CubeMX串口USART中断发送接收数据
使用 cubeMX 生成的 串口代码都放在 usart.c 中。
首先还是 先定义一个 串口对象,这是一个结构体。
初始化这个结构体中的相关参数。然后调用 HAL_UART_Init(&huart2)
对其初始化。
之后自动调转到HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
执行。
__HAL_RCC_USART2_CLK_ENABLE()
; 开启串口 2
由于 PA2, PA3 引脚,所以使用 __HAL_RCC_GPIOA_CLK_ENABLE();
使能 gpio 端口。
配置引脚:
这里 PA2 作为复用引脚(除了作为串口发送端,可能还具有其他的功能),它的工作模式 是GPIO_MODE_AF_PP复用推挽输出。
HAL_NVIC_SetPriority(USART2_IRQn, 0, 0)
设置优先级
HAL_NVIC_EnableIRQ(USART2_IRQn);
使能中断
这里我主要介绍最后一个参数 超时时间 Timeout 。 当使用这个函数 发送数据时,如果超过该时间,则直接返回错误,不再执行该函数。
HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout)
以中断的方式发送数据。这里就不需要超时时间了。
HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size)
HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
这里如果要点亮 led ,要在cubeMX 中配置 led 引脚。
uint8_t rx_buff = 0; // 存放接收的数据
/* 每次接收到数据后都会调用该串口回调函数 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart == &huart2)
{
if(rx_buff == 0xa1) // 发送 a1 点亮 led
{
printf("LED ON\r\n"); // 使用 printf 发送数据,需重定向 fputc 函数
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET);
}
else if(rx_buff == 0xa2) // 发送 a2 熄灭 led
{
printf("LED OFF\r\n");
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET);
}
}
HAL_UART_Receive_IT(&huart2,&rx_buff,1); // 再次开启接收
}
发送数据,可使用 printf 。
由于 printf 依赖于 fputc 函数
,所以可以重定向 fputc 来实现 printf 串口发送数据。
int fputc(int ch, FILE* f)
{
while(HAL_UART_Transmit(&huart2,(uint8_t*)&ch,sizeof(ch)-1,300) != HAL_OK);
return 0;
}
接收数据可以使用 scanf 。
int fgetc( FILE *f) /* scanf 输入 */
{
char c = 0;
while(HAL_UART_Receive(&huart1, (uint8_t *)&c, 1, 300) != HAL_OK);
return c;
}
下一篇文章为大家介绍 STM32 超声波 模块的使用。