bool MHZ14::Updata() { //向模块发送获取数据 CO2.SendData(Command_getvalue,9); //判断是否有数据返回 if(CO2.ReceiveBufferSize()<9) { CO2.ClearReceiveBuffer(); //清空接收缓存 return false; } else { CO2.GetReceivedData(rev_buffer,9); //取出一帧数据 CO2.ClearReceiveBuffer(); //清空接收缓存 if(SumCheck(rev_buffer)==false) //校验和 return false; else { DATA_H=rev_buffer[2]; DATA_L=rev_buffer[3]; CO2_Concentration=rev_buffer[2]*256+rev_buffer[3]; //计算浓度 return true; } } }
int main() { u8 command[6]; u8 datatemp[18];//数据暂存 u8 tagInfo[18]; u8 sensor[16];//保存传感器型号 u8 basic_information[6];//基础信息 u8 version[16];//版本 tskmgr.DelayMs(1000); tskmgr.DelayMs(1000); //设置模式 //设置名字密码 //设置IP地址 //复位 WIFI.SendData(CLOSS,6); //关闭回显 tskmgr.DelayMs(1000); WIFI.SendData(Command1,13); //开启多路连接 tskmgr.DelayMs(1000); WIFI.SendData(Command2,21); //开启服务器模式 tskmgr.DelayMs(1000); equipment[0]=2;//测试用 将设备二加入 // DATA_COM.SendData(c,8); //连续发送命令 while(1) { //接收从模块数据 if(DATA_COM.ReceiveBufferSize()>=40) //如果接收到了一帧数据 { u32 check=10,moduleNo; u8 sum=0; u8 FFAA=0; DATA_COM.GetReceivedData(&FFAA,1); //找包头 if(FFAA==0xff) { DATA_COM.GetReceivedData(&FFAA,1); //找包头 if(FFAA==0xcc) { DATA_COM.GetReceivedData(datatemp,18); moduleNo=datatemp[0]+datatemp[1]+datatemp[2]+datatemp[3]; for(u8 i=0;i<10;i++) //查询是否有这个设备 { if(moduleNo==equipment[i]) check=0;//有这个设备 } for(u8 i=0;i<16;i++) { sum+=datatemp[i]; //j校验和 } sum=sum+0XCB; //加上包头 if(sum==datatemp[17]) check=check+1; //使用WIFI发送数据给上位机 if(check==1) { WIFI.SendData(Command3,17); tskmgr.DelayMs(100); WIFI.ClearSendBuffer(); WIFI.SendData(packgroup.MAINToUser(datatemp[5],datatemp[6],datatemp[7],moduleNo,datatemp[4]),20); tskmgr.DelayMs(100); WIFI.ClearReceiveBuffer();//清除接收缓存 WIFI.ClearSendBuffer(); //清除发送缓存 } } } } //从上位机得到命令() if(WIFI.ReceiveBufferSize()>40) { u8 ch=0; u8 temp_cmd; u32 temp; //test while(WIFI.ReceiveBufferSize()>8) { WIFI.GetReceivedData(&ch,1); if(ch==0xff)//判断包头 { WIFI.GetReceivedData(&ch,1); if(ch==0xdd)//判断包头 { //得到指令 WIFI.GetReceivedData(command,6); WIFI.ClearReceiveBuffer(); temp_cmd=command[4]; //得到命令位 temp=command[0]+command[1]+command[2]+command[3];//得到设备号 //命令处理 if(temp_cmd==0XAA)//如果命令是注册 { //读取RFID 将结果给上位机********************************************* double in_time; in_time=tskmgr.Time(); rfid.PCDInit(); while(1) { tskmgr.DelayMs(500); if(tskmgr.Time()-in_time>=20) //60秒读取等待 { //返回结束 break; } if(rfid.FindCard(MFRC522_PICC_REQALL,tagInfo))//寻到卡 { if(rfid.PcdAntiColl(tagInfo)) { if(rfid.PcdSelect(tagInfo))//选卡,卡号为前一步找到的卡号 { if(rfid.PcdAuthState(MFRC522_PICC_AUTHENT1A,5,(unsigned char*)DefaultKey,tagInfo))//校验A密匙 { rfid.PcdRead(5,basic_information);//第五块 rfid.PcdRead(6,sensor);//第六块 } if(rfid.PcdAuthState(MFRC522_PICC_AUTHENT1A,9,(unsigned char*)DefaultKey,tagInfo))//校验A密匙 { rfid.PcdRead(9,version);//第9块 } equipment_confirm(basic_information);//设备号存在判断,没有就存入 WIFI.SendData(Command3,17); tskmgr.DelayMs(100); WIFI.ClearSendBuffer(); WIFI.SendData(packgroup.registered(basic_information,sensor,version),20);//打包发送 WIFI.SendData(a,6); tskmgr.DelayMs(500);//这里必须保证充足的延时才能发送下一半 } } } } } else if(temp_cmd==0XDD)//如果命令是删除 { for(int n=0;n<10;n++) { if(temp==equipment[n]) equipment[n]=0; //删除这个设备 } } else { DATA_COM.SendData(packgroup.CmmandTomodule(temp_cmd,temp),8); } } } } WIFI.ClearReceiveBuffer(); } } }