基于HAL库ECB02蓝牙通过串口2串口透传,接收中断int型数据,蓝牙端发送数据串口2接收到通过串口1打印出来
时间: 2023-12-31 16:06:58 浏览: 150
首先,需要在HAL库中开启串口2和中断。可以使用下面的代码片段:
```c
// 串口2初始化
UART_HandleTypeDef huart2;
void MX_USART2_UART_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 MX_USART2_UART_Init_Interrupt(void)
{
/* 使能USART2的中断 */
HAL_NVIC_SetPriority(USART2_IRQn, 0, 1);
HAL_NVIC_EnableIRQ(USART2_IRQn);
}
// 串口2中断处理函数
void USART2_IRQHandler(void)
{
uint32_t isrflags = READ_REG(huart2.Instance->SR);
uint32_t cr1its = READ_REG(huart2.Instance->CR1);
uint32_t cr3its = READ_REG(huart2.Instance->CR3);
uint32_t errorflags;
/* 如果不是空闲中断,也不是接收中断,就直接返回 */
if (((isrflags & USART_SR_RXNE) == RESET) && ((isrflags & USART_SR_IDLE) == RESET))
return;
/* 如果是空闲中断 */
if ((isrflags & USART_SR_IDLE) != RESET)
{
/* 清空空闲中断标志 */
__HAL_UART_CLEAR_IDLEFLAG(&huart2);
/* 关闭空闲中断 */
__HAL_UART_DISABLE_IT(&huart2, UART_IT_IDLE);
/* 接收完成回调函数 */
HAL_UART_RxCpltCallback(&huart2);
return;
}
/* 如果是接收中断 */
if ((isrflags & USART_SR_RXNE) != RESET)
{
/* 获取错误标志 */
errorflags = (isrflags & (uint32_t)(USART_SR_PE | USART_SR_FE | USART_SR_ORE | USART_SR_NE));
/* 判断是否有错误 */
if (errorflags == RESET)
{
/* 接收完成回调函数 */
HAL_UART_RxCpltCallback(&huart2);
return;
}
else
{
/* 发生错误,丢弃数据 */
__HAL_UART_CLEAR_PEFLAG(&huart2);
__HAL_UART_CLEAR_FEFLAG(&huart2);
__HAL_UART_CLEAR_OREFLAG(&huart2);
__HAL_UART_CLEAR_NEFLAG(&huart2);
return;
}
}
}
```
然后,需要在代码中编写串口发送和接收函数。下面是两个简单的函数实例:
```c
// 发送数据到串口2
void send_data_to_uart2(uint8_t *buf, uint16_t len)
{
HAL_UART_Transmit(&huart2, buf, len, 0xFFFF);
}
// 从串口2接收数据
uint8_t receive_data_from_uart2(void)
{
uint8_t data;
HAL_UART_Receive(&huart2, &data, 1, 0xFFFF);
return data;
}
```
最后,需要在主函数中编写串口透传代码。下面是一个简单的示例:
```c
int main(void)
{
// 初始化串口2和中断
MX_USART2_UART_Init();
MX_USART2_UART_Init_Interrupt();
// 无限循环
while (1)
{
// 读取串口2接收到的数据
uint8_t data = receive_data_from_uart2();
// 发送数据到串口1
HAL_UART_Transmit(&huart1, &data, 1, 0xFFFF);
}
}
```
在这个示例中,我们不断从串口2接收数据,并将其发送到串口1。如果需要逆向操作,只需要更改发送和接收函数即可。
阅读全文