基于HAL库串口2中断接收int型数据,通过串口1打印出来
时间: 2023-06-25 10:01:59 浏览: 115
STM32开发,移植修改官方HAL例程,实现串口Printf打印功能
下面是一个基于HAL库的示例代码:
```c
#include "stm32f4xx_hal.h"
#include <stdio.h>
// 定义串口1和串口2的句柄
UART_HandleTypeDef huart1;
UART_HandleTypeDef huart2;
// 定义接收缓冲区
uint8_t rxData[1];
uint8_t rxBuffer[10];
uint8_t rxIndex = 0;
// 定义变量用于存储接收到的数据
int receivedData;
// 串口1初始化函数
void UART1_Init(void)
{
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1) != HAL_OK)
{
Error_Handler();
}
}
// 串口2初始化函数
void UART2_Init(void)
{
huart2.Instance = USART2;
huart2.Init.BaudRate = 115200;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_NONE;
huart2.Init.Mode = UART_MODE_TX_RX;
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart2.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart2) != HAL_OK)
{
Error_Handler();
}
}
// 串口2中断接收函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if (huart->Instance == USART2)
{
rxBuffer[rxIndex++] = rxData[0];
if (rxIndex == 10)
{
// 接收完成,将接收到的10个字节转换成int类型
receivedData = atoi((const char *)rxBuffer);
// 将接收到的数据通过串口1发送出去
char sendData[20];
sprintf(sendData, "Received data: %d\r\n", receivedData);
HAL_UART_Transmit(&huart1, (uint8_t *)sendData, strlen(sendData), HAL_MAX_DELAY);
// 重置接收缓冲区和计数器
memset(rxBuffer, 0, sizeof(rxBuffer));
rxIndex = 0;
}
// 继续接收下一个字节
HAL_UART_Receive_IT(&huart2, rxData, 1);
}
}
int main(void)
{
// 初始化串口1和串口2
HAL_Init();
UART1_Init();
UART2_Init();
// 开启串口2中断接收
HAL_UART_Receive_IT(&huart2, rxData, 1);
while (1)
{
// 程序主循环
}
}
```
在上面的代码中,我们首先定义了两个串口句柄 `huart1` 和 `huart2`,并且定义了一个接收缓冲区 `rxBuffer`,用于存储接收到的数据。
在 `UART2_Init()` 函数中,我们配置了串口2的参数,并通过 `HAL_UART_Init()` 函数初始化了串口2。
在 `HAL_UART_RxCpltCallback()` 函数中,我们实现了串口2的中断接收处理。当接收到一个字节时,我们将其存储到接收缓冲区 `rxBuffer` 中,并将计数器 `rxIndex` 加一。当 `rxIndex` 的值等于 10 时,说明接收完成,我们将接收到的 10 个字节通过 `atoi()` 函数转换成 `int` 类型,并通过串口1发送出去。最后,我们重置接收缓冲区和计数器,并再次开启串口2的中断接收。
在 `main()` 函数中,我们首先初始化了串口1和串口2,并开启了串口2的中断接收。在程序主循环中,我们没有做任何事情,因为串口2的中断接收已经能够自动处理接收到的数据了。
阅读全文