关于DC01/D01红外PM2.5传感器串口接收数据的STM32代码编写

先吐槽这家淘宝吧,问了客服只有文档,没有代码,看了网上的资料,没有这代码,一怒之下,拿起键盘CNM。最后还是老老实实写吧,也就一个串口中断接收程序,外加数据帧的完整接收。

直接贴主要代码!

u16 USART1_RxCounter = 0;
char USART1_RxBuff[1024];

volatile uint8_t ucTemp;            // 用于存储接收到的字节
volatile uint8_t u1_number = 0;     // 用于记录接收到的字节数量
volatile uint8_t DATAH = 0;         // 存储数据字节1
volatile uint8_t DATAL = 0;         // 存储数据字节2
volatile uint8_t CHECKSUM = 0;      // 存储校验字节


// 串口中断服务函数
void USART1_IRQHandler(void)
{
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
    {

        ucTemp = USART_ReceiveData(USART1); // 读取接收到的数据

        if(u1_number == 0 && ucTemp == 0xA5) // 如果是第一个字节且为特征字节
        {
            u1_number++;
        }
        else if(u1_number > 0 && u1_number < 4) // 如果已经接收到特征字节,继续接收数据
        {
            if(u1_number == 1)
            {
                DATAH = ucTemp;     // 存储数据字节1
                u1_number++;
            }
            else if(u1_number == 2)
            {
                DATAL = ucTemp;     // 存储数据字节2
                u1_number++;
            }
            else if(u1_number == 3)
            {
                CHECKSUM = ucTemp;  // 存储校验字节

                uint8_t sum = 0xA5 + DATAH + DATAL; // 计算校验和
                sum = sum ^ 0x80  ; // ^ 异或,得到低7位数据

                if(sum != CHECKSUM) // 如果最高位为1,则校验失败  ^ 异或,得到低7位数据
                {
                    // 可以在这里添加错误处理代码
                    u1_number = 0; //从新计数
                }
                else
                {
                    // 校验成功,计算浓度值
                    uint16_t concentration = (DATAH << 7) | (DATAL & 0x7F);
                    // 这里可以添加代码将浓度值发送给其他模块或显示
                    PM2_5_val = concentration;
                }
                u1_number = 0; // 重置计数器,准备接收下一帧数据
            }
        }
        else
        {
            u1_number = 0;  // 如果接收到的数据不是特征字节,重置计数器
        }

        USART_SendData(USART1, ucTemp); // 回显接收到的数据
        while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); // 等待发送完成
    }
}

然后就是配置串口的中断等等,这个不重要,但凡学过的都会,按照你自己的来就好,我就不贴了。

通信协议:

测试

阿里云云端数据查看

可以看到数据正常显示

一段时间后

串口上位机数据查看,

一段时间后

数据正常读取。

代码完美运行!!!

注意:这个传感器是要通过穿孔的折射光等等判断PM值,请正确摆放传感器!

另外贴上该新款传感器的数据手册:(新)D01粉尘传感器说明书

### 使用STM32 HAL 库与 DC01 红外 PM2.5 传感器 对于 STM32 单片机而言,通过 HAL 库来操作外部设备是一种常见的方式。当涉及到像 DC01 这样的红外 PM2.5 传感器时,通常会采用 UART 或者 I&sup2;C 接口进行通信。 #### 初始化UART接口用于数据传输 为了使能与 DC01 的通讯,在初始化阶段需先配置好相应的硬件资源,比如 GPIO 和 USART 外设: ```c // 定义USART句柄结构体变量 UART_HandleTypeDef huart; void MX_USARTx_UART_Init(void){ /* 配置USART参数 */ huart.Instance = USARTx; // 替换为实际使用的串口号 huart.Init.BaudRate = 9600; huart.Init.WordLength = UART_WORDLENGTH_8B; huart.Init.StopBits = UART_STOPBITS_1; huart.Init.Parity = UART_PARITY_NONE; huart.Init.Mode = UART_MODE_TX_RX; huart.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart) != HAL_OK){ Error_Handler(); } } ``` 上述代码展示了如何利用 HAL 函数 `HAL_UART_Init` 对指定的 USART 实例执行初始化设置[^1]。 #### 数据读取函数设计 针对 DC01 设备的数据获取过程,则可以通过编写专门的数据处理函数完成。下面给出了一种可能的设计思路: ```c uint8_t buffer[32]; // 缓冲区大小依据实际情况调整 int read_PM2p5_data(){ uint8_t i=0; memset(buffer, '\0', sizeof(buffer)); while(HAL_UART_Receive(&huart, &buffer[i], 1, 10)!= HAL_OK){} // 超时时间可根据需求设定 // 解析接收到的数据帧... // 此处省略具体解析逻辑... return parsed_value; // 返回最终计算得到的结果 } ``` 此部分实现了简单的字符流接收功能,并预留了解码环节供开发者进一步完善[^2]。 #### 文档建议 查阅官方提供的《STM32Cube固件包》文档以及 ST 提供的应用笔记 AN4547 “Getting started with the STM32Fxxx Hardware Abstraction Layer (HAL)” 可以为更深入理解 HAL API 提供帮助。另外,《DC01 用户手册》也是不可或缺的一部分参考资料,其中包含了有关该型号传感器工作原理及其命令集的重要信息[^3]。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

桂北研猛男

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值