信息的编码和解码,通过使用队列技术来确保能够进行正常的并发访问。 GSM 接打电话步骤:
发送 AT指令检测模块是否正常 发送 AT+CPIN?检测 SIM 卡是否在位
发送 AT+CSQ 查询信号质量等级,20~31 为宜 发送 AT+CLIP=1 开启来电显示 发送 ATD10086; 拨打电话; 发送 ATH 可结束通话; 在有来电时发送 ATA 可接听来电
短消息服务中常用的AT指令如表所示
发英文短信:
(假设给号码为 13XXXXXXXXX发送: “123456”)的流程: 发送 AT+CMGF=1, 设置为文本模式
发送 AT+CSCS=“GSM”, 设置默认的 GSM 7 位缺省字符集; 发送 AT+CMGS=“13265434569”,等待模块返回“>” 发送短信内容: “123456”, 最后以十六进制 0X1A 结束启动发送, 如果发送成功会返回+CMGS: xx OK。
5
GSM 发送中文短信步骤
(假设给号码为 13XXXXXXXXX发送:“信盈达欢迎你”)的流程: 发送 AT+CMGF=1, 设置为文本模式;
发送 AT+CSCS=\, 设置 TE 字符集为 UCS2; 发送 AT+CSMP=17,0,2,25, 设置短消息文本模式参数;
AT+CMGS=“00310033003200360035003400330034003500360039”,等待模块返回“>”
发送短信内容:
”4FE176C88FBE79D1628067099650516C53F86B228FCE60A8FF01”, 最后以十六进制 0X1A 结束启动发送 如果发送成功会返回+CMGS: xx OK。
四、主要程序
实现接打电话、收发短信,并用LCD屏显示回馈状态。 主程序:
#include \
#include \
#include \#include \#include \#include \#include \#include \#include \#include \
void delay(void) { u32 i=1000000; while(i--); }
int main(void)
{ u32 key_cont=0; u8 key,ack; u8 *p; SystemInit(); led_init(); key_init(); delay_init(72); usart1_init(9600); LCD_Init( );
6
LCD_ShowString(10,100,200,16,16,\ //LED初始化
while(NULL==send_ack(\ {
LCD_ShowString(10,100,200,16,16,\ delay_ms(500); }
while(NULL==send_ack(\ {
LCD_ShowString(10,100,200,16,16,\ delay_ms(500); }
while(NULL==send_ack(\ {
LCD_ShowString(10,100,200,16,16,\ delay_ms(500); }
while(1) {
u8 i;
p=send_ack(\ i=(*(p+6)-'0')*10; i+=(*(p+7)-'0');
LCD_ShowNum(10,100,i,2,16); if(i>20) break;
delay_ms(500); }
LCD_ShowString(10,100,200,16,16,\ LCD_ShowString(10,120,200,16,16,\
LCD_ShowString(10,140,200,16,16,\ LCD_ShowString(10,160,200,16,16,\ while(1) {
key_cont++; if(key_cont==10) {
key=key_scan(); key_cont=0; }
if(UP_KEY_OK==key) {
LED1=!LED1; //打电话模式 calling_mode(); }
else if(DOWN_KEY_OK==key)
7
{
LED2=!LED2;//接电话模式 }
else if(LEFT_KEY_OK==key) {
LED3=!LED3;//收短信模式 }
else if(RIGHT_KEY_OK==key) {
LED4=!LED4;//发短信模式 } delay_ms(1); } }
打电话GSM程序:
#include \#include \#include \#include \#include \#include \#include \#include \
u8* send_ack(const char*comm,const char*ack,u16 timeout) {
u8 *p;
rec_sta=0;
printf(\
while(timeout--) {
if(rec_sta==1) {
p=strstr((const char*)rec_buf,(const char*)ack); rec_sta=0; if(p!=NULL) break; }
delay_ms(1); if(rec_num>0) rec_cont++; if(rec_cont>20) {
rec_sta=1;
8
rec_cont=0;
rec_buf[rec_num]='\\0'; rec_num=0; } }
if(timeout==0) return NULL; else
return p; }
void calling_mode(void) {
u8 key_cont,key; u8 *p;
LCD_Clear(BLUE);
LCD_ShowString(10,100,200,16,16,\ LCD_ShowString(10,120,200,16,16,\ LCD_ShowString(10,140,200,16,16,\ while(1) {
key_cont++; if(key_cont==10) {
key=key_scan(); key_cont=0; }
if(LEFT_KEY_OK==key) {
LED1=!LED1;
p=send_ack(\打电话 if(p==NULL)//LCD屏幕显示 {
LCD_ShowString(10,100,200,16,16,\ } else {
LCD_ShowString(10,100,200,16,16,\ } }
else if(RIGHT_KEY_OK==key) {
LED2=!LED2;
send_ack(\ break; }
else if(DOWN_KEY_OK==key)
9