co2.h
#ifndef __CO2_H
#define __CO2_H
#include "./SYSTEM/sys/sys.h"
void CO2_Init(uint32_t baudrate);
uint16_t CO2_Parse_Data(uint8_t* data);
void USART2_IRQHandler(void);
uint16_t CO2_Get_Concentration(void);
#endif
co.c
#include "./SYSTEM/sys/sys.h"
#include "./BSP/co2/co2.h"
#include "./SYSTEM/usart/usart.h"
#define USART2_RX_BUFFER_SIZE 256 // 接收缓冲区大小
#define CO2_DATA_LENGTH 6 // CO2数据包长度
UART_HandleTypeDef huart2;
uint8_t rx_Buffer[USART2_RX_BUFFER_SIZE];
uint16_t rxIndex = 0;
uint16_t co2_value;
UART_HandleTypeDef huart2;
void CO2_Init(uint32_t baudrate) {
// 使能USART2和GPIOA时钟
__HAL_RCC_USART2_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
// 配置GPIO
GPIO_InitTypeDef GPIO_InitStruct = {0};
// PA2作为TX
GPIO_InitStruct.Pin = GPIO_PIN_2;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// PA3作为RX
GPIO_InitStruct.Pin = GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// 配置UART
huart2.Instance = USART2;
huart2.Init.BaudRate = baudrate;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_NONE;
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart2.Init.Mode = UART_MODE_TX_RX;
// 初始化UART
if (HAL_UART_Init(&huart2) != HAL_OK) {
// 错误处理
while(1);
}
// 配置NVIC
HAL_NVIC_SetPriority(USART2_IRQn, 1, 0);
HAL_NVIC_EnableIRQ(USART2_IRQn);
// 使能接收中断和空闲中断
__HAL_UART_ENABLE_IT(&huart2, UART_IT_RXNE);
__HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);
}
uint16_t CO2_Parse_Data(uint8_t* data) {
// if (data[0] != 0x2C) {
// // 数据包头不匹配,返回错误值
// return 0xFFFF;
// }
// 计算CO2浓度
uint16_t co2_concentration = (data[1] << 8) | data[2];
return co2_concentration;
}
void USART2_IRQHandler(void) {
uint8_t received_byte;
if (__HAL_UART_GET_FLAG(&huart2, UART_FLAG_RXNE) != RESET) {
received_byte = (uint8_t)(huart2.Instance->DR & 0xFF);
if (rxIndex < USART2_RX_BUFFER_SIZE) {
rx_Buffer[rxIndex++] = received_byte;
}
// 检查是否接收到完整的数据包
if (rxIndex >= CO2_DATA_LENGTH) {
co2_value = CO2_Parse_Data(&rx_Buffer[rxIndex - CO2_DATA_LENGTH]);
// 重置接收索引
rxIndex = 0;
}
}
if (__HAL_UART_GET_FLAG(&huart2, UART_FLAG_IDLE) != RESET) {
__HAL_UART_CLEAR_IDLEFLAG(&huart2);
// 处理空闲中断,如果需要的话
}
}
// 获取最新的CO2浓度值
uint16_t CO2_Get_Concentration(void) {
return co2_value;
}
关注我
GitHub
:https://github.com/PastKing
Gitee
:https://gitee.com/past-dust
公众号:
© 版权声明
THE END
暂无评论内容