欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
在戰艦STM32開發板上調試的SIM900A短信電話測試實驗
[打印本頁]
作者:
夢園心田
時間:
2018-12-7 17:49
標題:
在戰艦STM32開發板上調試的SIM900A短信電話測試實驗
測試可用
單片機源程序如下:
#include "sim900a.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#include "lcd.h"
#include "dma.h"
#include "w25qxx.h"
#include "touch.h"
#include "malloc.h"
#include "string.h"
#include "text.h"
#include "usart3.h"
#include "ff.h"
///////////////////////////////////////////////////////////////////////////////////////////////////////////
//usmart支持部分
//將收到的AT指令應答數據返回給電腦串口
//mode:0,不清零USART3_RX_STA;
// 1,清零USART3_RX_STA;
void sim_at_response(u8 mode)
{
if(USART3_RX_STA&0X8000) //接收到一次數據了
{
USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;//添加結束符
printf("%s",USART3_RX_BUF); //發送到串口
if(mode)USART3_RX_STA=0;
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////
//ATK-SIM900A 各項測試(撥號測試、短信測試、GPRS測試)共用代碼
//sim900a發送命令后,檢測接收到的應答
//str:期待的應答結果
//返回值:0,沒有得到期待的應答結果
// 其他,期待應答結果的位置(str的位置)
u8* sim900a_check_cmd(u8 *str)
{
char *strx=0;
if(USART3_RX_STA&0X8000) //接收到一次數據了
{
USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;//添加結束符
strx=strstr((const char*)USART3_RX_BUF,(const char*)str);
}
return (u8*)strx;
}
//向sim900a發送命令
//cmd:發送的命令字符串(不需要添加回車了),當cmd<0XFF的時候,發送數字(比如發送0X1A),大于的時候發送字符串.
//ack:期待的應答結果,如果為空,則表示不需要等待應答
//waittime:等待時間(單位:10ms)
//返回值:0,發送成功(得到了期待的應答結果)
// 1,發送失敗
u8 sim900a_send_cmd(u8 *cmd,u8 *ack,u16 waittime)
{
u8 res=0;
USART3_RX_STA=0;
if((u32)cmd<=0XFF)
{
while((USART3->SR&0X40)==0);//等待上一次數據發送完成
USART3->DR=(u32)cmd;
}else u3_printf("%s\r\n",cmd);//發送命令
if(ack&&waittime) //需要等待應答
{
while(--waittime) //等待倒計時
{
delay_ms(10);
if(USART3_RX_STA&0X8000)//接收到期待的應答結果
{
if(sim900a_check_cmd(ack))break;//得到有效數據
USART3_RX_STA=0;
}
}
if(waittime==0)res=1;
}
return res;
}
//將1個字符轉換為16進制數字
//chr:字符,0~9/A~F/a~F
//返回值:chr對應的16進制數值
u8 sim900a_chr2hex(u8 chr)
{
if(chr>='0'&&chr<='9')return chr-'0';
if(chr>='A'&&chr<='F')return (chr-'A'+10);
if(chr>='a'&&chr<='f')return (chr-'a'+10);
return 0;
}
//將1個16進制數字轉換為字符
//hex:16進制數字,0~15;
//返回值:字符
u8 sim900a_hex2chr(u8 hex)
{
if(hex<=9)return hex+'0';
if(hex>=10&&hex<=15)return (hex-10+'A');
return '0';
}
//unicode gbk 轉換函數
//src:輸入字符串
//dst:輸出(uni2gbk時為gbk內碼,gbk2uni時,為unicode字符串)
//mode:0,unicode到gbk轉換;
// 1,gbk到unicode轉換;
void sim900a_unigbk_exchange(u8 *src,u8 *dst,u8 mode)
{
u16 temp;
u8 buf[2];
if(mode)//gbk 2 unicode
{
while(*src!=0)
{
if(*src<0X81) //非漢字
{
temp=(u16)ff_convert((WCHAR)*src,1);
src++;
}else //漢字,占2個字節
{
buf[1]=*src++;
buf[0]=*src++;
temp=(u16)ff_convert((WCHAR)*(u16*)buf,1);
}
*dst++=sim900a_hex2chr((temp>>12)&0X0F);
*dst++=sim900a_hex2chr((temp>>8)&0X0F);
*dst++=sim900a_hex2chr((temp>>4)&0X0F);
*dst++=sim900a_hex2chr(temp&0X0F);
}
}else //unicode 2 gbk
{
while(*src!=0)
{
buf[1]=sim900a_chr2hex(*src++)*16;
buf[1]+=sim900a_chr2hex(*src++);
buf[0]=sim900a_chr2hex(*src++)*16;
buf[0]+=sim900a_chr2hex(*src++);
temp=(u16)ff_convert((WCHAR)*(u16*)buf,0);
if(temp<0X80){*dst=temp;dst++;}
else {*(u16*)dst=swap16(temp);dst+=2;}
}
}
*dst=0;//添加結束符
}
//鍵盤碼表
const u8* kbd_tbl1[13]={"1","2","3","4","5","6","7","8","9","*","0","#","DEL"};
const u8* kbd_tbl2[13]={"1","2","3","4","5","6","7","8","9",".","0","#","DEL"};
u8** kbd_tbl;
u8* kbd_fn_tbl[2];
//加載鍵盤界面(尺寸為240*140)
//x,y:界面起始坐標(320*240分辨率的時候,x必須為0)
void sim900a_load_keyboard(u16 x,u16 y,u8 **kbtbl)
{
u16 i;
POINT_COLOR=RED;
kbd_tbl=kbtbl;
LCD_Fill(x,y,x+240,y+140,WHITE);
LCD_DrawRectangle(x,y,x+240,y+140);
LCD_DrawRectangle(x+80,y,x+160,y+140);
LCD_DrawRectangle(x,y+28,x+240,y+56);
LCD_DrawRectangle(x,y+84,x+240,y+112);
POINT_COLOR=BLUE;
for(i=0;i<15;i++)
{
if(i<13)Show_Str_Mid(x+(i%3)*80,y+6+28*(i/3),(u8*)kbd_tbl[i],16,80);
else Show_Str_Mid(x+(i%3)*80,y+6+28*(i/3),kbd_fn_tbl[i-13],16,80);
}
}
//按鍵狀態設置
//x,y:鍵盤坐標
//key:鍵值(0~8)
//sta:狀態,0,松開;1,按下;
void sim900a_key_staset(u16 x,u16 y,u8 keyx,u8 sta)
{
u16 i=keyx/3,j=keyx%3;
if(keyx>15)return;
if(sta)LCD_Fill(x+j*80+1,y+i*28+1,x+j*80+78,y+i*28+26,GREEN);
else LCD_Fill(x+j*80+1,y+i*28+1,x+j*80+78,y+i*28+26,WHITE);
if(j&&(i>3))Show_Str_Mid(x+j*80,y+6+28*i,(u8*)kbd_fn_tbl[keyx-13],16,80);
else Show_Str_Mid(x+j*80,y+6+28*i,(u8*)kbd_tbl[keyx],16,80);
}
//得到觸摸屏的輸入
//x,y:鍵盤坐標
//返回值:按鍵鍵值(1~15有效;0,無效)
u8 sim900a_get_keynum(u16 x,u16 y)
{
u16 i,j;
static u8 key_x=0;//0,沒有任何按鍵按下;1~15,1~15號按鍵按下
u8 key=0;
tp_dev.scan(0);
if(tp_dev.sta&TP_PRES_DOWN) //觸摸屏被按下
{
for(i=0;i<5;i++)
{
for(j=0;j<3;j++)
{
if(tp_dev.x[0]<(x+j*80+80)&&tp_dev.x[0]>(x+j*80)&&tp_dev.y[0]<(y+i*28+28)&&tp_dev.y[0]>(y+i*28))
{
key=i*3+j+1;
break;
}
}
if(key)
{
if(key_x==key)key=0;
else
{
sim900a_key_staset(x,y,key_x-1,0);
key_x=key;
sim900a_key_staset(x,y,key_x-1,1);
}
break;
}
}
}else if(key_x)
{
sim900a_key_staset(x,y,key_x-1,0);
key_x=0;
}
return key;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////
//撥號測試部分代碼
//sim900a撥號測試
//用于撥打電話和接聽電話
//返回值:0,正常
// 其他,錯誤代碼
u8 sim900a_call_test(void)
{
u8 key;
u16 lenx;
u8 callbuf[20];
u8 pohnenumlen=0; //號碼長度,最大15個數
u8 *p,*p1,*p2;
u8 oldmode=0;
u8 cmode=0; //模式
//0:等待撥號
//1:撥號中
//2:通話中
//3:接收到來電
LCD_Clear(WHITE);
if(sim900a_send_cmd("AT+CLIP=1","OK",200))return 1; //設置來電顯示
if(sim900a_send_cmd("AT+COLP=1","OK",200))return 2; //設置被叫號碼顯示
p1=mymalloc(SRAMIN,20); //申請20直接用于存放號碼
if(p1==NULL)return 2;
POINT_COLOR=RED;
Show_Str_Mid(0,30,"ATK-SIM900A 撥號測試",16,240);
Show_Str(40,70,200,16,"請撥號:",16,0);
kbd_fn_tbl[0]="撥號";
kbd_fn_tbl[1]="返回";
sim900a_load_keyboard(0,180,(u8**)kbd_tbl1);
POINT_COLOR=BLUE;
while(1)
{
delay_ms(10);
if(USART3_RX_STA&0X8000) //接收到數據
{
sim_at_response(0);
if(cmode==1||cmode==2)
{
if(cmode==1)if(sim900a_check_cmd("+COLP:"))cmode=2; //撥號成功
if(sim900a_check_cmd("NO CARRIER"))cmode=0; //撥號失敗
if(sim900a_check_cmd("NO ANSWER"))cmode=0; //撥號失敗
if(sim900a_check_cmd("ERROR"))cmode=0; //撥號失敗
}
if(sim900a_check_cmd("+CLIP:"))//接收到來電
{
cmode=3;
p=sim900a_check_cmd("+CLIP:");
p+=8;
p2=(u8*)strstr((const char *)p,"\"");
p2[0]=0;//添加結束符
strcpy((char*)p1,(char*)p);
}
USART3_RX_STA=0;
}
key=sim900a_get_keynum(0,180);
if(key)
{
if(key<13)
{
if(cmode==0&&pohnenumlen<15)
{
callbuf[pohnenumlen++]=kbd_tbl[key-1][0];
u3_printf("AT+CLDTMF=2,\"%c\"\r\n",kbd_tbl[key-1][0]);
}else if(cmode==2)//通話中
{
u3_printf("AT+CLDTMF=2,\"%c\"\r\n",kbd_tbl[key-1][0]);
delay_ms(100);
u3_printf("AT+VTS=%c\r\n",kbd_tbl[key-1][0]);
LCD_ShowChar(40+56,90,kbd_tbl[key-1][0],16,0);
}
}else
{
if(key==13)if(pohnenumlen&&cmode==0)pohnenumlen--;//刪除
if(key==14)//執行撥號
{
if(cmode==0)//撥號模式
{
callbuf[pohnenumlen]=0; //最后加入結束符
u3_printf("ATD%s;\r\n",callbuf);//撥號
cmode=1; //撥號中模式
}else
{
sim900a_send_cmd("ATH","OK",200);//掛機
cmode=0;
}
}
if(key==15)
{
if(cmode==3)//接收到來電
{
sim900a_send_cmd("ATA","OK",200);//發送應答指令
Show_Str(40+56,70,200,16,callbuf,16,0);
cmode=2;
}else
{
sim900a_send_cmd("ATH",0,0);//不管有沒有在通話,都結束通話
break;//退出循環
}
}
}
if(cmode==0)//只有在等待撥號模式有效
{
callbuf[pohnenumlen]=0;
LCD_Fill(40+56,70,239,70+16,WHITE);
Show_Str(40+56,70,200,16,callbuf,16,0);
}
}
if(oldmode!=cmode)//模式變化了
{
switch(cmode)
{
case 0:
kbd_fn_tbl[0]="撥號";
kbd_fn_tbl[1]="返回";
POINT_COLOR=RED;
Show_Str(40,70,200,16,"請撥號:",16,0);
LCD_Fill(40+56,70,239,70+16,WHITE);
if(pohnenumlen)
{
POINT_COLOR=BLUE;
Show_Str(40+56,70,200,16,callbuf,16,0);
}
break;
case 1:
POINT_COLOR=RED;
Show_Str(40,70,200,16,"撥號中:",16,0);
pohnenumlen=0;
case 2:
POINT_COLOR=RED;
if(cmode==2)Show_Str(40,70,200,16,"通話中:",16,0);
kbd_fn_tbl[0]="掛斷";
kbd_fn_tbl[1]="返回";
break;
case 3:
POINT_COLOR=RED;
Show_Str(40,70,200,16,"有來電:",16,0);
POINT_COLOR=BLUE;
Show_Str(40+56,70,200,16,p1,16,0);
kbd_fn_tbl[0]="掛斷";
kbd_fn_tbl[1]="接聽";
break;
}
if(cmode==2)Show_Str(40,90,200,16,"DTMF音:",16,0); //通話中,可以通過鍵盤輸入DTMF音
else LCD_Fill(40,90,120,90+16,WHITE);
sim900a_load_keyboard(0,180,(u8**)kbd_tbl1); //顯示鍵盤
oldmode=cmode;
}
if((lenx%50)==0)LED0=!LED0;
lenx++;
}
myfree(SRAMIN,p1);
return 0;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////
//短信測試部分代碼
//SIM900A讀短信測試
void sim900a_sms_read_test(void)
{
u8 *p,*p1,*p2;
u8 timex=0;
u8 msgindex[3];
u8 msglen=0;
u8 msgmaxnum=0; //短信最大條數
u8 key=0;
u8 smsreadsta=0; //是否在短信顯示狀態
p=mymalloc(SRAMIN,200);//申請200個字節的內存
LCD_Clear(WHITE);
POINT_COLOR=RED;
Show_Str_Mid(0,30,"ATK-SIM900A 讀短信測試",16,240);
Show_Str(30,50,200,16,"讀取: 總信息:",16,0);
kbd_fn_tbl[0]="讀取";
kbd_fn_tbl[1]="返回";
sim900a_load_keyboard(0,180,(u8**)kbd_tbl1);//顯示鍵盤
while(1)
{
key=sim900a_get_keynum(0,180);
if(key)
{
if(smsreadsta)
{
LCD_Fill(30,75,239,179,WHITE);//清除顯示的短信內容
smsreadsta=0;
}
if(key<10||key==11)
{
if(msglen<2)
{
msgindex[msglen++]=kbd_tbl[key-1][0];
u3_printf("AT+CLDTMF=2,\"%c\"\r\n",kbd_tbl[key-1][0]);
}
if(msglen==2)
{
key=(msgindex[0]-'0')*10+msgindex[1]-'0';
if(key>msgmaxnum)
{
msgindex[0]=msgmaxnum/10+'0';
msgindex[1]=msgmaxnum%10+'0';
}
}
}else
{
if(key==13)if(msglen)msglen--;//刪除
if(key==14&&msglen)//執行讀取短信
{
LCD_Fill(30,75,239,179,WHITE);//清除之前的顯示
sprintf((char*)p,"AT+CMGR=%s",msgindex);
if(sim900a_send_cmd(p,"+CMGR:",200)==0)//讀取短信
{
POINT_COLOR=RED;
Show_Str(30,75,200,12,"狀態:",12,0);
Show_Str(30+75,75,200,12,"來自:",12,0);
Show_Str(30,90,200,12,"接收時間:",12,0);
Show_Str(30,105,200,12,"內容:",12,0);
POINT_COLOR=BLUE;
if(strstr((const char*)(USART3_RX_BUF),"UNREAD")==0)Show_Str(30+30,75,200,12,"已讀",12,0);
else Show_Str(30+30,75,200,12,"未讀",12,0);
p1=(u8*)strstr((const char*)(USART3_RX_BUF),",");
p2=(u8*)strstr((const char*)(p1+2),"\"");
p2[0]=0;//加入結束符
sim900a_unigbk_exchange(p1+2,p,0); //將unicode字符轉換為gbk碼
Show_Str(30+75+30,75,200,12,p,12,0); //顯示電話號碼
p1=(u8*)strstr((const char*)(p2+1),"/");
p2=(u8*)strstr((const char*)(p1),"+");
p2[0]=0;//加入結束符
Show_Str(30+54,90,200,12,p1-2,12,0); //顯示接收時間
p1=(u8*)strstr((const char*)(p2+1),"\r"); //尋找回車符
sim900a_unigbk_exchange(p1+2,p,0); //將unicode字符轉換為gbk碼
Show_Str(30+30,105,180,75,p,12,0); //顯示短信內容
smsreadsta=1; //標記有顯示短信內容
}else
{
Show_Str(30,75,200,12,"無短信內容!!!請檢查!!",12,0);
delay_ms(1000);
LCD_Fill(30,75,239,75+12,WHITE);//清除顯示
}
USART3_RX_STA=0;
}
if(key==15)break;
}
msgindex[msglen]=0;
LCD_Fill(30+40,50,86,50+16,WHITE);
Show_Str(30+40,50,86,16,msgindex,16,0);
}
if(timex==0) //2.5秒左右更新一次
{
if(sim900a_send_cmd("AT+CPMS?","+CPMS:",200)==0) //查詢優選消息存儲器
{
p1=(u8*)strstr((const char*)(USART3_RX_BUF),",");
p2=(u8*)strstr((const char*)(p1+1),",");
p2[0]='/';
if(p2[3]==',')//小于64K SIM卡,最多存儲幾十條短信
{
msgmaxnum=(p2[1]-'0')*10+p2[2]-'0'; //獲取最大存儲短信條數
p2[3]=0;
}else //如果是64K SIM卡,則能存儲100條以上的信息
{
msgmaxnum=(p2[1]-'0')*100+(p2[2]-'0')*10+p2[3]-'0';//獲取最大存儲短信條數
p2[4]=0;
}
sprintf((char*)p,"%s",p1+1);
Show_Str(30+17*8,50,200,16,p,16,0);
USART3_RX_STA=0;
}
}
if((timex%20)==0)LED0=!LED0;//200ms閃爍
timex++;
delay_ms(10);
if(USART3_RX_STA&0X8000)sim_at_response(1);//檢查從GSM模塊接收到的數據
}
myfree(SRAMIN,p);
}
//測試短信發送內容(70個字[UCS2的時候,1個字符/數字都算1個字])
const u8* sim900a_test_msg="您好,這是一條測試短信,由ATK-SIM900A GSM模塊發送,模塊購買地址:http://eboard.taobao.com,謝謝支持!";
//SIM900A發短信測試
void sim900a_sms_send_test(void)
{
u8 *p,*p1,*p2;
u8 phonebuf[20]; //號碼緩存
u8 pohnenumlen=0; //號碼長度,最大15個數
u8 timex=0;
u8 key=0;
u8 smssendsta=0; //短信發送狀態,0,等待發送;1,發送失敗;2,發送成功
p=mymalloc(SRAMIN,100); //申請100個字節的內存,用于存放電話號碼的unicode字符串
p1=mymalloc(SRAMIN,300);//申請300個字節的內存,用于存放短信的unicode字符串
p2=mymalloc(SRAMIN,100);//申請100個字節的內存 存放:AT+CMGS=p1
LCD_Clear(WHITE);
POINT_COLOR=RED;
Show_Str_Mid(0,30,"ATK-SIM900A 發短信測試",16,240);
Show_Str(30,50,200,16,"發送給:",16,0);
Show_Str(30,70,200,16,"狀態:",16,0);
Show_Str(30,90,200,16,"內容:",16,0);
POINT_COLOR=BLUE;
Show_Str(30+40,70,170,90,"等待發送",16,0);//顯示狀態
Show_Str(30+40,90,170,90,(u8*)sim900a_test_msg,16,0);//顯示短信內容
kbd_fn_tbl[0]="發送";
kbd_fn_tbl[1]="返回";
sim900a_load_keyboard(0,180,(u8**)kbd_tbl1);//顯示鍵盤
while(1)
{
key=sim900a_get_keynum(0,180);
if(key)
{
if(smssendsta)
{
smssendsta=0;
Show_Str(30+40,70,170,90,"等待發送",16,0);//顯示狀態
}
if(key<10||key==11)
{
if(pohnenumlen<15)
{
phonebuf[pohnenumlen++]=kbd_tbl[key-1][0];
u3_printf("AT+CLDTMF=2,\"%c\"\r\n",kbd_tbl[key-1][0]);
}
}else
{
if(key==13)if(pohnenumlen)pohnenumlen--;//刪除
if(key==14&&pohnenumlen) //執行發送短信
{
Show_Str(30+40,70,170,90,"正在發送",16,0); //顯示正在發送
smssendsta=1;
sim900a_unigbk_exchange(phonebuf,p,1); //將電話號碼轉換為unicode字符串
sim900a_unigbk_exchange((u8*)sim900a_test_msg,p1,1);//將短信內容轉換為unicode字符串.
sprintf((char*)p2,"AT+CMGS=\"%s\"",p);
if(sim900a_send_cmd(p2,">",200)==0) //發送短信命令+電話號碼
{
u3_printf("%s",p1); //發送短信內容到GSM模塊
if(sim900a_send_cmd((u8*)0X1A,"+CMGS:",1000)==0)smssendsta=2;//發送結束符,等待發送完成(最長等待10秒鐘,因為短信長了的話,等待時間會長一些)
}
if(smssendsta==1)Show_Str(30+40,70,170,90,"發送失敗",16,0); //顯示狀態
else Show_Str(30+40,70,170,90,"發送成功",16,0); //顯示狀態
USART3_RX_STA=0;
}
if(key==15)break;
}
phonebuf[pohnenumlen]=0;
LCD_Fill(30+54,50,239,50+16,WHITE);
Show_Str(30+54,50,156,16,phonebuf,16,0);
}
if((timex%20)==0)LED0=!LED0;//200ms閃爍
timex++;
delay_ms(10);
if(USART3_RX_STA&0X8000)sim_at_response(1);//檢查從GSM模塊接收到的數據
}
myfree(SRAMIN,p);
myfree(SRAMIN,p1);
myfree(SRAMIN,p2);
}
//sms測試主界面
void sim900a_sms_ui(u16 x,u16 y)
{
LCD_Clear(WHITE);
POINT_COLOR=RED;
Show_Str_Mid(0,y,"ATK-SIM900A 短信測試",16,240);
Show_Str(x,y+40,200,16,"請選擇:",16,0);
Show_Str(x,y+60,200,16,"KEY0:讀短信測試",16,0);
Show_Str(x,y+80,200,16,"KEY1:發短信測試",16,0);
Show_Str(x,y+100,200,16,"KEY_UP:返回上級菜單",16,0);
}
//sim900a短信測試
//用于讀短信或者發短信
//返回值:0,正常
// 其他,錯誤代碼
u8 sim900a_sms_test(void)
{
u8 key;
u8 timex=0;
if(sim900a_send_cmd("AT+CMGF=1","OK",200))return 1; //設置文本模式
if(sim900a_send_cmd("AT+CSCS=\"UCS2\"","OK",200))return 2; //設置TE字符集為UCS2
if(sim900a_send_cmd("AT+CSMP=17,0,2,25","OK",200))return 3; //設置短消息文本模式參數
sim900a_sms_ui(40,30);
while(1)
{
key=KEY_Scan(0);
if(key==KEY0_PRES)
{
sim900a_sms_read_test();
sim900a_sms_ui(40,30);
timex=0;
}else if(key==KEY1_PRES)
{
sim900a_sms_send_test();
sim900a_sms_ui(40,30);
timex=0;
}else if(key==WKUP_PRES)break;
timex++;
if(timex==20)
{
timex=0;
LED0=!LED0;
}
delay_ms(10);
sim_at_response(1); //檢查GSM模塊發送過來的數據,及時上傳給電腦
}
sim900a_send_cmd("AT+CSCS=\"GSM\"","OK",200); //設置默認的GSM 7位缺省字符集
return 0;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////
const u8 *modetbl[2]={"TCP","UDP"};//連接模式
//tcp/udp測試
//帶心跳功能,以維持連接
//mode:0:TCP測試;1,UDP測試)
//ipaddr:ip地址
//port:端口
void sim900a_tcpudp_test(u8 mode,u8* ipaddr,u8* port)
{
u8 *p,*p1,*p2,*p3;
u8 key;
u16 timex=0;
u8 count=0;
const u8* cnttbl[3]={"正在連接","連接成功","連接關閉"};
u8 connectsta=0; //0,正在連接;1,連接成功;2,連接關閉;
u8 hbeaterrcnt=0; //心跳錯誤計數器,連續5次心跳信號無應答,則重新連接
u8 oldsta=0XFF;
p=mymalloc(SRAMIN,100); //申請100字節內存
p1=mymalloc(SRAMIN,100); //申請100字節內存
LCD_Clear(WHITE);
POINT_COLOR=RED;
if(mode)Show_Str_Mid(0,30,"ATK-SIM900A UDP連接測試",16,240);
else Show_Str_Mid(0,30,"ATK-SIM900A TCP連接測試",16,240);
Show_Str(30,50,200,16,"KEY_UP:退出測試 KEY0:發送數據",12,0);
sprintf((char*)p,"IP地址:%s 端口:%s",ipaddr,port);
Show_Str(30,65,200,12,p,12,0); //顯示IP地址和端口
Show_Str(30,80,200,12,"狀態:",12,0); //連接狀態
Show_Str(30,100,200,12,"發送數據:",12,0); //連接狀態
Show_Str(30,115,200,12,"接收數據:",12,0); //端口固定為8086
POINT_COLOR=BLUE;
USART3_RX_STA=0;
sprintf((char*)p,"AT+CIPSTART=\"%s\",\"%s\",\"%s\"",modetbl[mode],ipaddr,port);
if(sim900a_send_cmd(p,"OK",500))return; //發起連接
while(1)
{
key=KEY_Scan(0);
if(key==WKUP_PRES)//退出測試
{
sim900a_send_cmd("AT+CIPCLOSE=1","CLOSE OK",500); //關閉連接
sim900a_send_cmd("AT+CIPSHUT","SHUT OK",500); //關閉移動場景
break;
}else if(key==KEY0_PRES&(hbeaterrcnt==0)) //發送數據(心跳正常時發送)
{
Show_Str(30+30,80,200,12,"數據發送中...",12,0); //提示數據發送中
if(sim900a_send_cmd("AT+CIPSEND",">",500)==0) //發送數據
{
printf("CIPSEND DATA:%s\r\n",p1); //發送數據打印到串口
u3_printf("%s\r\n",p1);
delay_ms(10);
if(sim900a_send_cmd((u8*)0X1A,"SEND OK",1000)==0)Show_Str(30+30,80,200,12,"數據發送成功!",12,0);//最長等待10s
else Show_Str(30+30,80,200,12,"數據發送失敗!",12,0);
delay_ms(1000);
}else sim900a_send_cmd((u8*)0X1B,0,0); //ESC,取消發送
oldsta=0XFF;
}
if((timex%20)==0)
{
LED0=!LED0;
count++;
if(connectsta==2||hbeaterrcnt>8)//連接中斷了,或者連續8次心跳沒有正確發送成功,則重新連接
{
sim900a_send_cmd("AT+CIPCLOSE=1","CLOSE OK",500); //關閉連接
sim900a_send_cmd("AT+CIPSHUT","SHUT OK",500); //關閉移動場景
sim900a_send_cmd(p,"OK",500); //嘗試重新連接
connectsta=0;
hbeaterrcnt=0;
}
sprintf((char*)p1,"ATK-SIM900A %s測試 %d ",modetbl[mode],count);
Show_Str(30+54,100,200,12,p1,12,0);
}
if(connectsta==0&&(timex%200)==0)//連接還沒建立的時候,每2秒查詢一次CIPSTATUS.
{
sim900a_send_cmd("AT+CIPSTATUS","OK",500); //查詢連接狀態
if(strstr((const char*)USART3_RX_BUF,"CLOSED"))connectsta=2;
if(strstr((const char*)USART3_RX_BUF,"CONNECT OK"))connectsta=1;
}
if(connectsta==1&&timex>=600)//連接正常的時候,每6秒發送一次心跳
{
timex=0;
if(sim900a_send_cmd("AT+CIPSEND",">",200)==0)//發送數據
{
sim900a_send_cmd((u8*)0X00,0,0); //發送數據:0X00
delay_ms(20); //必須加延時
sim900a_send_cmd((u8*)0X1A,0,0); //CTRL+Z,結束數據發送,啟動一次傳輸
}else sim900a_send_cmd((u8*)0X1B,0,0); //ESC,取消發送
hbeaterrcnt++;
printf("hbeaterrcnt:%d\r\n",hbeaterrcnt);//方便調試代碼
}
delay_ms(10);
if(USART3_RX_STA&0X8000) //接收到一次數據了
{
USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0; //添加結束符
printf("%s",USART3_RX_BUF); //發送到串口
if(hbeaterrcnt) //需要檢測心跳應答
{
if(strstr((const char*)USART3_RX_BUF,"SEND OK"))hbeaterrcnt=0;//心跳正常
}
p2=(u8*)strstr((const char*)USART3_RX_BUF,"+IPD");
if(p2)//接收到TCP/UDP數據
{
p3=(u8*)strstr((const char*)p2,",");
p2=(u8*)strstr((const char*)p2,":");
p2[0]=0;//加入結束符
sprintf((char*)p1,"收到%s字節,內容如下",p3+1);//接收到的字節數
LCD_Fill(30+54,115,239,130,WHITE);
POINT_COLOR=BRED;
Show_Str(30+54,115,156,12,p1,12,0); //顯示接收到的數據長度
POINT_COLOR=BLUE;
LCD_Fill(30,130,210,319,WHITE);
Show_Str(30,130,180,190,p2+1,12,0); //顯示接收到的數據
}
USART3_RX_STA=0;
}
if(oldsta!=connectsta)
{
oldsta=connectsta;
LCD_Fill(30+30,80,239,80+12,WHITE);
Show_Str(30+30,80,200,12,(u8*)cnttbl[connectsta],12,0); //更新狀態
}
timex++;
}
myfree(SRAMIN,p);
myfree(SRAMIN,p1);
}
//gprs測試主界面
void sim900a_gprs_ui(void)
{
LCD_Clear(WHITE);
POINT_COLOR=RED;
Show_Str_Mid(0,30,"ATK-SIM900A GPRS通信測試",16,240);
Show_Str(30,50,200,16,"KEY_UP:連接方式切換",16,0);
Show_Str(30,90,200,16,"連接方式:",16,0); //連接方式通過KEY_UP設置(TCP/UDP)
Show_Str(30,110,200,16,"IP地址:",16,0); //IP地址可以鍵盤設置
Show_Str(30,130,200,16,"端口:",16,0); //端口固定為8086
kbd_fn_tbl[0]="連接";
kbd_fn_tbl[1]="返回";
sim900a_load_keyboard(0,180,(u8**)kbd_tbl2);//顯示鍵盤
}
//sim900a GPRS測試
//用于測試TCP/UDP連接
//返回值:0,正常
// 其他,錯誤代碼
u8 sim900a_gprs_test(void)
{
const u8 *port="8086"; //端口固定為8086,當你的電腦8086端口被其他程序占用的時候,請修改為其他空閑端口
u8 mode=0; //0,TCP連接;1,UDP連接
u8 key;
u8 timex=0;
u8 ipbuf[16]; //IP緩存
u8 iplen=0; //IP長度
sim900a_gprs_ui(); //加載主界面
Show_Str(30+72,90,200,16,(u8*)modetbl[mode],16,0); //顯示連接方式
Show_Str(30+40,130,200,16,(u8*)port,16,0); //顯示端口
sim900a_send_cmd("AT+CIPCLOSE=1","CLOSE OK",100); //關閉連接
sim900a_send_cmd("AT+CIPSHUT","SHUT OK",100); //關閉移動場景
if(sim900a_send_cmd("AT+CGCLASS=\"B\"","OK",1000))return 1; //設置GPRS移動臺類別為B,支持包交換和數據交換
if(sim900a_send_cmd("AT+CGDCONT=1,\"IP\",\"CMNET\"","OK",1000))return 2;//設置PDP上下文,互聯網接協議,接入點等信息
if(sim900a_send_cmd("AT+CGATT=1","OK",500))return 3; //附著GPRS業務
if(sim900a_send_cmd("AT+CIPCSGP=1,\"CMNET\"","OK",500))return 4; //設置為GPRS連接模式
if(sim900a_send_cmd("AT+CIPHEAD=1","OK",500))return 5; //設置接收數據顯示IP頭(方便判斷數據來源)
ipbuf[0]=0;
while(1)
{
key=KEY_Scan(0);
if(key==WKUP_PRES)
{
mode=!mode; //連接模式切換
Show_Str(30+72,90,200,16,(u8*)modetbl[mode],16,0); //顯示連接模式
}
key=sim900a_get_keynum(0,180);
if(key)
{
if(key<12)
{
if(iplen<15)
{
ipbuf[iplen++]=kbd_tbl[key-1][0];
u3_printf("AT+CLDTMF=2,\"%c\"\r\n",kbd_tbl[key-1][0]);
}
}else
{
if(key==13)if(iplen)iplen--; //刪除
if(key==14&&iplen) //執行GPRS連接
{
sim900a_tcpudp_test(mode,ipbuf,(u8*)port);
sim900a_gprs_ui(); //加載主界面
Show_Str(30+72,90,200,16,(u8*)modetbl[mode],16,0); //顯示連接模式
Show_Str(30+40,130,200,16,(u8*)port,16,0);//顯示端口
USART3_RX_STA=0;
}
if(key==15)break;
}
ipbuf[iplen]=0;
LCD_Fill(30+56,110,239,110+16,WHITE);
Show_Str(30+56,110,200,16,ipbuf,16,0); //顯示IP地址
}
timex++;
if(timex==20)
{
timex=0;
LED0=!LED0;
}
delay_ms(10);
sim_at_response(1);//檢查GSM模塊發送過來的數據,及時上傳給電腦
}
return 0;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////
//ATK-SIM900A GSM/GPRS主測試控制部分
//測試界面主UI
void sim900a_mtest_ui(u16 x,u16 y)
{
u8 *p,*p1,*p2;
p=mymalloc(SRAMIN,50);//申請50個字節的內存
LCD_Clear(WHITE);
POINT_COLOR=RED;
Show_Str_Mid(0,y,"ATK-SIM900A 測試程序",16,240);
Show_Str(x,y+25,200,16,"請選擇:",16,0);
Show_Str(x,y+45,200,16,"KEY0:撥號測試",16,0);
Show_Str(x,y+65,200,16,"KEY1:短信測試",16,0);
Show_Str(x,y+85,200,16,"KEY_UP:GPRS測試",16,0);
POINT_COLOR=BLUE;
USART3_RX_STA=0;
if(sim900a_send_cmd("AT+CGMI","OK",200)==0) //查詢制造商名稱
{
p1=(u8*)strstr((const char*)(USART3_RX_BUF+2),"\r\n");
p1[0]=0;//加入結束符
sprintf((char*)p,"制造商:%s",USART3_RX_BUF+2);
Show_Str(x,y+110,200,16,p,16,0);
USART3_RX_STA=0;
}
if(sim900a_send_cmd("AT+CGMM","OK",200)==0)//查詢模塊名字
{
p1=(u8*)strstr((const char*)(USART3_RX_BUF+2),"\r\n");
p1[0]=0;//加入結束符
sprintf((char*)p,"模塊型號:%s",USART3_RX_BUF+2);
Show_Str(x,y+130,200,16,p,16,0);
USART3_RX_STA=0;
}
if(sim900a_send_cmd("AT+CGSN","OK",200)==0)//查詢產品序列號
{
p1=(u8*)strstr((const char*)(USART3_RX_BUF+2),"\r\n");//查找回車
p1[0]=0;//加入結束符
sprintf((char*)p,"序列號:%s",USART3_RX_BUF+2);
Show_Str(x,y+150,200,16,p,16,0);
USART3_RX_STA=0;
}
if(sim900a_send_cmd("AT+CNUM","+CNUM",200)==0) //查詢本機號碼
{
p1=(u8*)strstr((const char*)(USART3_RX_BUF),",");
p2=(u8*)strstr((const char*)(p1+2),"\"");
p2[0]=0;//加入結束符
sprintf((char*)p,"本機號碼:%s",p1+2);
Show_Str(x,y+170,200,16,p,16,0);
USART3_RX_STA=0;
}
myfree(SRAMIN,p);
}
//GSM信息顯示(信號質量,電池電量,日期時間)
//返回值:0,正常
// 其他,錯誤代碼
u8 sim900a_gsminfo_show(u16 x,u16 y)
{
u8 *p,*p1,*p2;
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
戰艦開發板SIM900A GSM模塊測試實驗.rar
(1.59 MB, 下載次數: 32)
2018-12-7 21:31 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1