1.概述
模块为MH-Z14A二氧化碳传感器,UART输出,使用USART2。
2.接线
正极(引脚1)接P5的3脚5V,负极(引脚3)接P5的5脚GND,RXD(引脚11)接P5的6脚TXD,TXD(引脚19)接P5的7脚RXD。
3.调试关键问题
(1)波特率9600,数据位8位,停止位1位,校验位无。
(2)通信方式:STM32通过US2_TX发送读取CO2浓度的指令,传感器通过US2_RX返回浓度数据。
(3)读取气体浓度值命令
0xFF 0x01 0x86 0x00 0x00 0x00 0x00 0x00 0x79
返回值
0xFF 0x86 HIGH LOW - - - - 校验值
气体浓度值= HIGH * 256 + LOW
(4)校验和计算
<1>从Byte1 加至Byte7: 0x01 + 0x86 + 0x00 + 0x00 + 0x00 + 0x00 + 0x00 = 0x87
<2>取反:0xFF - 0x87 = 0x78
<3>对取反后加1:0x78 + 0x01 = 0x79
char getCheckSum(char *packet) { char i, checksum; for( i = 1; i < 8; i++) { checksum += packet[i]; } checksum = 0xff – checksum; checksum += 1; return checksum; }
(5)一开始使用USART_SendData函数向串口发送命令数据:
for(i = 0; i < 9; i++)//发送读取CO2气体浓度指令,发送完一个字节后必须延时一段时间传感器才能正确接收到指令
{
USART_SendData(USART2,CO2TxBuffer[i]);
delay_ms(100);
}
发现发送读取CO2气体浓度指令,发送完一个字节后必须延时一段时间传感器才能正确接收到指令,共发送9字节。
后来发现有专门的发送数据函数USART_SendData_Length(USART2,CO2TxBuffer,9):
void USART_SendData_Length(USART_TypeDef* USARTx, u8* Data,u16 length)
{
/* Check the parameters */
u16 i;
for(i=0;i<length;i++)
{
USART_SendData(USARTx, Data[i]);//向串口发送数据
while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)!=SET);//等待发送结束
}
(6)串口2中断处理函数,更新CO2气体浓度数据CO2Data:
void USART2_IRQHandler(void) //串口2中断服务程序
{
char i, checksum = 0;
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //接收中断
{
USART_RX_BUF_2[USART2Count++] = USART_ReceiveData(USART2);//读取9字节到USART_RX_BUF_2
if(USART2Count == 9)
USART2Count = 0;//当接收到第9个字符后,从数组USART_RX_BUF_1的开头开始写
//计算校验和
//1、从Byte1 加至Byte7: 0x01 + 0x86 + 0x00 + 0x00 + 0x00 + 0x00 + 0x00 = 0x87
//2、取反:0xFF - 0x87 = 0x78
//3、对取反后加1:0x78 + 0x01 = 0x79
for( i = 1; i < 8; i++)
{
checksum += USART_RX_BUF_2[i];
}
checksum = 0xff - checksum;
checksum += 1;
}
if(checksum == USART_RX_BUF_2[8])//证明接收到的数据是正确的
CO2Data = USART_RX_BUF_2[2] * 256 + USART_RX_BUF_2[3];
}
(7)代码地址
4.MH-Z14A二氧化碳传感器资料
有需要请加QQ:1447491726,进行详细的技术交流,共同进步。