STM32L431使用HAL库串口3接收中断和空闲中断来处理“ER 0001 14”获取其中空格两端的数据“ER”、“0001”、“14”
时间: 2023-11-04 14:04:41 浏览: 262
好的,以下是基本的代码框架,供您参考:
```c
#include "stm32l431xx.h"
#include "stm32l4xx_hal.h"
UART_HandleTypeDef huart3; // 定义串口句柄
// 定义接收缓冲区和缓冲区指针
uint8_t rx_buffer[32];
uint8_t *rx_ptr = rx_buffer;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) // 接收中断回调函数
{
if (*rx_ptr == '\r') // 收到回车符,表示接收数据完成
{
// 处理接收到的数据
// 从 rx_buffer 中解析出数据,比如 "ER 0001 14"
// 处理后的数据可以保存到其他变量中,比如 error_code, parameter1, parameter2
// ...
rx_ptr = rx_buffer; // 重置缓冲区指针
}
else
{
rx_ptr++; // 缓冲区指针后移
}
HAL_UART_Receive_IT(&huart3, rx_ptr, 1); // 继续接收下一个字符
}
void HAL_UART_IdleCallback(UART_HandleTypeDef *huart) // 空闲中断回调函数
{
HAL_UART_RxCpltCallback(huart); // 转发到接收中断回调函数处理
}
int main(void)
{
// 初始化 HAL 库和串口3
HAL_Init();
__HAL_RCC_USART3_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_10 | GPIO_PIN_11;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF7_USART3;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
huart3.Instance = USART3;
huart3.Init.BaudRate = 115200;
huart3.Init.WordLength = UART_WORDLENGTH_8B;
huart3.Init.StopBits = UART_STOPBITS_1;
huart3.Init.Parity = UART_PARITY_NONE;
huart3.Init.Mode = UART_MODE_TX_RX;
huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart3.Init.OverSampling = UART_OVERSAMPLING_16;
HAL_UART_Init(&huart3);
// 开启接收中断和空闲中断
HAL_UART_Receive_IT(&huart3, rx_ptr, 1);
__HAL_UART_ENABLE_IT(&huart3, UART_IT_IDLE);
while (1)
{
// 主循环中可以处理其他任务
// ...
}
}
```
在上面的代码中,我们定义了一个 rx_buffer 数组作为接收缓冲区,并定义了一个 rx_ptr 指针指向接收缓冲区的开头。在 HAL_UART_RxCpltCallback 回调函数中,每次接收到一个字符,我们判断是否收到回车符,如果收到,则表示接收数据完成,可以对接收到的数据进行处理了。如果没有收到回车符,我们只需要将 rx_ptr 指针后移,以便接收下一个字符。
在 HAL_UART_IdleCallback 回调函数中,我们调用了 HAL_UART_RxCpltCallback 函数来处理空闲中断。因为我们开启了空闲中断,在没有数据传输的情况下,串口会进入空闲状态,这时会触发空闲中断。
在主循环中,我们可以处理其他任务。如果没有其他任务需要处理,可以使用 WFI 指令让 CPU 进入低功耗模式,等待中断事件的发生。
阅读全文