📄 do_reset.c
字号:
{
if(gTimer_GSM_AT>1000)
{
Send_COM0_String((unsigned char *)AT_CMGD,sizeof(AT_CMGD));
Send_COM0_Byte('1');
Send_COM0_Byte(',');
Send_COM0_Byte('4');
Send_COM0_Byte(0x0d);
gTimer_GSM_AT=0;
gReset_M22_On_Setp=36;
}
else Check_GSM();
}
else if(gReset_M22_On_Setp==36)
{
Wait_Return_M22(37);
}
//18,AT+CMGD=1,4
else if(gReset_M22_On_Setp==37)
{
if(gTimer_GSM_AT>1000)
{
Send_COM0_String((unsigned char *)AT_CMGD,sizeof(AT_CMGD));
Send_COM0_Byte('1');
Send_COM0_Byte(',');
Send_COM0_Byte('4');
Send_COM0_Byte(0x0d);
gTimer_GSM_AT=0;
gReset_M22_On_Setp=38;
}
else Check_GSM();
}
else if(gReset_M22_On_Setp==38)
{
Wait_Return_M22(39);
}
//19,显示程序的时间和作者
else if(gReset_M22_On_Setp==39)
{
Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a);
//开发商:哈工大泰森电子有限公司
Send_COM1_String( (unsigned char *)MADE,sizeof(MADE) );
Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a);
//开发着:
Send_COM1_String( (unsigned char *)AUTHOR,sizeof(AUTHOR) );
Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a);
//产品型号:
Send_COM1_String( (unsigned char *)MODEL,sizeof(MODEL) );
Send_COM1_Byte(':');
Send_COM1_String( (unsigned char *)MODEL_TYPE2,sizeof(MODEL_TYPE2) );
Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a);
Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a);
//开发日期
Send_COM1_String( (unsigned char *)DESIGN_DATA,sizeof(DESIGN_DATA) );
Send_COM1_String( (unsigned char *)EDIT_DATE,sizeof(EDIT_DATE) );
//软件版本
Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a);
Send_COM1_String( (unsigned char *)SOFT_EDITION,sizeof(SOFT_EDITION) );
Send_COM1_String( (unsigned char *)GPS_2005A,sizeof(GPS_2005A) );
Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a);
Send_COM1_String( (unsigned char *)UPDATE_TIME,sizeof(UPDATE_TIME) );
Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a);
gReset_M22_On_Setp=40;
}
//20,M22初始化完成
else if(gReset_M22_On_Setp==40)
{
gReset_M22_On_Setp=0;
gGeneral_Flag&=~RESET_GSM_ON_F_1;
gM22_Status=GSM_WORK;
gGeneral_Flag&=~LAND_TCP_SUCCESS_F_1;
gGSM_Oper_Type=GSM_PHONE;
gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;
gPhone_Step=0;gTimer_GSM_AT=0;
Send_COM1_String( (unsigned char *)M22_RESET_ON_OK,sizeof(M22_RESET_ON_OK) );
gReceive1_Point=SRAM_RECORD_S;
SRAM_Init();
SRAM_Write(PHONE_AT_2+0,NULL_2);
for(i=PHONE_AT_2+1;i<ECHO_SMS_2;i++)
{
SRAM_Write(i,0);
}
gInternal_Flag|=DISP_ON_F_1;
gStatus1_Flag|=DISPLAY_ON_F_1;
gTimer=0;
while(gTimer<1000){Check_GSM();Clear_Exter_WatchDog();}
gRecord_Data_Timer=0;
gTimer_CSQ=GSM_CHECKCSQ_TIME+1;
SRAM_Init();
SRAM_Write(SHANDLE_DATA_VAILD,NULL_2);
gCheck_Par_Timer=CHECK_SYS_PAR_TIME+1;
}
}
/********************************************************\
* 函数名:Ask_SMS_Send
作用域:外部文件调用
* 功能: 在进行SMS的发送操作AT+CMGS=L(长度)
* 参数: Input
* 返回值: 无
* 创建人:
*
* 修改历史:(每条详述)
\********************************************************/
void Ask_SMS_Send(unsigned char nInput)
{
Send_COM0_String((unsigned char *)AT_CMGS,sizeof(AT_CMGS));
Send_COM0_Byte(ASCII(nInput/100));
Send_COM0_Byte(ASCII((nInput%100)/10));
Send_COM0_Byte(ASCII(nInput%10));
Send_COM0_Byte(0x0d);
}
/********************************************************\
* 函数名:Send_SMS_Head
作用域:外部文件调用
* 功能: 根据SMS的标准格式,这里是将短消息中心号码,目标电话号码,协议格式
发送到GSM模块
* 参数: I
* 返回值: 无
* 创建人:
*
* 修改历史:(每条详述)
发送SMS的头,包括短消息中心号码在内的固定长度
注意这里的头与在G18里不一样,必须将短消息中心号码在数据包头中
AT+CMGS=27
>
0891683108705505F011000D91683167108230F70008000CFF4FB008000101000102090D
在这个子模块中发送的数据则为0891683108705505F011000D91683167108230F7000800
这个部分只所有发送SMS数据的公共部分。在这个项目文件中,只要短消息中心号码
和目标电话号码不变,则这部分的发送数据一样。
0CFF4FB008000101000102090D 这部分属于数据区。会由后面的程序处理。
这里27的长度是指11000D91683167108230F70008000CFF4FB008000101000102090D
AT+CSCA?
+CSCA: "+8613800755500",145
OK
\********************************************************/
void Send_SMS_Head(void)
{
unsigned int i,j,k,x;
//读短消息中心号码的长度+8613800755500(11位)
SRAM_Init();
j=SRAM_Read(CENTER_NUM_2);
//判断是否有+号
i=SRAM_Read(CENTER_NUM_2+1);
if(i=='+')
{
k=(j+1)/2+1;gInternal_Flag&=~SMS_CENTER_CLASS_1; //送91
}
else
{
k=(j+1)/2+2;gInternal_Flag|=SMS_CENTER_CLASS_1; //送A1
}
//发送号码的长度
Send_COM0_Byte(ASCII(k/16));
Send_COM0_Byte(ASCII(k%16));
if(gInternal_Flag&SMS_CENTER_CLASS_1) Send_COM0_Byte('A');
else Send_COM0_Byte('9');
Send_COM0_Byte('1');
//送A1,不带+,则前面的i也是正常的有效发送数据
if(gInternal_Flag&SMS_CENTER_CLASS_1)
{
k=i;
x=SRAM_Read(CENTER_NUM_2+2);
Send_COM0_Byte(x);
Send_COM0_Byte(k);
i=3;
}
//送91,前面带+
else
{
k=SRAM_Read(CENTER_NUM_2+2);
x=SRAM_Read(CENTER_NUM_2+3);
Send_COM0_Byte(x);
Send_COM0_Byte(k);
i=4;
}
while(1)
{
if(i<j)//如上例这里j=11
{
k=SRAM_Read(CENTER_NUM_2+i);
x=SRAM_Read(CENTER_NUM_2+i+1);
Send_COM0_Byte(x);
Send_COM0_Byte(k);
i++;
i++;
}
//发送短消息中心号码的最后一个字节0
else if(i==j)
{
k=SRAM_Read(CENTER_NUM_2+i);
Send_COM0_Byte('F');
Send_COM0_Byte(k);
break;
}
else break;
}
// 发送1100 (如上例子),这个在所有的协议中均一致
for(i=0;i<sizeof(SMS_Head_1);i++)
{
Send_COM0_Byte(SMS_Head_1[i]);
}
//++++++++++++++++++++++++++++++++++++++++++++++
//发送目标电话号码
//分析:如果存储为 14,'+','8','6','1','3','6','7','0','1','5','5','7','0','4'
//或者存储为 13,'8','6','1','3','6','7','0','1','5','5','7','0','4'
j=SRAM_Read(TARGET_NUMBER1_2);
i=SRAM_Read(TARGET_NUMBER1_2+1);
if(i=='+')
{
k=j-1;gInternal_Flag&=~SMS_TARGET_CLASS_1;
}
else
{
k=j;gInternal_Flag|=SMS_TARGET_CLASS_1;
}
Send_COM0_Byte(ASCII(k/16));
Send_COM0_Byte(ASCII(k%16));
if(gInternal_Flag&SMS_TARGET_CLASS_1) Send_COM0_Byte('A');
else Send_COM0_Byte('9');
Send_COM0_Byte('1');
//送A1,不带+,则前面的i也是正常的有效发送数据
if(gInternal_Flag&SMS_TARGET_CLASS_1)
{
k=i;
x=SRAM_Read(TARGET_NUMBER1_2+2);
Send_COM0_Byte(x);
Send_COM0_Byte(k);
i=3;
}
else //送91,前面带+
{
k=SRAM_Read(TARGET_NUMBER1_2+2);
x=SRAM_Read(TARGET_NUMBER1_2+3);
Send_COM0_Byte(x);
Send_COM0_Byte(k);
i=4;
}
while(1)
{
if(i<j)
{
k=SRAM_Read(TARGET_NUMBER1_2+i);
x=SRAM_Read(TARGET_NUMBER1_2+i+1);
Send_COM0_Byte(x);
Send_COM0_Byte(k);
i++;
i++;
}
//目标电话号码的最后一个字节
else if(i==j)
{
k=SRAM_Read(TARGET_NUMBER1_2+i);
Send_COM0_Byte('F');
Send_COM0_Byte(k);
OperateSPIEnd();
break;
}
else break;
}
OperateSPIEnd();
// 发送短消息的协议方式(如上例子),这个在所有的协议中均一致
for( i=0;i<6;i++ )
{
Send_COM0_Byte(SMS_Head_2[i]);
}
}
/********************************************************\
* 函数名:Send_Echo_GSM_Head
作用域:外部文件调用
* 功能:
* 参数: nInput 如果属于SMS的发送,则这个参数表示整个数据包的长度
nCommand 数据包中的命令字
nACK ACK响应,如果是属于主动发送的上行数据包,则ACK=0
nLength 指的是在数据包中从消息号到CHK以前的数据的字节数
* 返回值: iCheckOut 这部分发送数据的和(用来计算校验核)
* 创建人:
*
* 修改历史:(每条详述)
补充说明:具体在buffer1中存储第2类SMS的数据形式如下:0x7B----0xB6(整个分配的区域大小)
0x7B 存储表示这个区域的SMS是否处理,为1则表示后面还有未处理的SMS,
为0则表示已经处理完了SMS
0x7C 存储数据包的命令字在这里则为nCommand
0x7D 存储数据包的ACK的值ACK
0x7E 存储后面数据包的长度(但注意没有存储CHK(MSB),CHK(LSB),EOT,这三个字节)
0x7F 从这开始存储数据包
AT+CMGS=27
>
0891683108705505F011000D91683167108230F70008000CFF4FB008000101000102090D
这里27的长度是指的是从1100 0D 91 68 3167108230F7 000800 0C FF4FB008000101000102090D
13760128037
所以Send_Echo_Head_1子模块的几个参数的计算方式如下:
nInput的计算方式: nInput=12+(0x7d)
nCommand的附值方式:nCommand=(0x7C)
nACK的附值方式: nACK=(0x7E)
nLength的附值方式: nLength=nInput-4
根据上面的描述,在发送第二累SMS的时候,AT+CMGS=后面跟的数据的长度的计算方式则为
(目标号码长度+1)/2+8+12+(0x7E)
则根据上面的例子,目标号码为13760128037为11位. 8 是指的1100 0D 91 68 000800的长度
12指的是0C的长度,因为这是属于第一类的SMS的格式,数据长度为0,
但在在第二类的SMS中还需要加上数据区的长度,在这里存储在buffer1中的0x7e区域
\********************************************************/
unsigned int Send_Echo_GSM_Head(unsigned char nInput,unsigned char nCommand,unsigned char nACK,unsigned char nLength)
{
unsigned int iCheckOut=0;
Send_COM0_Byte(ASCII(nInput/0x10));
Send_COM0_Byte(ASCII(nInput%0x10));
iCheckOut=0;
Send_COM0_Byte(ASCII(SOH/0x10));
Send_COM0_Byte(ASCII(SOH%0x10));
iCheckOut+=SOH;
Send_COM0_Byte(ASCII((char)nCommand/0x10));
Send_COM0_Byte(ASCII((char)nCommand%0x10));
iCheckOut+=(char)nCommand;
Send_COM0_Byte(ASCII((char)(~nCommand)/0x10));
Send_COM0_Byte(ASCII((char)(~nCommand)%0x10));
iCheckOut+=(char)(~nCommand);
Send_COM0_Byte(ASCII((nLength)/0x10));
Send_COM0_Byte(ASCII((nLength)%0x10));
iCheckOut+=(nInput-4);
Send_COM0_Byte(ASCII(nACK/0x10)); //ACK响应字符
Send_COM0_Byte(ASCII(nACK%0x10));
iCheckOut+=nACK;
Send_COM0_Byte(ASCII(gKind/0x10));
Send_COM0_Byte(ASCII(gKind%0x10));
iCheckOut+=gKind;
Send_COM0_Byte(ASCII(gGroup/0x10));
Send_COM0_Byte(ASCII(gGroup%0x10));
iCheckOut+=gGroup;
Send_COM0_Byte(ASCII(gVID/0x1000));
Send_COM0_Byte(ASCII(gVID%0x1000/0x100));
iCheckOut+=gVID/0x100;
Send_COM0_Byte(ASCII(gVID%0x100/0x10));
Send_COM0_Byte(ASCII(gVID%0x10));
iCheckOut+=gVID%0x100;
return(iCheckOut);
//iCheckOut为计算前面发送部分的数据的校验和。如果后面还有更多的数据
//在计算整个校验核的时候则要继续这个数据一起计算在内
}
/********************************************************\
* 函数名:Send_Echo_TCP_Head
作用域:外部文件调用
* 功能:
* 参数: iCheckIn 前面计算的校验核
nAddress 需要发送数据在buffer1中的首地址
nLength 需要发送的数据在buffer1中的长度
* 返回值: iCheckOut 这部分发送数据的和(用来计算校验核)
* 创建人:
*
* 修改历史:(每条详述)
\********************************************************/
unsigned int Send_Echo_TCP_Head(unsigned char nInput,unsigned char nCommand,unsigned char nACK,unsigned char nLength)
{
unsigned int iCheckOut=0;
iCheckOut=nInput;
iCheckOut=0;
Send_COM0_Byte(SOH);
iCheckOut+=SOH;
Send_COM0_Byte( nCommand );
iCheckOut+= nCommand;
Send_COM0_Byte( (char)(~nCommand) );
iCheckOut+=(char)(~nCommand);
Send_COM0_Byte( nLength );
iCheckOut+=nLength;
Send_COM0_Byte( nACK );
iCheckOut+=nACK;
Send_COM0_Byte( gKind );
iCheckOut+=gKind;
Send_COM0_Byte( gGroup );
iCheckOut+=gGroup;
Send_COM0_Byte( gVID/0x100 );
iCheckOut+=gVID/0x100;
Send_COM0_Byte( gVID%0x100 );
iCheckOut+=gVID%0x100;
return(iCheckOut);
//iCheckOut为计算前面发送部分的数据的校验和。如果后面还有更多的数据
//在计算整个校验核的时候则要继续这个数据一起计算在内
}
/********************************************************\
* 函数名:Send_Buffer1_GSM_Data
作用域:外部文件调用
* 功能: 打包发送存储在buffer1中的数据区的数据。并计算校验核
* 参数: iCheckIn 前面计算的校验核
nAddress 需要发送数据在buffer1中的首地址
nLength 需要发送的数据在buffer1中的长度
* 返回值: iCheckOut 这部分发送数据的和(用来计算校验核)
* 创建人:
*
* 修改历史:(每条详述)
\********************************************************/
unsigned int Send_Buffer1_GSM_Data(unsigned int iCheckIn,unsigned char nAddress,unsigned char nLength)
{
unsigned int iCheckOut,i;
unsigned char Data_Temp;
OperateSPIEnd();
iCheckOut=iCheckIn;
if(nLength>0)
{
Data_Temp=SRAM_Read(nAddress);
iCheckOut += Data_Temp;
Send_COM0_Byte(ASCII(Data_Temp/0x10));
Send_COM0_Byte(ASCII(Data_Temp%0x10));
for(i=1;i<nLength;i++)
{
Data_Temp=SRAM_Read(nAddress+i);
iCheckOut += Data_Temp;
Send_COM0_Byte(ASCII(Data_Temp/0x10));
Send_COM0_Byte(ASCII(Data_Temp%0x10));
}
}
OperateSPIEnd();
return(iCheckOut);
}
/********************************************************\
* 函数名:Send_Buffer1_TCP_Data
作用域:外部文件调用
* 功能: 打包发送存储在buffer1中的数据区的数据。并计算校验核
* 参数: iCheckIn 前面计算的校验核
nAddress 需要发送数据在buffer1中的首地址
nLength 需要发送的数据在buffer1中的长度
* 返回值: iCheckOut 这部分发送数据的和(用来计算校验核)
* 创建人:
*
* 修改历史:(每条详述)
\********************************************************/
unsigned int Send_Buffer1_TCP_Data(unsigned int iCheckIn,unsigned char nAddress,unsigned char nLength)
{
unsigned int iCheckOut,i;
unsigned char Data_Temp;
OperateSPIEnd();
iCheckOut=iCheckIn;
if(nLength>0)
{
Data_Temp=SRAM_Read(nAddress);
iCheckOut += Data_Temp;
Send_COM0_Byte( Data_Temp );
for(i=1;i<nLength;i++)
{
Data_Temp=SRAM_Read(nAddress+i);
iCheckOut += Data_Temp;
Send_COM0_Byte( Data_Temp );
}
}
OperateSPIEnd();
return(iCheckOut);
}
/********************************************************\
* 函数名:Send_Echo_TCP_End
作用域:外部文件调用
* 功能: 进行最后部分的数据发送,这部分可以与GPRS的数据发送共用
是所有发送SMS,和GPRS数据均可调用的子程序
* 参数: Input 前面计算的校验核,在这里要发送出去
* 返回值:
* 创建人:
*
* 修改历史:(每条详述)
\********************************************************/
void Send_Echo_TCP_End(unsigned int iInput)
{
Send_COM0_Byte( iInput/0x100 );
Send_COM0_Byte( iInput%0x100 );
Send_COM0_Byte( EOT );
}
/********************************************************\
* 函数名:Send_Echo_GSM_End
作用域:外部文件调用
* 功能: 进行最后部分的数据发送,这部分可以与GPRS的数据发送共用
是所有发送SMS,和GPRS数据均可调用的子程序
* 参数: Input 前面计算的校验核,在这里要发送出去
* 返回值:
* 创建人:
*
* 修改历史:(每条详述)
\********************************************************/
void Send_Echo_GSM_End(unsigned int iInput)
{
Send_COM0_Byte(ASCII(iInput/0x1000));
Send_COM0_Byte(ASCII(iInput%0x1000/0x100));
Send_COM0_Byte(ASCII(iInput%0x100/0x10));
Send_COM0_Byte(ASCII(iInput%0x10));
Send_COM0_Byte(ASCII(EOT/0x10));
Send_COM0_Byte(ASCII(EOT%0x10));
}
/********************************************************\
* 函数名:Send_Echo_GSM_End
作用域:外部文件调用
* 功能: 进行最后部分的数据发送,这部分可以与GPRS的数据发送共用
是所有发送SMS,和GPRS数据均可调用的子程序
* 参数: Input 前面计算的校验核,在这里要发送出去
* 返回值:
* 创建人:
*
* 修改历史:(每条详述)
\********************************************************/
void Wait_Return_M22(unsigned char Next_Step)
{
if(Check_GSM()!=0)
{
gTimer_GSM_AT=0;
if(Compare_String(gGeneral_Buffer,(unsigned char *)String_OK,sizeof(String_OK))!=0)
{
gReset_M22_On_Setp=Next_Step;
}
else if(Compare_String(gGeneral_Buffer,(unsigned char *)String_ER,sizeof(String_ER))!=0)
{
gReset_M22_On_Setp=1;
}
}
else if(gTimer_GSM_AT>3000)
{
gReset_M22_On_Setp=1;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -