📄 nemain.c
字号:
{
if(g_Send.AckPtr>0)
{ //正在发送ACK
if(g_Send.AckPtr<SENDACKLEN)
{
TXBUF0=g_Send.Ack[g_Send.AckPtr];
g_Send.AckPtr++;
}
else
{
g_Send.AckPtr=0;
if(g_Send.BufLen>0)
{
//启动发送g_SendBuf缓冲
TXBUF0=g_Send.Buf[0];
g_Send.BufPtr++;
}
}
}
}
}
interrupt[UART0RX_VECTOR] void usart0_rx (void)//OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
{
static uchar Len,RecPtr,SumH,SumL,RecState=RECWAIT;
uchar dat;
dat=RXBUF0;
switch(RecState)
{
case RECWAIT:
if(dat==0x1e)
RecState=RECDST;
break;
case RECDST:
if(dat==0xc)
RecState=RECSRC;
else
RecState=RECWAIT;
break;
case RECSRC:
if(dat==0x0)
RecState=RECCMD;
else
RecState=RECWAIT;
break;
case RECCMD:
g_RecCmd=dat;
RecState=RECLENH;
break;
case RECLENH://大于256byte则返回初始态begin ver sum
if(dat==0)
{
RecState=RECLENL;
SumH=0x1e;
}
else
RecState=RECWAIT;
break;
case RECLENL:
Len=dat;
RecState=RECDATA;
SumL=0x0c^g_RecCmd^Len;
RecPtr=0;
break;
case RECDATA:
if(RecPtr<RECBUFLEN)
g_RecBuf[RecPtr]=dat;//若超出缓冲则忽略
if((RecPtr&0x01)==0)
SumH^=dat;
else
SumL^=dat;
RecPtr++;
if(RecPtr>=Len)
{
if(long_b==1)//收到SEQ
g_Send.Ack[7]=dat;
else
g_Send.Ack[7]=dat - 0x40;
//g_RecLen为奇数则补1
if((Len&0x01)==1)
RecState=RECPAT;
else
RecState=RECSUMH;
}
break;
case RECPAT:
if(dat==0)
RecState=RECSUMH;
else
RecState=RECWAIT;
break;
case RECSUMH:
if(dat==SumH)
{
RecState=RECSUML;
g_Send.Ack[6]=g_RecCmd;
g_Send.Ack[8]=0x1e^0x0c^g_RecCmd;
g_Send.Ack[9]=0x7f^0x02^g_Send.Ack[7];
}
else
RecState=RECWAIT;
break;
case RECSUML:
if(dat==SumL)
{
//send ack;
if(g_RecCmd!=0x7f)
{ //收到的不是ACK,则发ACK
if(g_Send.BufPtr==0)
{ //g_SendBuf[]不在发送
TXBUF0=g_Send.Ack[0];
g_Send.AckPtr=1;
}
else
g_Send.AckPtr=0xff;//待发送
}
//rec end
DispatchMes();
}
RecState=RECWAIT;
break;
default:
RecState=RECWAIT;
}
}
void DispatchMes(void)//解释手机讯息,国际通用的格式
{
uchar i;
switch(g_RecCmd)
{
case 02://sms handle
if(long_b==1)
{
long_b=0;
if (zwr==0x00) //english
for(i=0;i<(g_RecSmgLong-g_RecSmgLong/8-78);i++)
g_RecSmg[i+78]=g_RecBuf[i];
else //chinese
for(i=0;i<(g_RecSmgLong-78);i++)
g_RecSmg[i+78]=g_RecBuf[i];
g_flag|=RECSMG;
}
if(g_RecBuf[0]==0x1&&g_RecBuf[1]==0x08&&g_RecBuf[2]==0x00)
{
if(g_RecBuf[3]==0x10)
{ //receive a smg
P5OUT |= 0x02;
g_SmgNoIn=g_RecBuf[24];
//give smg to a buf
if(g_RecBuf[23]&0x01)
{//even
for(i=0;i<g_RecBuf[23]/2+1;i++)//取出对方号码
outnum[i+1]=g_RecBuf[i+25];
}
else
{
for(i=0;i<g_RecBuf[23]/2;i++)//取出对方号码
outnum[i+1]=g_RecBuf[i+25];
}
outnum[0]=g_RecBuf[23];
zwr=g_RecBuf[21];
g_RecSmgLong=g_RecBuf[22];//短信息的长度每个包最大能收到89个字节英文OR 数字
if(zwr==0x00)
{//英文
if(g_RecSmgLong>89)//每个包只能收89个字节
long_b=1;
else
g_flag|=RECSMG;
for(i=0;(i<(g_RecSmgLong-g_RecSmgLong/8))&&(i<78);i++)
g_RecSmg[i]=g_RecBuf[i+42];
}
else
{//chinese
if(g_RecSmgLong>78)//每个包只能收78个字节
long_b=1;
else
g_flag|=RECSMG;
for(i=0;(i<g_RecSmgLong)&&(i<78);i++)
g_RecSmg[i]=g_RecBuf[i+42];
}
}
else if(g_RecBuf[3]==0x02)/////////////////////////////////////////////
g_flag|=SMSSENDOK;
else if(g_RecBuf[3]==0x03)
g_flag|=SMSSENDFA;
else
{
if(g_RecBuf[3]==0x34)
{
g_flag|=RECSMGCEN;
//save smg center
g_SmgCenLen=g_RecBuf[21];
g_CenNoIn=g_RecBuf[22];
for(i=0;i<g_SmgCenLen;i++)
g_SmgCen[i]=g_RecBuf[i+22];
}
}
}
break;
case 04://phone status
if(g_RecBuf[0]==0x1&&g_RecBuf[1]==0x08&&g_RecBuf[2]==0x00)
{
if(g_RecBuf[3]==0x4&&g_RecBuf[4]==0x1)
{
g_flag|=RECPHONEID;
for(i=0;i<15;i++)
g_DialBuf[i]=g_RecBuf[i+5];
}
else
{
if(g_RecBuf[3]==0x02)//场强不为零,工作正常
{
if( !(g_flag & QUERYTIME) )
g_flag_2|=LEVEL;
g_flag &= ~QUERYTIME;
if( g_RecBuf[5] > 0 )
P5OUT |= 0x01;
else if( (g_RecBuf[5] == 0) && (P_LEVEL == 0) )
P5OUT &= ~0x01;
P_LEVEL=g_RecBuf[5];
}
}
}
break;
case 0x14:
if(long_b == 1)
{
long_b = 0;
if( zwr == 0x00 ) //english
{
for(i=0;i<(g_RecSmgLong-g_RecSmgLong/8-77);i++)
g_RecSmg[i+77]=g_RecBuf[i];
}
else //chinese
{
for(i=0;i<(g_RecSmgLong-77);i++)
g_RecSmg[i+77]=g_RecBuf[i];
}
g_flag|=RECSMG;
}
if( (g_RecBuf[0]==0x1) && (g_RecBuf[1]==0x08) && (g_RecBuf[2]==0x00) )
{
if( g_RecBuf[3] == 0x08 )
{
P5OUT |= 0x02;
DelNo = g_RecBuf[6]; // 短信存储位置
g_flag_2 |= DELSIMSMS;
if(g_RecBuf[22] == 0x08)
zwr = 0x08; //unicode
else
zwr = 0x00;//英文
g_SmgNoIn=g_RecBuf[25];
if(g_RecBuf[24]&0x01)
{//even
for(i=0;i<g_RecBuf[24]/2+1;i++)//取出对方号码
outnum[i+1]=g_RecBuf[i+26];
}
else
{
for(i=0;i<g_RecBuf[24]/2;i++)//取出对方号码
outnum[i+1]=g_RecBuf[i+26];
}
outnum[0]=g_RecBuf[24];
g_RecSmgLong=g_RecBuf[23];
if(zwr==0x00)
{//英文
for(i=0;(i<(g_RecSmgLong-g_RecSmgLong/8))&&(i<77);i++)
g_RecSmg[i]=g_RecBuf[i+43];
if( g_RecSmgLong > 88 )
long_b = 1;
else
g_flag |= RECSMG;
}
else
{//chinese
for(i=0;(i<g_RecSmgLong)&&(i<77);i++)
g_RecSmg[i]=g_RecBuf[i+43];
if( g_RecSmgLong > 77 )
long_b = 1;
else
g_flag |= RECSMG;
}
}
else if( g_RecBuf[3] == 0x09 )
{
g_flag_2 |= HAVESMS;
// g_flag_2 &= ~DELSIMSMS;
}
else if( g_RecBuf[3] == 0x37 )
{
if( g_RecBuf[10] > 0 )
{
g_flag_2 |= HAVESMS;
}
else
{
ReadNo=1;
DelSMS_Time = 200;
g_flag_2 |= FIRSTDEL;
g_flag_2 |= HAVENOSMS;
}
}
else if( g_RecBuf[3] == 0x0B )
g_flag_2 |= DELSMSOK;
}
break;
case 0x40:
g_flag|=LACOK;
break;
case 0x01: //call information
if(g_RecBuf[0]==0x01&&g_RecBuf[1]==0x08&&g_RecBuf[2]==0x00)
{//01 08 00 g_RecBuf[4]is callseq
if(g_RecBuf[3]==0x03&&g_RecBuf[5]==0x05&&g_RecBuf[6]==0x00&&g_RecBuf[7]==0x01&&g_RecBuf[8]==0x03&&g_RecBuf[9]==0x02&&g_RecBuf[10]==0x91)
//establihed voice call 03 callseqnr 05 00 01 03 02 91 00
g_flag|=CALLOK;//呼叫成功
else if(g_RecBuf[3]==0x05&&g_RecBuf[5]==0x05)
{
g_flag|=CALLCOME;//有呼叫
g_RecPhoneNo[0]=g_RecBuf[6];//号码长度
for(i=1;i<=g_RecBuf[6];i++)
{
if(i>=RECPHONELEN)
break;
g_RecPhoneNo[i]=(g_RecBuf[i+6]);
}
}
else
{
if(g_RecBuf[3]==0x04)
g_flag|=REMOTEEND;//遇忙,对方挂机
}
}
break;
case 0x64:
TXBUF1=g_RecBuf[6];
while ((UTCTL1&0x01)==0);
break;
case 0x7f:
g_AckCmd=g_RecBuf[0];// cmd
g_AckSeq=g_RecBuf[1];// seq
g_flag|=RECACK;
break;
case 0x0c://keys
if(g_RecBuf[0]==0x1&&g_RecBuf[1]==0x08&&g_RecBuf[2]==0x00)
{
//1E 0C 00 0C 00 07 01 08 00 43 02 01 41 00 5C 4D
if(g_RecBuf[3]==0x43&&g_RecBuf[0x04]==0x1)
g_flag_2|=KEYPRESS;
//1E 0C 00 0C 00 07 01 08 00 43 01 01 42 00 5C 4D
if(g_RecBuf[3]==0x43&&g_RecBuf[0x04]==0x2)
g_flag_2|=KEYRELEASE;
}
break;
case 06://ussd handle
//1E 0C 00 06 00 19 E4 B2 DC 5C 67 83 AE 6F 39 9B AC 80 B9 90 65 36 5C A1 72 15 F1 69
//3A 01 02 00 41 70
if(long_b==2)
{
long_b=0;
for(i=0;i<(g_RecUSSDLen-112);i++)
g_RecUSSD[i+112]=g_RecBuf[i];
g_flag_2|=USSDMENU;
}
if(g_RecBuf[0]==0x1&&g_RecBuf[1]==0x08&&g_RecBuf[2]==0x00)
{
//1E 0C 00 06 00 7A 01 08 00 05 00 0F 01 87 31 D7 94 FE 1E AF 41 50 79 7A 5C 56 C8 5C
//53 FA 7B BC 06 05 DD 61 76 7E 9E 9E 2B 66 AE 61 9A 9E 07 B1 D3 E6 B2 82 E6 62 BE E9
//F4 B2 3C AF A8 B9 98 69 7B DA 7D 06 21 C3 6E B2 F8 FD 5E 2B 6C 2E 63 78 8E 4E BF DD
//20 76 DA 5C 56 DC 5C 45 37 BD 2C A7 87 D3 EE 76 D9 4D 57 E0 5C D0 BA 98 9D 1E 83 92
//6E F3 5B DE 0E D3 D3 6F B7 22 E7 BA BE DD 02 41 EA D5
if((g_RecBuf[3]==0x05)&&(g_RecBuf[6]==0x01))
{
g_RecUSSDLen=g_RecBuf[7];
if(g_RecUSSDLen>112)//每个包只能收89个字节
long_b=2;
else
g_flag_2|=USSDMENU;
for(i=0;(i<g_RecUSSDLen)&&(i<112);i++)
g_RecUSSD[i]=g_RecBuf[i+8];
}
//1E 0C 00 06 00 0D 01 08 00 05 00 0F 02 03 CF 65 08 01 46 00 9C 62
else if((g_RecBuf[3]==0x05)&&(g_RecBuf[6]==0x02))
{
g_RecUSSDLen=g_RecBuf[7];
for(i=0;i<g_RecUSSDLen;i++)
g_RecUSSD[i]=g_RecBuf[i+8];
g_flag_2|=USSDOK;
}
//1E 0C 00 06 00 08 01 08 00 03 01 06 01 43 1F 4C
else if((g_RecBuf[3]==0x03)&&(g_RecBuf[5]==0x06))
g_flag_2|=UNKNOWN;
else
{ //1E 0C 00 06 00 09 01 08 00 03 01 02 22 01 40 00 7C 0B
if((g_RecBuf[3]==0x03)&&(g_RecBuf[5]==0x02))
g_flag_2|=USSDFA;
}
}
break;
}
}
interrupt[UART1TX_VECTOR] void usart1_tx (void)
{
}
interrupt[UART1RX_VECTOR] void usart1_rx (void)
{
RxCls=0;
if((RxTimeLong==0)&&(RXBUF1==0x08))
hz_bz=0x08;
RXsmg[RxTimeLong]=RXBUF1;
RxTimeLong++; //读入的长度
if((RXBUF1==0XFD)&&(RxTimeLong<3))
RxTimeLong=0;
if(RXBUF1==CLSR[CLSR_1])
CLSR_1++;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -