?? debug.c
字號:
if(ListBuf[ii]=='L')
{
cmgl_state=1;
list_index_begin=ii;
}
}
else if(cmgl_state==1)
{
if(ListBuf[ii]==LF)
{
delay();
list_index_end=strpos(ListBuf+list_index_begin,',');
list_index_end=list_index_begin+list_index_end;
memcpy(list_indexlist+listcmdindex,ListBuf+list_index_begin+2,list_index_end-list_index_begin-2);
listcmdindex+=list_index_end-list_index_begin-1;
list_indexlist[listcmdindex-1]=0;
listcmd_count++; //短信條數
list_PDU_begin=ii+1; //pdu的起始地址即LF后一字節
if(ListBuf[list_index_end+1]=='0') //判斷短信是否為已讀狀態
cmgl_state=2;
else
cmgl_state=0;
}
}
else if(cmgl_state==2) //處理未讀的短信
{
if(ListBuf[ii]==LF)
{
list_PDU_end=ii-2;
memcpy(PDUBuf,ListBuf+list_PDU_begin,list_PDU_end-list_PDU_begin+1);
PDUBuf[list_PDU_end-list_PDU_begin+1]=0;
PDU2SMS(PDUBuf);
Data_processing();
cmgl_state=0;
wait_5s();
}
}
}
//delete message
listcmdindex=0;
for(j=0;j<listcmd_count;j++)
{
strcpy(CMDBuf,"AT+CMGD=");
strcpy(CMDBuf+strlen(CMDBuf),list_indexlist+listcmdindex);
listcmdindex+=strlen(list_indexlist+listcmdindex)+1;
CMDBuf[strlen(CMDBuf)]='\r';
CMDBuf[strlen(CMDBuf)]=0;
send_string(CMDBuf);
wait_5s();
}
// state variable reset
listcmd_count=0;
bListEnd=0;
listchar_count=0;
list_index_begin=0;
list_index_end=0;
listcmdindex=0;
memset(ListBuf,0,sizeof(ListBuf));
memset(PDUBuf,0,sizeof(PDUBuf));
memset(list_indexlist,0,sizeof(list_indexlist));
}
}
/////////////function: 把兩ascii字節合并成一char 例如"35"變為0x35;//////////////
uchar hex2int(uchar * str)
{
uchar highbyte;
uchar lowbyte;
highbyte = toint(str[0]); //asii to 0x00~0x09 OR 0x0a~0xf
lowbyte = toint(str[1]);
return highbyte*16+lowbyte;
}
/////////function: 把char變為字符串 例如0x36 "36"/////////////////////////////
void int2hex(uchar num,uchar *dest)
{
uchar highbyte;
uchar lowbyte;
highbyte = num/16;
lowbyte = num-highbyte*16;
if(highbyte>9)
dest[0]=highbyte+ALPHABASE;
else
dest[0]=highbyte+NUMBASE;
if(lowbyte>9)
dest[1]=lowbyte+ALPHABASE;
else
dest[1]=lowbyte+NUMBASE;
dest[2]=0;
}
///function: PDU 7位編碼程序,將源字符串數組str轉換為手機可以識別的dest字符串 SMS->PDU///
uchar PDU7BitEncode(char * str,char * dest)
{
uchar nSrc; // 源字符串的計數值
uchar nChar; // 當前正在處理的組內字符字節的序號,范圍是0-7
uchar nLeft; // 上一字節殘余的數據
uchar nSrcLength = strlen(str);
char * pSrc = str;
char * pDst = dest;
// 計數值初始化
nSrc = 0;
// 將源串每8個字節分為一組,壓縮成7個字節
// 循環該處理過程,直至源串被處理完
// 如果分組不到8字節,也能正確處理
while(nSrc<=nSrcLength)
{
// 取源字符串的計數值的最低3位
nChar = nSrc&7;
// 處理源串的每個字節
if(nChar == 0)
{
// 組內第一個字節,只是保存起來,待處理下一個字節時使用
nLeft = *pSrc;
}
else
{
// 組內其它字節,將其右邊部分與殘余數據相加,得到一個目標編碼字節
uchar temp;
temp = (*pSrc<<(8-nChar))|nLeft;
int2hex(temp,pDst);
// 將該字節剩下的左邊部分,作為殘余數據保存起來
nLeft = *pSrc >> nChar;
// 修改目標串的指針和計數值
pDst=pDst+2;
}
// 修改源串的指針和計數值
pSrc++;
nSrc++;
}
*pDst=0;
return (pDst-dest)/2;
}
///////////////function: decode PDU to SMS//////////////////////////////////////
void PDU7BitDecode(char * str,char * dest)
{
int length=strlen(str)/2;
uchar remainder=0;
uchar j=0;
uchar i=0;
uchar tt=0;
uchar original;
uchar index;
uchar tmp;
for(i=0;i<length;i++)
{
original=hex2int(str+2*i);
index=i%7;
tt=(i+1)%7;
tmp=original;
tmp=tmp<<index;
if(tt==0)
{
dest[j]=(tmp&0x7f)+remainder;
j++;
dest[j]=(original>>1)&0x7f;
remainder=0;
}
else
{
dest[j]=(tmp&0x7f)+remainder;
remainder=original>>(8-index-1);
}
j=j+1;
}
dest[sms_deliver.PDUDataLen]=0;
}
//////////////function:發送AT+CMGS命令,然后發送數據信息///////////////////////
void send_response()
{
uchar tmp=0;
uchar lenoflen,quot;
uchar bitcodedlen = 0;
tmp=strlen(sms_deliver.PDUData);
quot=tmp/8;
bitcodedlen=quot*7+tmp%8; //the length of the PDUData after compact(7->8)
///發送前先檢驗網絡注冊情況
send_string("AT+COPS=0\r"); //GSM network operator is to be selected automatically
delay_1s();
delay_1s();
put_string(0x80,RcvBuf); //顯示出來返回的結果
send_string("AT+COPS?\r"); //read the status to GSM network operator
delay_160ms();
put_string(0x80,RcvBuf); //顯示出來返回的結果
strcpy(CMDBuf,"AT+CMGS="); //AT+CMGS=<數據長度>命令
lenoflen=itoa(bitcodedlen+PhoneNumLen+2,CMDBuf+8); //PhoneNumLen+2位手機號碼 8:"AT+CMGS="八個字符
CMDBuf[8+lenoflen]=CR;
CMDBuf[8+lenoflen+1]=0;
send_string(CMDBuf); //send command
delay();
encode_message();
delay_160ms();
send_string(SendBuf); //send SMS
delay_1s();
delay();
}
////////////////////function:convert the PDU data to SMS////////////////////////
void PDU2SMS(char * Buf)
{
uchar index=0;
delay();
sms_deliver.SMSCLen=hex2int(Buf);
sms_deliver.AddressType[0]=Buf[2];
sms_deliver.AddressType[1]=Buf[3];
sms_deliver.AddressType[2]=0;
PDUHalf8bitDecode(Buf+4,(sms_deliver.SMSCLen-1)*2,sms_deliver.ServiceCenter);
sms_deliver.ServiceCenter[16]=0;
index=4+(sms_deliver.SMSCLen-1)*2;
sms_deliver.SMSDeliver1[0]=Buf[index];
sms_deliver.SMSDeliver1[1]=Buf[index+1];
sms_deliver.SMSDeliver1[2]=0;
index=index+2;
sms_deliver.PhoneNumLen=hex2int(Buf+index);
sms_deliver.PhoneNumType[0]=Buf[index+2];
sms_deliver.PhoneNumType[1]=Buf[index+3];
sms_deliver.PhoneNumType[2]=0;
memset(sms_deliver.PhoneNumber,'\0',strlen(sms_deliver.PhoneNumber));
PDUHalf8bitDecode(Buf+index+4,sms_deliver.PhoneNumLen,sms_deliver.PhoneNumber);
sms_deliver.PhoneNumber[sms_deliver.PhoneNumLen]=0;
index=index+4+sms_deliver.PhoneNumLen+1;
sms_deliver.ProtocolFlag[0]=Buf[index];
sms_deliver.ProtocolFlag[1]=Buf[index+1];
sms_deliver.ProtocolFlag[2]=0;
sms_deliver.EncodeType[0]=Buf[index+2];
sms_deliver.EncodeType[1]=Buf[index+3];
sms_deliver.EncodeType[2]=0;
PDUHalf8bitDecode(Buf+index+4,14,sms_deliver.TimePost);
sms_deliver.TimePost[14]=0;
sms_deliver.PDUDataLen=hex2int(Buf+index+18);
if(strcmp(sms_deliver.EncodeType,"00")==0)
PDU7BitDecode(Buf+index+20,sms_deliver.PDUData);
if(sms_deliver.PhoneNumLen)
PhoneNumLen=sms_deliver.PhoneNumLen;
delay();
}
///////////////////function: decode phone///////////////////////////////////////
void PDUHalf8bitDecode(char * str,uchar len,char * dest)
{
char i=0;
for(i=0;i<len;i=i+2)
{
dest[i]=str[i+1];
dest[i+1]=str[i];
}
if(dest[len-1]=='F')
dest[len-1]=0;
}
///function:process the new SMS,check if the center phone is changed////////////
void Data_processing()
{
delay();
if(sms_deliver.EncodeType[1]=='0')
{
if(strncmp(sms_deliver.PDUData,"ABC123",6)==0)
//正確的數據格式:密碼(ABC123)+手記號碼(8613810736479)+校驗和
{
if(ascii_verify(sms_deliver.PDUData))
{
memset(center_phone,0,sizeof(center_phone));
strncpy(center_phone,sms_deliver.PDUData+6,sms_deliver.PDUDataLen-8);
// sequential_write(0x8000,PhoneNumLen+1,center_phone); //保存上位機號碼
//(同時要保存PhoneNumLen?)
}
memset(sms_deliver.PDUData,0,sizeof(sms_deliver.PDUData));
}
}
}
///////////////////////function:string verify///////////////////////////////////
char ascii_verify(uchar * dest)
{
char i = 0;
uchar result = 0;
uchar tmp[3];
uchar count = strlen(dest)-2;
for(;i<count;i++)
{
result+=dest[i];
}
tmp[0] = dest[count];
tmp[1] = dest[count+1];
tmp[2] = 0;
if(result==hex2int(tmp))
return 1;
else
return 0; //////應該是return 0
}
//////////////function:編碼形成短信,送到SendBuf中//////////////////////////////
void encode_message()
{
char phone[15];
memset(SendBuf, '\0', sizeof (SendBuf));
memset(phone, '\0', sizeof (phone));
encode_phone(phone); //將center_phone編碼為phone
strcpy(SendBuf,"0891683108100005F0");
strcpy(SendBuf+strlen(SendBuf),"11000D91");
strcpy(SendBuf+strlen(SendBuf),phone);
strcpy(SendBuf+strlen(SendBuf),"0000A7");
int2hex(strlen(sms_deliver.PDUData),SendBuf+strlen(SendBuf));
PDU7BitEncode(sms_deliver.PDUData,SendBuf+strlen(SendBuf));
SendBuf[strlen(SendBuf)+1]=0;
SendBuf[strlen(SendBuf)]=0x1A;
}
///////////////function:對手機號碼編碼//////////////////////////////////////////
unsigned char encode_phone(char *dest)
{
uchar i,j;
j=0;
for(i=0;i<PhoneNumLen+1;i++)
{
if(j==0)
{
dest[i]=center_phone[i+1];
j=1;
}
else
{
dest[i]=center_phone[i-1];
j=0;
}
}
if(PhoneNumLen%2!=0) ///如果上位機號碼位數是奇數個
dest[PhoneNumLen-1]='F';
dest[PhoneNumLen+1]=0;
return PhoneNumLen+1;
}
/////////function://功能類似于int2hex,增加到三位,并且各位都在0~9之間////////
char itoa(char num , char *str)
{
uchar hundred=num/100;
uchar ten=(num-hundred*100)/10;
uchar base=(num-hundred*100-ten*10);
uchar index=0;
if(hundred!=0)
{
str[index]=hundred+NUMBASE;
index=index+1;
}
if(ten!=0)
{
str[index]=ten+NUMBASE;
index=index+1;
}
str[index]=base+NUMBASE;
str[index+1]=0;
return index+1;
}
/////////////////////////function:delay 5s//////////////////////////////////////
void wait_5s()
{
uint idata i;
char idata j;
for(i=0;i<5000;i++)
{
delay();
for(j=0;j<14;j++)
_nop_();
delay();
if(bResponsed) //如果收到短信,跳出延時程序
break;
}
bResponsed=0;
}
///////////////////////////////////////////////////////////////////////////////////////
///////////////////SFR和各全局變量、開機界面等的初發始化///////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////
void startup_init()
{
char i;
PMR = PMR | 0x01; //W77E58允許使用片內的1K SRAM
// AUXR=0x01; //EXTRAM=0:訪問物理上在內部,邏輯上在外部的RAM;
//ALEOFF=1:禁止ALE輸出,以降低對外界的EMI干擾
// WDT_CONTR=0x30; //看門狗定時71.1ms,具體設置見PDF文檔(喂狗語句應為WDT_CONTR=0x30;)
TH1=0xfd;
TL1=0xfd; //串口波特率設置9600
TMOD=0x20; //GATE1=0; GATE0=0,C/T=0,M1=1,M0=0, 定時器工作模式選擇
IP=0x10; // PS=0, 串口中斷為高優先級中斷
SCON=0x50; // 串口工作方式選擇,異步8位,mode=10 ren1
PCON=0x00; // 波特率不倍增
TR1=1; //啟動定時器
IE=0x90; //EA=1;ES=1;ET1=0;EX1=1;ET0=0;EX0=0;
P1=0x0f; //鍵盤八條線四高四低
display_type=0; //0:品種界面1:價格界面2:已存信息內容
vege_page_index=0; //蔬菜品種頁面索引為 0
info_page_index=0; //已存蔬菜信息頁面索引置初值0
info_count=0; //已存信息條數置初值0
vege_type[0]='\0'; //蔬菜品種置初值'\0'
vege_type[1]='\0'; //同上
vege_type[2]='\0';
for(i=0;i<=4;i++)
vege_price[i]='\0'; //蔬菜價格置初值' '
memset(ListBuf,0,sizeof(ListBuf));
memset(PDUBuf,0,sizeof(PDUBuf));
memset(RcvBuf, '\0', sizeof (RcvBuf));
memset(SendBuf, '\0', sizeof (SendBuf));
memset(&sms_deliver ,0,sizeof(sms_deliver));
memset(CMDBuf,0,sizeof(CMDBuf));
memset(sms_deliver.PDUData,0,sizeof(sms_deliver.PDUData));
strcpy(center_phone,"8613752061177");
init_LCD(); //初始化LCD;
put_string(0x90," "); //顯示定位,如果沒有這條語句,顯示經常不對
put_string(0x90,"初始化..."); //開機顯示的字符串
}
////////////////////////////////////////////////////////////////////////////////////////
/////////////main()函數,做所有需要初始化的工作都在main()///////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
//全部的初始化工作
main()
{
char i ;
startup_init();
for(i=0;i<3;i++) //初始化5次,再不成功就放棄
{
if(i>0) delay_1s() ;
if(init_GSM()==0) break ; //初始化手機模塊成功就返回0,失敗返回1;
write_cmd(0x98); write_data(NUMBASE+i+1) ;//在第四行第一列顯示第i次手機模塊初始化
}
IE=0x94; //EA=1;ES=1;ET1=0;EX1=1;ET0=0;EX0=0;打開鍵盤中斷
if(0) //上位機號已設置 if( (byte_read(0x8000)=='8')&&(byte_read(0x8001=='6') )
{
i=0; //把EEPROM中讀出的號保存到center_phone
while(1)
{
// center_phone[i]= byte_read(0x8000+i);
if(center_phone[i]=='\0') break;
i++;
}
}
else
{
strcpy(center_phone,"8613141199264");
// sequential_write(0x8000,14,center_phone); //保存上位機號碼
}
receive_SMS(); //接收短信
PhoneNumLen=13; //號碼長度暫為13 需要改
type_screen(); //液晶顯示
while(1)
{
// receive_SMS(); //接收短信
_nop_();
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -