单片机连接gprs模块(装有sim卡),想让手机给模块发短信,那么怎么样才能让单片机知道来了
单片机128连接gprs模块(装有sim卡),想让手机给模块发短信,那么怎么样才能让单片机知道来了短信?并知道短信序号从而成功读取呢》?我知道用at+cnmi可以设置短消息提示方式,但是如果是超级终端,短信来了,可以看见提示的是哪一条,从而可以立刻读取
但是对于单片机,即时短信来了,我们也不知道是第几条啊,从而不知道该怎么读取,从不能从序号1一直读到末尾巴,很困惑,请大家赐教!不胜感激!
ps:实在是没经验,也没做过这东西,所以现在急死了,看了1个星期!
通常手机发短信给模块,超级终端 会提示+CMTI:“SM”,X(X表示接收短消息的SIM卡存储号码)
但是换成单片机,如何让单片机明白x是多少呢》从而正常读取! 既然超级终端能收到+CMTI:“SM”,X ,那么接到单片机上时,单片机串口一样会收到的,只要在单片机程序里边解析这个字符串
获得X不就可以了吗? 判断串口接受的值ASCII吗是x=‘x’ 这样可能会丢短信的,我的做法是一直读下去,到出出ERROR 321为止。 两种以上方法:
用读短信列表查
设置为收到短信主动发话通知 /*
我贴一段处理的代码:
使用的Freescale的9SO8AW16.
*/
//短信索引结构
typedef struct{
unsigned char In_Dex;// 短信索引
unsigned char Mess_len ;//索引长度
} MESSAGE_t;
//短信内容结构
typedef struct{
unsigned char M_state; // 信息状态,1未读,0已读
unsigned char Sender ; //发信息者号码 e:<+8613934240439>
unsigned char M_DATA ;//时间 e:<08/08/07,10:06:03>
unsigned char M_main ; //信息内容 30字符,多余的舍去.
unsigned char M_Length; //信息长度
} Message_xinxi_t;
volatile static unsigned char UART1_RX_state = 0X00;//串口1接收状态机
volatile static unsigned char RX1_counter = 0;//串口1接收辅助记数
volatile static unsigned char RX1_BUF = 0; //串口1接收缓冲区
MESSAGE_t Message ={{0},0};
Message_xinxi_t M_XinXi ={0,{0},{0},{0}};
/*****************串口1接收中断*************************************/
interrupt 17 voidSCI1_RE(void) {
unsigned char buff1 = 0;
unsigned char k = 0;
while(!SCI1S1_RDRF);
buff1 = SCI1D;
// SCI1_putchar(buff1);
//#define DEBUG_RXGPS0
switch(UART1_RX_state)
{
case 0x00 : RX1_BUF = SCI1D; //引导同步头
switch(RX1_counter)
{
case 0 :if(RX1_BUF != '+')
RX1_counter = 0;
else
RX1_counter++;
break;
case 1 :if(RX1_BUF != 'C')
RX1_counter = 0;
else
RX1_counter++;
break;
case 2 :if(RX1_BUF != 'M')
RX1_counter = 0;
else
RX1_counter++;
break;
case 3 :if(RX1_BUF != 'T')
RX1_counter = 0;
else
RX1_counter++;
break;
case 4 :if(RX1_BUF != 'I')
RX1_counter = 0;
else
RX1_counter++;
break;
case 5 :if(RX1_BUF != ':')
RX1_counter = 0;
else
RX1_counter++;
break;
case 6 :if(RX1_BUF != ' ')
RX1_counter = 0;
else
{
RX1_counter = 0;
UART1_RX_state = 0x11;
}
break;
default :break;
}
//////////////////////////////////////////////////////////////////////////////////////////////
#ifdef DEBUG_RXGPS0
SCI1_putchar('A');
#endif
break;
case 0x11 : RX1_BUF = SCI1D; //"SM",
RX1_counter++;
if((RX1_counter > 4) &&(RX1_BUF == ','))
{
RX1_counter = 0;
if((RX1_BUF == 'S') && (RX1_BUF == 'M'))
{
UART1_RX_state = 0x12;
}
else
{
UART1_RX_state = 0;
}
}
#ifdef DEBUG_RXGPS0
SCI1_putchar('B');
#endif
break;
case 0x12 : RX1_BUF = SCI1D; //信息索引
RX1_counter++;
if((RX1_counter > 0) &&(RX1_BUF == 0X0A))
{
for(k = 0;k < RX1_counter-2;k++)
Message.In_Dex = RX1_BUF;
Message.Mess_len = RX1_counter-2;
// Debug_puts(Message.In_Dex,Message.Mess_len);//输出字符串
OFF_SCI1_RXF; //关闭接收短信
OFF_SCI2_RXF; //关闭GPS
NEW_Message_Flag = 1;
RX1_counter = 0;
UART1_RX_state = 0x00;
}
#ifdef DEBUG_RXGPS0
SCI1_putchar('C');
#endif
break;
default :break;
}
}
//根据索引读取消息内容
unsigned char Read_Message(MESSAGE_t* P_index,Message_xinxi_t* P_xinxi) //读消息
{
unsigned char k = 0;
unsigned char BUF = {0};
String_Send((unsigned char*)CMGR,8);
String_Send(P_index->In_Dex,P_index->Mess_len);
String_Send((unsigned char*)CR_LF,2);
for(k = 1;;k++) //接收回显
{
BUF = GSM_getchar();
if((BUF ==0X0A) && (BUF ==0X0D))
break;
}
k = 0;
do //接收响应信息
{
BUF = GSM_getchar();
k++;
if((BUF =='E') && (BUF =='R'))
return 0;
}while(BUF != ',');
if(BUF == 'U')
P_xinxi->M_state = 1;
else
P_xinxi->M_state = 0;
k = 0;
do //接收响应信息--发送方手机号码
{
BUF = GSM_getchar();
k++;
// if((BUF !='"') || (BUF =='"'))
//return 0;
}while(BUF != ',');
for(k = 0;k < 14;k++)
P_xinxi->Sender = BUF;
k = 0;
do //接收响应信息 --,分割符
{
BUF = GSM_getchar();
k++;
}while(BUF != ',');
k = 0;
do //接收响应信息--时间信息
{
BUF = GSM_getchar();
k++;
//if((BUF !='"') || (BUF !='"'))
// return 0;
}while(BUF != '+');
for(k = 0;k < 17;k++)
P_xinxi->M_DATA = BUF;
k = 0;
for(k = 0;;k++) //接收回显
{
BUF = GSM_getchar();
if((BUF ==0X0A) && (BUF ==0X0D))
break;
}
k = 0;
do //接收响应信息
{
P_xinxi->M_main = GSM_getchar();
k++;
if(k>sizeof(P_xinxi->M_main))
break;
}while(P_xinxi->M_main != 0x0A);
P_xinxi->M_Length = k-2;
return 1;
} AT+CMGF=0
AT+CNMI=2,2,0,0,0
SIM300适用 谢谢楼上几位,前几天回家了,今天开始复工,继续做。。。5楼的程序有些复杂,但是对我受益匪浅,我觉得可能是我的中断程序太简单了!
void __attribute((signal)) __vector_18(void)
{
{os_atomic_t _nesc_atomic = os_atomic_start();
{
switch((char)UDR0)
{ case'X':
control_node1();
break;
case'Y':
control_node2();
break;
case'Z':
control_node3();//control_node3()为中断处理函数
break;
}
}
os_atomic_end(_nesc_atomic);
}
} case 0x00 : RX1_BUF = SCI1D; //引导同步头
想问下引导同步头什么意思,我编程基础很差 我看楼主的通信还是没有搞定呀,先把通信搞好,这个可是实现功能的基础 你好,不知道可以向你请教么! +CMTI:“SM”,X ,
这个是新短信的提示呀.
case 0x00 : RX1_BUF = SCI1D; //引导同步头
在这个case里就是接收 +CMTI: 这个字段了 已经成功了,谢谢楼上 我遇到的问题和楼主有些相似,能否请教楼主些问题呢? 标记 MARK 走过 mark MARK 用扩展指令模块,可以直接输出GBK码短信内容,你只要监听串口就行了 mark mark mark 好好学习啦,MARK MARK关注中 关注中。标记! {:loveliness:}楼主和强大 用的数据结构很到位 mark , 这个要好好学习一下。 一般上设置上动上报就行了。 短信可以查中断,有短信会有一个20ms的低电平在ring管脚,也可以查串口信息,有短信会有+CM:xxxx 标记下,一定用得到 学习,ing
页:
[1]