写英文短信
写短信是向单片机的SBUF寄存器一位位发送字符串,从而与SIM800C模块达到通信的目的
void UartPrintf(unsigned char *p) //发送字符串
{
while(*p)
{
SBUF=*(p++);
while(TI==0)
{;;;};
TI=0;
}
}
char SIM800_Init()
{
Uart_Init();//初始化串口是9600
UartPrintf("AT\r\n");//先发AT,让GSM模块自动获取波特率为9600
/检测模块是否有回应,接收OK判断
UartPrintf("AT+CMGF=1\r\n");
设置文本模式为英文,接收OK判断
UartPrintf("AT+CSCS=\"GSM\"\r\n");
设置GSM字符集,接收OK判断
return 0;//初始化完成
}
void main()
{
while(SIM800_Init!=0);
UartPrintf("AT+CMGS=\"手机号\"\r\n");
延时或者收到反馈 > ;
UartPrintf("英文短信内容");
延时10ms;
向SBUF寄存器发送字符0x1a;//是字符,不是字符串
while(1);
}
写短信网上的源码到处都是,在这就不多做叙述了。
读英文短信
首先,读的短信一定是英文或者短中文短信,在这我用英文短信举例。
因为52内存的限制,读取短信的时候内存会超出,所以我们需要舍弃一些不需要的内容
+CMGR:“短信是否读取”,“短信手机号来源”,“”,“接收时间”
短信内容
在读短信的时候,SIM800C会向我们发送这些数据,以做简单的接收短信来控制外设为例,我们需要的是短信内容,其他的都可以舍弃,在这里就可以在写入数据的时候做个选择——从“:”开始,“\n”之前的数据,我们不读了,不再占用空间。
void readSBUF() interrupt 4 using 1 //串口中断
{
unsigned char i = 0;
if(RI == 1)
{
temp = SBUF;
if((temp == ':')||(flag == 1)) flag = 1;
else
if(num < 32)
{
RX_Buffer[num] = temp;
num++;
}
else
{
num = 0;
}
if(temp == '\n')
{
RX_Buffer[num] = temp;
if(flag == 0)
num = 0;
flag = 0;
flagReceive = 1; //接收数据判断
}
RI = 0;
}
}
这样设置的话,假如串口传的数据是
+CMGR:…………………………………………
OK
我们读的数据就是+CMGROK\r\n
这样就不会出现被用不到的数据占用内存的情况。
同样,也可以选择不接收其他的数据来为内存释放空间。
以上程序不全,因某些原因,源码要迟一些发布,一些地方也用伪代码代替,有不明白的可以私我。
源码已发布://download.csdn.net/download/weixin_44206533/11866969