?? at.c
字號:
{NULL,NULL},
};
//***********************************************************************************************************************
//函數(shù)作用:分析AT消息
//參數(shù)說明:無
//注意事項:
//返回說明:
//***********************************************************************************************************************
static void at_parse_msg(void)
{
at_msglist_t *list;
//數(shù)據(jù)包列表中查找并且調(diào)用相應(yīng)處理函數(shù)
for(list=at_msglist;list->cmdstr!=NULL;list++)
{
//找到了以后 調(diào)用相應(yīng)函數(shù)
if(str_comprise(at_receive_buffer,list->cmdstr))
{
list->callback();//調(diào)用相應(yīng)函數(shù)
return;
}
}
}
//***********************************************************************************************************************
//函數(shù)作用:處理AT回應(yīng)數(shù)據(jù)包
//參數(shù)說明:無
//注意事項:
//返回說明:無
//***********************************************************************************************************************
static void ATAnalyse(void)
{
if(!at_get_msg())return;//接收消息
//if(at_debug==1)//調(diào)試信息
//{
// print_line(at_receive_buffer);
//}
at_parse_msg();//分析消息
}
//*****************************************************************************************
//函數(shù)作用:等待回應(yīng)
//參數(shù)說明:
//注意事項:
//返回說明:如果等到OK返回1
//*****************************************************************************************
static uchar at_wait_ack(uint wait_time, uchar ack_no)
{
at_ack=0;
while(!at_ack)//等返回
{
mdelay(20);
ATAnalyse();
if(wait_time&0x01)LED_CTRL=!LED_CTRL;
if(--wait_time==0)break;//超時退出
}
if(at_ack==ack_no)return 1;
return 0;
}
//*****************************************************************************************
//函數(shù)作用:等待ok
//參數(shù)說明:
//注意事項:
//返回說明:如果等到OK返回1
//*****************************************************************************************
static uchar at_wait_ok(void)
{
return at_wait_ack(500,AT_ACK_OK);
}
//***********************************************************************************************************************
//函數(shù)作用:發(fā)送AT命令
//參數(shù)說明:
//注意事項:
//返回說明:
//***********************************************************************************************************************
static void at_send_command(uchar *command, uchar *param)
{
AT_SEND_STR(AT_CMD_HEAD);
AT_SEND_STR(command);
AT_SEND_STR(param);
AT_SEND_STR(AT_CMD_END);
}
//***********************************************************************************************************************
//函數(shù)作用:發(fā)送AT命令并且等待OK
//參數(shù)說明:
//注意事項:
//返回說明:如果等到ok 返回1
//***********************************************************************************************************************
static uchar at_send_command_waitok(uchar *command, uchar *param)
{
at_send_command(command,param);
return(at_wait_ok());
}
//*****************************************************************************************
//函數(shù)作用:發(fā)送短信息
//參數(shù)說明:
//注意事項:
//返回說明:
//*****************************************************************************************
uchar ATSendSMS(uchar *dest_no, uchar *content_buf, uchar data_coding)
{
uint length;
uchar i;
uchar MoveTemp;
uchar temp_buf[16];
if(at_reset)return 0;
delay(1);//防止連續(xù)發(fā)送短信
//發(fā)送頭
AT_SEND_STR(AT_CMD_HEAD);
AT_SEND_STR(AT_CMD_SENDSMS);
//發(fā)送PDU包長度
length=str_length(dest_no);//對方號碼長度
if(length&0x01)length++;//修正奇偶
length+=20;//其他字節(jié)固定長度
if(data_coding==0x00)//英文
{
i=0;
while(content_buf[i]!=0)
{
MoveTemp=content_buf[i+1]<<(7-i%8);
MoveTemp+=(content_buf[i]>>i%8);
i++;
length+=2;
if(((i+1)%8)==0)if(content_buf[i])i++;
}
}
else if(data_coding==0x08)//中文
{
length+=str_length(content_buf);
}
int_to_dec(temp_buf,(length>>1)-1);//轉(zhuǎn)化為十進制 并且修正為字節(jié)長度 然后減1
AT_SEND_STR(temp_buf);//發(fā)送
AT_SEND_CHAR('\r');
//等待 "> "
mdelay(100);
//狀態(tài)報告碼
AT_SEND_STR("001100");
//號碼長度
length=str_length(dest_no)+2;//號碼長度+86的長度
char_to_hex(temp_buf,length);//轉(zhuǎn)化為hex字符串
AT_SEND_STR(temp_buf);//發(fā)送
//號碼屬性--國際號碼
AT_SEND_STR("91");//發(fā)送
//號碼內(nèi)容 奇偶數(shù)修正-F 并且高低字節(jié)對調(diào)
str_copy(temp_buf,"86");//國家代碼--中國地區(qū)
str_cat(temp_buf,dest_no);//拷貝號碼
if(length&0x01)str_cat(temp_buf,"F");//修正奇偶
swap_low4_and_high4(temp_buf,length);//高低字節(jié)對調(diào)
AT_SEND_STR(temp_buf);//發(fā)送
//PID
AT_SEND_STR("00");
//編碼方式
char_to_hex(temp_buf,data_coding);//轉(zhuǎn)化為hex字符串
AT_SEND_STR(temp_buf);//發(fā)送
//有效期
AT_SEND_STR("8F");//發(fā)送
//內(nèi)容長度
length=str_length(content_buf);//計算內(nèi)容緩沖區(qū)長度
if(data_coding==0x08)length>>=1;//如果是中文把字符串長度轉(zhuǎn)化字節(jié)長度--除以2
char_to_hex(temp_buf,length);//轉(zhuǎn)化為hex字符串
AT_SEND_STR(temp_buf);//發(fā)送
//真正的內(nèi)容
if(data_coding==0x00)//英文
{
uchar MoveTemp;
uchar i=0,j=0;
while(content_buf[i]!=0)
{
MoveTemp=content_buf[i+1]<<(7-i%8);
MoveTemp+=(content_buf[i]>>i%8);
Bcd2Char(temp_buf,MoveTemp);//轉(zhuǎn)化為hex
AT_SEND_STR(temp_buf);//發(fā)送
i++;
j+=2;
if(((i+1)%8)==0)if(content_buf[i])i++;
}
}
else if(data_coding==0x08)//中文
{
AT_SEND_STR(content_buf);//發(fā)送
}
//發(fā)送結(jié)束符
AT_SEND_CHAR(0x1A);
//等待發(fā)送成功
if(!at_wait_ack(1000,AT_ACK_OK))goto error;
return 1;
error:
at_reset=1;
return 0;
}
//***********************************************************************************************************************
//函數(shù)作用:應(yīng)答電話
//參數(shù)說明:
//注意事項:
//返回說明:如果等到 返回1
//***********************************************************************************************************************
uchar ATAnswer(void)
{
if(at_send_command_waitok(AT_CMD_ANSWER,""))
{
ring=0;
calling=1;
return 1;
}
return 0;
}
//***********************************************************************************************************************
//函數(shù)作用:掛機
//參數(shù)說明:
//注意事項:
//返回說明:如果等到 返回1
//***********************************************************************************************************************
uchar ATHangup(void)
{
if(at_send_command_waitok(AT_CMD_HANGUP,""))
{
ring=0;
calling=0;
str_copy(clip_no,"???????????");
return 1;
}
return 0;
}
//***********************************************************************************************************************
//函數(shù)作用:切換音頻通道
//參數(shù)說明:
//注意事項:
//返回說明:如果等到 返回1
//***********************************************************************************************************************
uchar ATSetAC(uchar no)
{
uchar no_buf[2]="1";
no_buf[0]=no;
return at_send_command_waitok(AT_CMD_SWITCHAUDIO,no_buf);
}
//***********************************************************************************************************************
//函數(shù)作用:MIC增益
//參數(shù)說明:no--MIC號 gain--增益數(shù)量字符串 0-15
//注意事項:
//返回說明:如果等到 返回1
//***********************************************************************************************************************
uchar ATSetMic(uchar no, uchar *gain)
{
uchar buf[]="0,10";
buf[0]=no;
str_copy(&buf[2],gain);
return at_send_command_waitok(AT_CMD_MIC,buf);
}
//***********************************************************************************************************************
//函數(shù)作用:初始化
//參數(shù)說明:
//注意事項:
//返回說明:返回是否有錯誤 如果有錯誤送復(fù)位標志
//***********************************************************************************************************************
void ATInit(void)
{
uchar wait_time;
//清標志
at_reset=0;//需要復(fù)位
simok=0;//sim卡
loginok=0;//登陸成功
smsin=0;//收到短消息
ring=0;//來電
calling=0;//是否通話狀態(tài)
str_copy(clip_no,"???????????");
//1.上電并初始化端口
print_line("AT重新上電");
AT_POWER_CTRL=0;
delay(2);//等待2秒
AT_PORTINIT(AT_BAUDRATE);//端口初始化
AT_FLUSH();
AT_POWER_CTRL=1;
//2.等待READY
print_line("AT等待RDY");
wait_time=20;//等待10秒
while(!at_wait_ack(30,AT_ACK_OK))
{
at_send_command("","");
if(--wait_time==0)goto error;
}
//3.等待SIM卡檢測
print_line("SIM卡檢測");
wait_time=100;//等待10秒
while(!simok)
{
ATAnalyse();
mdelay(100);
LED_CTRL=!LED_CTRL;
if(--wait_time==0)goto error;
}
//4.等待登陸網(wǎng)絡(luò)
print_line("AT登錄網(wǎng)絡(luò)");
if(!at_send_command_waitok(AT_CMD_DISECHO,""))goto error;//關(guān)閉命令回顯
if(!at_send_command_waitok(AT_CMD_CREG,""))goto error;//主動提供網(wǎng)絡(luò)注冊信息
at_send_command("+COPS=","4,0,\"CHINA MOBILE\"");//手動注冊中國移動 如果不成功再自動注冊
wait_time=120;//等待120秒
while(!loginok)
{
ATAnalyse();
delay(1);
LED_CTRL=!LED_CTRL;
if(--wait_time==0)goto error;
}
//5.初始化AT命令
print_line("AT設(shè)置命令");
if(!at_send_command_waitok(AT_CMD_SMSPDU,""))goto error;//短消息PDU模式
if(!at_send_command_waitok(AT_CMD_SMSTOCOMM,""))goto error;//短消息直接從串口出
if(!at_send_command_waitok(AT_CMD_GSMCHARSET,""))goto error;//設(shè)置GSM字符集
if(!at_send_command_waitok(AT_CMD_TCPIPRECEIVEHINT,""))goto error;//設(shè)置TCP/IP數(shù)據(jù)包接收提示
if(!at_send_command_waitok(AT_CMD_TCPIPSENDHINT,""))goto error;//關(guān)閉TCPIP數(shù)據(jù)發(fā)送時的 "> " 提示
if(!at_send_command_waitok(AT_CMD_FIXLOCALPORT,""))goto error;//取消固定本地端口號
if(!at_send_command_waitok("+CLIP=1",""))goto error;//開來電顯示
if(!ATSetAC('1'))goto error;//切換到免提通道 提供振鈴
if(!ATSetMic('0',"12"))goto error;//調(diào)節(jié)MIC增益
if(!ATSetMic('1',"12"))goto error;//調(diào)節(jié)MIC增益
//6.等待可以發(fā)送短消息了
//print_line("短信初始化");
//wait_time=120;//等待120秒
//while(!at_wait_ack(100,AT_ACK_OK))
//{
// at_send_command(AT_CMD_SMSCENTERNO,"?");
// if(--wait_time==0)goto error;
//}
//delay(5);
//7.正確返回
return;
error:
print_line("失敗");
at_reset=1;
}
//***********************************************************************************************************************
//函數(shù)作用:AT處理函數(shù)
//參數(shù)說明:
//注意事項:
//返回說明:
//***********************************************************************************************************************
void ATProcess(void)
{
//初始化
if(at_reset)ATInit();
//接收數(shù)據(jù)分析
ATAnalyse();
//短信處理
if(smsin)
{
smsin=0;
print_line("GET A SMS");
//判斷是否是自定義的有效命令
if(sms_coding==8 && str_compare(at_receive_buffer,"4F60572854EA91CC"))
{
print_line("位置查詢短信");
if(!gis_search(at_receive_buffer,gps_longti(),gps_lati()))//查找地圖
{
ATSendSMS(sms_no,at_receive_buffer,8);//發(fā)送應(yīng)答
print_line("查詢成功");
}
else
{
print_line("查詢失敗");
}
}
}
//來電處理
if(ring)
{
print_line("GET A CALL");
//判斷是否是家人和朋友的號碼
if(str_comprise(clip_no,"13389937509"))
{
ATAnswer();
print_line("接聽監(jiān)聽電話");
}
else if(str_comprise(clip_no,"13332020931"))
{
ATAnswer();
print_line("接聽監(jiān)聽電話");
}
else
{
ATHangup();mdelay(100);ATHangup();
print_line("拒絕接聽");
}
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -