/******************************************************************************** * File Name: MainTask.c * Function Describe:The main task for the system * Relate Module: * Explain: Hardware version is HS121 * Writer: ShiLiangWen * Date: 2015.7.8 *******************************************************************************/ #define THIS_FILE_ID 7 //--------------------------------------------------------------------------------- #include "includes.h" //OS ID OS_TID idMainTask=0; U64 stkMainTask[MAIN_TASK_STK_SIZE]; //===================================== unsigned char g_ucUart1Activated; //----- #ifdef USE_RUNNING_MAKE void RunningMake(unsigned short FileID,unsigned long line) { g_usFileID=FileID; g_ulFileLine=line; } #endif unsigned short g_usFileID=0; unsigned long g_ulFileLine=0; unsigned char g_ucSystemReset=0; /******************************************************************* *GetParaFromStr *从Str中找到Para=后面至';'或非字符的字串并放入Value 返回Value的长度 举例:Str="GT+SMP=IP=192.168.1.1;Port=12345" 如果Para="Port" 则Value将被赋值为"12345",并返回5 如果Para="IP" 则Value将被赋值为"192.168.1.1",并返回11 要求Para长度不大于20字节 ,Value长度不大于40字节 ********************************************************************/ int GetParaFromStr(char *Str,char *Para,char *Value) { int ValueLen=0,ParaLen=0; char ParaTemp[22]; char *p; char d; int i=0; if(0==*Str || 0==*Para)return 0; while(0!=(d=*Para) && ParaLen<20) { ParaTemp[i++]=d; if(d=='=' || d==';')return 0; Para++; ParaLen++; } ParaTemp[ParaLen++]='='; ParaTemp[ParaLen]=0; p=strstr(Str,ParaTemp); p+=ParaLen; //-- while(*p>0x20 && ';'!=*p && ValueLen<40) { *Value=*p; p++; Value++; ValueLen++; } *Value=0; return ValueLen; } /*********************************************** 强制复位 ************************************************/ void SystemReset(void) { g_ucSystemReset=1; SlwTrace(DEBUG,"Reboot now!\r\n"); while(1); } unsigned char AscToHex(unsigned char aHex) { if((aHex>=0)&&(aHex<=9)) aHex += 0x30; else if((aHex>=10)&&(aHex<=15))//A-F //aHex += 0x37; aHex += 0x57; else aHex = 0xff; return aHex; } void AscStrToHexStr(char *AscStr, char *HexStr) { char *pAscStr=AscStr; unsigned char d,h,l; while(0!=(d=(unsigned char)*pAscStr++)){ l=d&0x0f; h=d>>4; *HexStr++=AscToHex(h); *HexStr++=AscToHex(l); } *HexStr=0; } void PcMsgHandle(char *msg) { const char *CmdList[]={ "TM", //调试Modem "SWFI", //set wifiID and wifiPwd "RWFI", "SMP", //set IP and PSN "RMP", "XH", //set info "DEBUG", "NODEBUG", ""//必须以空字串为结束 }; unsigned short Port; unsigned long PSN,AKEY; char buf[100]; char strIP[40]; int i,j,temp,len; char flag; const char *pCmd; char *pMsg; int CmdListNum=0; RunMake(THIS_FILE_ID); pMsg = msg; while(*CmdList[CmdListNum++]);//计算命令列表个数 CmdListNum--; RunMake(THIS_FILE_ID); //查找与命令列表相同的命令位置 for(i=0;i=40){ break; } strcpy(sutProductPara.Wifi_ID,buf); len=GetParaFromStr(msg,"PWD",buf); if(len==0){ SlwTrace(INF,"PWD is null"); break; } strcpy(sutProductPara.Wifi_Pwd,buf); SaveProductParaToFlash(); break; case 2: //"RWFI" snprintf(buf, sizeof(buf),"RT+RWFI:ID=%s;PWD=%s",sutProductPara.Wifi_ID,sutProductPara.Wifi_Pwd); SlwTrace(INF,buf); break; case 3://"SMP" GT+SMP=IP=地址或域名;Port=端口号;PSN=终端序列号 len=GetParaFromStr(msg,"IP",buf); if(len<1 || len>=40){ //SlwTrace(INF,"GT+SMP:FAIL[IP Invalid]",1); break; } strcpy(strIP,buf); len=GetParaFromStr(msg,"Port",buf); if(len==0)Port=0; else if(len>5){ //SlwTrace(INF,"GT+SMP:FAIL[Port Invalid]",1); break; }else{ Port=atoi(buf); } len=GetParaFromStr(msg,"PSN",buf); if(len<1 || len>10){ //SlwTrace(INF,"GT+SMP:FAIL[PSN Invalid]",1); break; }else{ PSN=atol(buf); } //PSN sutProductPara.PSN=PSN; strcpy(sutProductPara.SIP,strIP); sutProductPara.Port=Port; SaveProductParaToFlash(); break; case 4://RMP snprintf(buf, sizeof(buf),"RT+RMP:PSN=%lu;Port=%d,IP=%s",sutProductPara.PSN,sutProductPara.Port,sutProductPara.SIP); SlwTrace(INF,buf); break; // case 5://SADDR // len=GetParaFromStr(msg,"ADDR",buf); // sutProductPara.addr=atoi(buf); // SaveProductParaToFlash(); // break; // case 6://RADDR // snprintf(buf, sizeof(buf),"RT+RADDR:ADDR=%d",sutProductPara.addr); // SlwTrace(INF,buf); // break; case 5: snprintf(buf, sizeof(buf),"RT+XH\r\n"); SlwTrace(INF,buf); g_ucModemTaskEn=1;//进入写号模式 break; case 6 : snprintf(buf, sizeof(buf),"RT+DEBUG\r\n"); SlwTrace(INF,buf); sutProductPara.Debug=1; SaveProductParaToFlash(); break; case 7 : snprintf(buf, sizeof(buf),"RT+NODEBUG\r\n"); SlwTrace(INF,buf); sutProductPara.Debug=0; SaveProductParaToFlash(); break; default: break; } RunMake(THIS_FILE_ID); // //AB CD E5 02 54 4D 32 5C // if(msg[0]=='T' && msg[1]=='M'){//0x544D // printf("----TM----\r\n"); // // ComSelect(COM_SEL_MODEM); // } } void ShowHex(unsigned char *pData,unsigned char len) { char temp[5]; char buf[100]; int i; if(len>(sizeof(buf)-3))len=(sizeof(buf)-3); buf[0]=0; for(i=0;i0){ //printf("rxbuffer1===%s,len==%d\r\n",RxBuffer1,g_usUart1RecvLen); Uart2Send((char *)RxBuffer1,g_usUart1RecvLen); g_usUart1RecvLen=0; } }else if(g_usUart1RecvLen){ //正常模式下,处理UART1发过来的命令 g_ucUart1Activated=1; //串口一有数据过来 if(RxBuffer1[0]==0xAA && RxBuffer1[1]==0xBB&& g_ucModemTaskEn==0){//处理485 从机过来的数据 ModbusRecvProcess(RxBuffer1); }else if(RxBuffer1[0]=='R' && RxBuffer1[1]=='T' && RxBuffer1[2]=='+'){//处理电脑发过来的RT指令数据包 PcMsgHandle((char *)RxBuffer1); } memset(RxBuffer1,0,sizeof(RxBuffer1)); g_usUart1RecvLen=0; } /********************是否扫描3次以保证确定从机个数,从而减少扫描所用时长*******************************/ //第一次扫描在线从机个数,及地址存储。 (还是说每次隔一段时间扫描个数) //已经登录且不处于发送状态时候查询。 if(sut_sys_status.Logined==1&&sut_sys_status.OnceFlag==0 &&sut_sys_status.SetSlaveing==0&& sut_sys_status.Resend==0) ModbusRefreshValue(); /*****************一秒一次*******************/ //ModbusCmdReadOneValue(0x0C); // 测试485查询 // if(os_time_get() < sucCt) continue; // sucCt = os_time_get()+100; // if(flag){ // Device_Down.sut_device_write[12].Addr=12; // Device_Down.sut_device_write[12].STU_RGB[6].R=1; // Device_Down.sut_device_write[12].STU_RGB[6].G=0; // Device_Down.sut_device_write[12].STU_RGB[6].B=0; // Device_Down.sut_device_write[12].STU_RGB[7].R=1; // Device_Down.sut_device_write[12].STU_RGB[7].G=0; // Device_Down.sut_device_write[12].STU_RGB[7].B=0; // ModbusCmdSetValue(&Device_Down.sut_device_write[12]); // flag=!flag; // }else{ // Device_Down.sut_device_write[12].Addr=12; // Device_Down.sut_device_write[12].STU_RGB[6].R=0; // Device_Down.sut_device_write[12].STU_RGB[6].G=1; // Device_Down.sut_device_write[12].STU_RGB[6].B=0; // Device_Down.sut_device_write[12].STU_RGB[7].R=0; // Device_Down.sut_device_write[12].STU_RGB[7].G=1; // Device_Down.sut_device_write[12].STU_RGB[7].B=0; // ModbusCmdSetValue(&Device_Down.sut_device_write[12]); // flag=!flag; // } if(os_time_get() < sucCt) continue; sucCt = os_time_get()+100; FEED_EXTWATCHDOG(); IWDG_ReloadCounter(); //ModbusCmdReadOneValue(0xff); //SlwTrace(DEBUG,"main while \r\n"); } }