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; } } }
//监听一个端口,返回一个命令 u8 Transmission::GetStateOrder(USART &ListeningCOM) { u8 comand[8]={0}; u8 ch=0; u8 num = ListeningCOM.ReceiveBufferSize(); if(num>7) //一帧命令包含8个字节 { ListeningCOM.GetReceivedData(&ch,1); if(ch == 0xFF) { ListeningCOM.GetReceivedData(&ch,1); if(ch == 0xDD) { while(ListeningCOM.ReceiveBufferSize()<6);//等待数据 comand[0]=0xff; comand[1]=0xDD; ListeningCOM.GetReceivedData(comand+2,6); ListeningCOM.ClearReceiveBuffer(); return CommandParsing(comand); //解包 } else return 0; } else return 0; } else return 0; }
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(); } } }
int main(){ u8 order=0; double record_updataSensor=0; double record_alive=0; double record_getwifi=0; bool network=false ; //网络连接标识位 char *ip = (char*)calloc(15, sizeof(char*) ); char *WifiName = (char*)calloc(20, sizeof(char*) ); char *WifiPassword = (char*)calloc(20, sizeof(char*) ); /*开机WIFI模式选择*****************************************************************/ if(wifimemory.getWifiSum()!=0)//判断表中是否已经保存wifi信息 { while( wifimemory.Load(WifiName,WifiPassword) ) { if(wifi.ConnectNetwork_client(WifiName,WifiPassword,SERVER_IP,1111)) //每次连接历时20秒 {network=true; break;} } if(network ==false) { wifi.ConnectNetwork_server(MODULE_COM,0); WIFI.ClearReceiveBuffer(); } } else { wifi.ConnectNetwork_server(MODULE_COM,0); WIFI.ClearReceiveBuffer(); } Led.SetLevel(1);//将指示灯熄灭(模式切换结束) /*END*********************************************************************************/ while(1) { order=CMCT_Tool.GetStateOrder(WIFI); switch(order) { case DELAY:{}break; /*启动********************************************************************************************/ case START:{//启动 while(1){ if(tskmgr.ClockTool(record_updataSensor,3)) //每三秒执行一次更新 { co2.Updata(); if(network) wifi.Send(20,CMCT_Tool.ToServerPack(CO2Number,co2.DATA_H,co2.DATA_L,0)); else wifi.Send(0,20,CMCT_Tool.ToClientPack(CO2Number,co2.DATA_H,co2.DATA_L,0)); } if(CMCT_Tool.GetStateOrder(WIFI)==DELAY) break; } }break; /*END********************************************************************************************/ /*复位******************************************************************************************/ case RESET:{//复位 wifimemory.ClearAllData(); //清空所有保存信息 *((u32 *)0xE000ED0C) = 0x05fa0004; }break; /*END******************************************************************************************/ /*获取WIFI信息*********************************************************************************/ case GETWIFI:{//得到wifi账号密码 record_getwifi=tskmgr.Time(); while(1) { if(CMCT_Tool.GetWifiNameAndPassword(WifiName,WifiPassword,WIFI) ) { //保存WIFI账号密码 com<<WifiName<<"\t"<<WifiPassword<<"\n"; break; } if(tskmgr.ClockTool(record_getwifi,30)) //超时10秒退出 break; } }break; /*END******************************************************************************************/ /*模式切换*************************************************************************************/ case MODEL:{//模式切换 wifi.ConnectNetwork_server(MODULE_COM,0); WIFI.ClearReceiveBuffer(); network=false; }break; /*END******************************************************************************************/ /*存活确认*************************************************************************************/ case ALIVE:{//存活确认 if(network) CMCT_Tool.SendAlive(wifi,CO2Number,1); //存活确认,数据位全为0xff else CMCT_Tool.SendAlive(wifi,CO2Number,0); }break; /*END******************************************************************************************/ /*常态******************************************************************************************/ default: { if(tskmgr.ClockTool(record_updataSensor,3)) //每三秒执行一次更新 co2.Updata();//当没有命令时更新传感器 if(tskmgr.ClockTool(record_alive,60)) //每60秒发送一次存活确认 { if(network) CMCT_Tool.SendAlive(wifi,CO2Number,1); else CMCT_Tool.SendAlive(wifi,CO2Number,0); } } } } }