📄 control.c
字号:
AT+CMGF 短信格式。分为Text模式和PDU模式AT+CNMI 设置新短消息通知电脑端AT+CSCA 短信中心AT+IPR? 显示串口波特率AT+IPR=19200更改串口波特率为19200AT&W 保存设置*/char cmd[16]; // 命令串char pdu[512]; // PDU串char ans[16];int gsmSendMessage(SM_PARAM* pSrc){ int nPduLength; // PDU串长度 unsigned char nSmscLength; // SMSC串长度 int nLength; // 串口收到的数据长度 nPduLength = gsmEncodePdu(pSrc, pdu); // 根据PDU参数,编码PDU串 strcat(pdu, "\x01a"); // 以Ctrl-Z结束// TRACE("%s", pdu); //zhao gsmString2Bytes(pdu, &nSmscLength, 2); // 取PDU串中的SMSC信息长度 nSmscLength++; // 加上长度字节本身 // 命令中的长度,不包括SMSC信息长度,以数据字节计 sprintf(cmd, "AT+CMGS=%d\r", nPduLength / 2 - nSmscLength); // 生成命令 SendGprsCmd(cmd,ans,sizeof(ans),1000); // 先输出命令串 SendGprsCmd(pdu,ans,sizeof(ans),1000); // 得到肯定回答,继续输出PDU串 return 1;}#define FL_DEL_ADD (1<<4)#define FL_DEL_0 (1<<3)#define FL_86 (1<<0)#define FL_106 (1<<1)int PreNumber(char* number){ if( number[0] == '1' && number[1] == '0' && number[2] == '6') // 小灵通号码 return 1; if( number[0] == '8' && number[1] == '6' ) return 1; return 0;}int GprsSendMessage(const char * oldnumber,const char *message){ char buffer[128]; char number[20]; SM_PARAM src; strcpy(number,oldnumber); if( 1 != PreNumber(number) ) { return 0; }#if 0 // TEXT SendGprsCmd("AT+CMGF=1\r\n",buffer,sizeof(buffer),1000); sprintf(buffer,"AT+CMGS=\"%s\"\r\n",number); SendGprsCmd(buffer,buffer,sizeof(buffer),1000); sprintf(buffer,"%s\x1a",message); SendGprsCmd(buffer,buffer,sizeof(buffer),1000);#else // PDU SendGprsCmd("AT+CMGF=0\r\n",buffer,sizeof(buffer),1000); memset(&src,0,sizeof(src)); //strcpy(src.SCA,"8613800200500"); strcpy(src.TPA,number); strcpy(src.TP_UD,message); src.TP_DCS = GSM_UCS2; gsmSendMessage(&src);#endif // return 0;}char GPS_HandleData(char* buffer);int GetGPSViewString(char* str,int len){ int ret; ret = GPS_HandleData(str); switch(ret) { case 1: // $GPGGA,121252.000,3937.3032,N,11611.6046,E,1,05,2.0,45.9,M,-5.7,M,,0000*77#if 0sprintf(str,"UTC: %02d:%02d:%02d::%03d\r\n" "%s %d.%d'%d\"\r\n%s %d.%d'%d\"\r\n" "Satellites:%d\r\n" "Altitude:%g meters\r\n", GPS_DATA.Time.Hour,GPS_DATA.Time.Min,GPS_DATA.Time.Sec,GPS_DATA.Time.ms, GPS_DATA.Latitude.Indicator == 'N' ? "North" : "South", GPS_DATA.Latitude.dd,GPS_DATA.Latitude.mm,GPS_DATA.Latitude.mmmm, GPS_DATA.Longtitude.Indicator == 'E' ? "East" : "West", GPS_DATA.Longtitude.ddd,GPS_DATA.Longtitude.mm,GPS_DATA.Longtitude.mmmm, GPS_DATA.StlUsed,((long)GPS_DATA.Altitude)*0.01 );#elsesprintf(str,"世界时间: %02d:%02d:%02d::%03d\r\n" "%s %d°%d'%d\"\r\n%s %d°%d'%d\"\r\n" "使用卫星:%d\r\n" "海拔高度:%g m\r\n", GPS_DATA.Time.Hour,GPS_DATA.Time.Min,GPS_DATA.Time.Sec,GPS_DATA.Time.ms, GPS_DATA.Latitude.Indicator == 'N' ? "北纬" : "南纬", GPS_DATA.Latitude.dd,GPS_DATA.Latitude.mm,GPS_DATA.Latitude.mmmm, GPS_DATA.Longtitude.Indicator == 'E' ? "东经" : "西经", GPS_DATA.Longtitude.ddd,GPS_DATA.Longtitude.mm,GPS_DATA.Longtitude.mmmm, GPS_DATA.StlUsed,((long)GPS_DATA.Altitude)*0.01 );#endif break; default: ret = -1 ; break; } return ret;}//// GPSchar * startchar(char * str,char endch ){ int i=0; char * Ptr; Ptr=str; while(str[i]) { if(str[i]==endch) { str[i]=0; return Ptr; } i++; if(i>30) break; } return NULL;}unsigned short StrTOUINT(char * str,char DBits){ char i=0; unsigned short j=0; if( DBits <= 5 ) { do { if(str[i] != '.') { j=(str[i]-0x30)+j*10; DBits--; } i++; }while(DBits > 0); } return j;}unsigned long str2i(char * str){ unsigned long v = 0; while(*str) { if( *str < '0' || *str > '9') str++; else break; } while(*str) { if( *str < '0' || *str > '9') break; v = v*10 + (*str-'0'); str++; } return v;}const char GGA_DATA_L[] = GGA_DATA;const char GLL_DATA_L[] = GLL_DATA;const char GSA_DATA_L[] = GSA_DATA;const char GSV_DATA_L[] = GSV_DATA;const char RMC_DATA_L[] = RMC_DATA;const char VTG_DATA_L[] = VTG_DATA;GPSDataQ_TYPE GPSDataQ[1];GPS_DATA_TYPE GPS_DATA;char GPS_HandleData(char* buffer){ unsigned char i,err,temp8,j; unsigned short temp16; char * temptr; char index; i = err = temp8 = j = 0; index = -1; temptr = buffer; temptr = strstr(temptr,GGA_DATA_L); if( temptr == 0 ) return -1;#define Search_Split()\if( 0 == startchar(temptr,',') );\if( temptr[0] == 0 ) return 1;\ if(strncmp(temptr,GGA_DATA_L,strlen(GGA_DATA_L)) == 0) { memset(&GPS_DATA,0,sizeof(GPS_DATA)); index=1; Search_Split(); temptr = temptr+strlen(temptr)+1;//$GPGGA, //UTC Search_Split(); GPS_DATA.Time.Hour = (U8)(StrTOUINT(temptr,2)); if( GPS_DATA.Time.Hour > 23 ) return -1; GPS_DATA.Time.Min = (U8)(StrTOUINT(temptr+2,2)); if( GPS_DATA.Time.Hour > 59 ) return -1; GPS_DATA.Time.Sec = (U8)(StrTOUINT(temptr+4,2)); if( GPS_DATA.Time.Hour > 59 ) return -1; GPS_DATA.Time.ms = StrTOUINT(temptr+7,strlen(temptr+7)); //.sss if( GPS_DATA.Time.Hour > 999 ) return -1; temptr = temptr + strlen(temptr)+1;//hhmmss.sss, //Latitude Search_Split(); GPS_DATA.Latitude.dd = (U8)(StrTOUINT(temptr,2)); GPS_DATA.Latitude.mm = (U8)(StrTOUINT(temptr+2,2)); GPS_DATA.Latitude.mmmm = StrTOUINT(temptr+5,4);//.mmmm temptr = temptr + 10;//ddmm.mmmm, //N/S Latitude Search_Split(); GPS_DATA.Latitude.Indicator = temptr[0]; temptr = temptr + 2;//N, //Longtitude Search_Split(); GPS_DATA.Longtitude.ddd = StrTOUINT(temptr,3); GPS_DATA.Longtitude.mm = (U8)(StrTOUINT(temptr+3,2)); GPS_DATA.Longtitude.mmmm = StrTOUINT(temptr+6,4);//.mmmm temptr = temptr + 11;//dddmm.mmmm, //E/W Longtitude Search_Split(); GPS_DATA.Longtitude.Indicator = temptr[0]; temptr = temptr + 2;//E, //Fix Indicator Search_Split(); GPS_DATA.Status = (U8)(StrTOUINT(temptr,1) << 4); temptr = temptr + 2;//1, //Satellites Used Search_Split(); GPS_DATA.StlUsed = (U8)(StrTOUINT(temptr,2)); temptr = temptr + 3;//07, //HDOP temptr = startchar( temptr,',' ); GPS_DATA.HDOP = (U8)( StrTOUINT(temptr, strlen(temptr)-1) ); temptr = temptr+strlen(temptr) + 1;//1.0, //Altitude temptr = startchar( temptr,',' ); if(temptr[0] == '-' )//负数 { float f; temptr++; sscanf(temptr,"%f,",&f); GPS_DATA.Altitude = f * 100; GPS_DATA.Altitude = 0-GPS_DATA.Altitude; } else { float f; sscanf(temptr,"%f,",&f); GPS_DATA.Altitude = f * 100; } }#if 0 else if(strncmp(temptr,GLL_DATA_L,strlen(GLL_DATA_L)) == 0) { index=0; GPSDataQ[i].State = 0; } else if(strncmp(temptr,GSA_DATA_L,strlen(GSA_DATA_L)) == 0) { index=3; startchar(temptr,','); temptr = temptr+strlen(temptr)+3;//$GPGSA,A, //MODE temp8 = (U8)(StrTOUINT(temptr,1)); GPS_DATA.Status = (GPS_DATA.Status & 0XF0) + temp8; temptr = temptr+2;//3, //Satellite for(j = 0; j < MAXSATELLITE; j++) { temptr = startchar( temptr,',' ); if(strlen(temptr) > 0) { GPS_DATA.Satellite[j].ID = (U8)( StrTOUINT(temptr, strlen(temptr)) ); } temptr = temptr + strlen(temptr) + 1;//07,//,, } //PDOP temptr = startchar( temptr,',' ); //GPS_DATA.PDOP = (U8)( StrTOUINT(temptr, strlen(temptr)-1) ); temptr = temptr + strlen(temptr) + 1;//1.0, //HDOP temptr = startchar( temptr,',' ); GPS_DATA.HDOP = (U8)( StrTOUINT(temptr, strlen(temptr)-1) ); temptr = temptr + strlen(temptr) + 1;//1.0, //VDOP temptr = startchar( temptr,'*' ); GPS_DATA.VDOP = (U8)( StrTOUINT(temptr, strlen(temptr)-1) ); } else if(strncmp(temptr,GSV_DATA_L,strlen(GSV_DATA_L)) == 0) { index=4; startchar(temptr,','); temptr = temptr + strlen(temptr)+3;//$GPGSV,2, temp8 = (U8)(StrTOUINT(temptr,1)); temp8 --; for(j = 0; j < 4; j++) { GPS_DATA.Satellite[temp8 * 4 + j].SNR = 0; } temptr = temptr + 2;//1, //Stl Use err = (U8)( StrTOUINT(temptr, 2 )); err = 12 - (temp8 * 4) ; err = ( err > 4 ) ? 4 : err; temptr = temptr + 3;//07, //Satellite message for(j = 0; j < err; j++) { //ID GPS_DATA.Satellite[temp8 * 4 + j].ID = (U8)( StrTOUINT(temptr, 2 )); temptr = temptr + 3;//07, //Elevation GPS_DATA.Satellite[temp8 * 4 + j].AZnEL = (U16)( StrTOUINT(temptr, 2 )); temptr = temptr + 3;//79, //Azimuth temp16 = (U16)( StrTOUINT(temptr, 3 )); temp16 = temp16 * 100; GPS_DATA.Satellite[temp8 * 4 + j].AZnEL = GPS_DATA.Satellite[temp8 * 4 + j].AZnEL + temp16; temptr = temptr + 4;//035, //SNR GPS_DATA.Satellite[temp8 * 4 + j].SNR = (U16)( StrTOUINT(temptr, 2 )); temptr = temptr + 3;//42, } } else if(strncmp(temptr,RMC_DATA_L,strlen(RMC_DATA_L)) == 0) { index=5; startchar(temptr,','); temptr = temptr + strlen(temptr)+12;//$GPRMC,HHMMSS.SSS, //data flag GPS_DATA.Time.Flag = temptr[0]; temptr = temptr + 27;//A,DDMM.MMMM,N,DDDMM.MMMM,W, startchar(temptr,','); temptr = temptr + strlen(temptr) + 1;//0.13, startchar(temptr,','); temptr = temptr + strlen(temptr) + 1;//306.62, GPS_DATA.Time.Day = (U8)( StrTOUINT(temptr, 2 )); temptr = temptr + 2;//dd; GPS_DATA.Time.Mon = (U8)( StrTOUINT(temptr, 2 )); temptr = temptr + 2;//mm; GPS_DATA.Time.Year = (U8)( StrTOUINT(temptr, 2 )); temptr = temptr + 2;//yy; } else if(strncmp(temptr,VTG_DATA_L,strlen(VTG_DATA_L)) == 0) { index=6; startchar(temptr,','); temptr = temptr + strlen(temptr)+1;//$GPVTG, startchar(temptr,','); temptr = temptr + strlen(temptr)+1;//309.62, startchar(temptr,','); temptr = temptr + strlen(temptr)+1;//T, startchar(temptr,','); temptr = temptr + strlen(temptr)+1;//, startchar(temptr,','); temptr = temptr + strlen(temptr)+1;//M, startchar(temptr,','); temptr = temptr + strlen(temptr)+1;//0.13, startchar(temptr,','); temptr = temptr + strlen(temptr)+1;//N, startchar(temptr,','); GPS_DATA.Speed = StrTOUINT( temptr, strlen(temptr)-1) ; }#endif return index;}// CANint g_canfd = -1;int g_canid = 0x123456;int CAN_Open(int canid){}int CAN_Send(stcSJA1000_BufInfo* Buf){}int CAN_Read(stcSJA1000_BufInfo* Buf){ return 0;}char* debugcanframe(char* str,stcSJA1000_BufInfo* Buf){ int i; char* ptr = str; ptr += sprintf(ptr,"ID=%d Length=%d Extend=%d\r\n", Buf->FrID,Buf->FrIf.Bits.DLC,Buf->FrIf.Bits.FF); for( i = 0; i < Buf->FrIf.Bits.DLC; i++) ptr += sprintf(ptr,"%02x ",Buf->DA[i]); ptr += sprintf(ptr,"\r\n"); return str;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -