热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

做一个项目,需要使用单片机控制GSM模块收发短信

#includeserial.h#includebianliang.h#include<REG51.h>#include<string.h>
#include "serial.h"
#include "bianliang.h"
#include
#include
#include "1602.H"
#define rev_FAUSE 0 
#define rev_OK 1
#define SELInt_on() ES=1      
#define SELInt_off() ES=0      
uchar temp[3];
unsigned long ss;


extern bit P0_0;
extern bit P0_1;
extern bit P0_2;
extern bit P0_3;
extern bit P0_4;
extern bit P0_5;
extern bit P0_6;
extern bit P0_7;


sbit P0_0=P0^0;
sbit P0_1=P0^1;
sbit P0_2=P0^2;
sbit P0_3=P0^3;
sbit P0_4=P0^4;
sbit P0_5=P0^5;
sbit P0_6=P0^6;
sbit P0_7=P0^7;
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
sbit P1_3=P1^3;
sbit P1_4=P1^4;
sbit P1_5=P1^5;
sbit P1_6=P1^6;
sbit P1_7=P1^7;
sbit P2_0=P2^0;
sbit P2_1=P2^1;
sbit P2_2=P2^2;
sbit P2_3=P2^3;


void delay1(int n)
{
  uchar i;
  while(n--)
   for(i=0;i<100;i++);
}
void Excrescent(void)
{
if(Rev_Buf[0]==0x00)
xx=1;
else
xx=0;
}


void gsm_Over(void)
{
  Ser_TxDchar(0x0d);
  Ser_TxDchar(0x0a);
}






void Cls_Rebuf(void)
{
unsigned char i;
for(i=0;i {
    Rev_Buf[i]=0;
}
Rev_count=0;  
}




Test_Mc39i(void)
{
Cls_Rebuf();
  SELInt_off();
Ser_TXDstring(TC_HEAD,2);//发送AT
gsm_Over();//回车换行
SELInt_on();
while(Rev_count<9);
Rev_count=0;
Excrescent();
for(i=5+xx;i<7+xx;i++)
{
temp[i-5-xx]=Rev_Buf[i];
}
    if(!strcmp(temp,TC_OK))
return rev_OK;
else
return rev_FAUSE;


}




MES_Mode(unsigned char mode)
{
Cls_Rebuf();
  SELInt_off();
  Ser_TXDstring(TC_HEAD,3);
  Ser_TXDstring(TC_CMGF,5);
  Ser_TxDchar(mode+0x30);
  gsm_Over();
  SELInt_on();
while(Rev_count<15);
Rev_count=0;
Excrescent();
for(i=12+xx;i<14+xx;i++)
{
temp[i-12-xx]=Rev_Buf[i];
}
    if(!strcmp(temp,TC_OK))
    return rev_OK;
else
return rev_FAUSE;

}




Set_Speed(void)
{


Cls_Rebuf();
  SELInt_off();
Ser_TXDstring(TC_HEAD,3);
Ser_TXDstring(TC_IPR,8);
gsm_Over();
SELInt_on();
while(Rev_count<18);
Rev_count=0;
Excrescent();
for(i=14+xx;i<16+xx;i++)
{
temp[i-14-xx]=Rev_Buf[i];
}
    if(!strcmp(temp,TC_OK))
return rev_OK;
else
return rev_FAUSE;

}


Sent_Mes(unsigned char *p)
{
Cls_Rebuf();
  SELInt_off();
Ser_TXDstring(TC_HEAD,3);
Ser_TXDstring(TC_CMGS,5);
Ser_TxDchar(0x22);
  Ser_TXDstring(TelNumber,11);
  Ser_TxDchar(0x22);
  gsm_Over();
  SELInt_on();
ss=0xffff;
while(Rev_Buf[Rev_count-1]!=0x3e)
    {
ss--;   
if(ss==0)
{return;}
    }
SELInt_off();
Ser_TXDstring(p,5);
Ser_TxDchar(0x1a);
SELInt_on();
}
Store_Location(void)
{


Cls_Rebuf();
  SELInt_off();
Ser_TXDstring(TC_HEAD,3);
Ser_TXDstring(TC_CPMS,5);
Ser_TxDchar(0x22);
Ser_TXDstring(TC_SM,2);
Ser_TxDchar(0x22);
Ser_TxDchar(0x2C);
Ser_TxDchar(0x22);
Ser_TXDstring(TC_SM,2);
Ser_TxDchar(0x22);
Ser_TxDchar(0x2C);
Ser_TxDchar(0x22);
Ser_TXDstring(TC_SM,2);
Ser_TxDchar(0x22);
gsm_Over();
SELInt_on();
while(Rev_count<54);
Rev_count=0;
Excrescent();
for(i=50+xx;i<52+xx;i++)
{
temp[i-50-xx]=Rev_Buf[i];
}
    if(!strcmp(temp,TC_OK))
return rev_OK;
else
return rev_FAUSE;


}




Auto_Prompt(void)
{


Cls_Rebuf();
  SELInt_off();
Ser_TXDstring(TC_HEAD,3);
Ser_TXDstring(TC_CNMI,8);
gsm_Over();
  SELInt_on();
while(Rev_count<17);
Rev_count=0;
Excrescent();
for(i=14+xx;i<16+xx;i++)
{
temp[i-14-xx]=Rev_Buf[i];
}
    if(!strcmp(temp,TC_OK))
return rev_OK;
else
return rev_FAUSE;
}




void New_Mes(void)
{
Excrescent();
for(i=3+xx;i<7+xx;i++)
{
temp1[i-3-xx]=Rev_Buf[i];
}


    if(!strcmp(temp1,TC_CMTI))
{
if(Rev_Buf[10]==0x53&&Rev_Buf[11]==0x4D)
{
NewSMS_flag=1;
MES_COUNT=Rev_Buf[13];
Cls_Rebuf();
}
}


}




void Read_Mes(uchar num)
{
Cls_Rebuf();
  SELInt_off();
Ser_TXDstring(TC_HEAD,3);
Ser_TXDstring(TC_CMGR,5);
Ser_TxDchar(num);
gsm_Over();
SELInt_on();
ss=0xffff;
while(Rev_Buf[Rev_count-1]!=0x4B)
    {
ss--;  
if(ss==0)
{return;}
    }
for(i=30;i<40;i++)
{
if(Rev_Buf[i]==0x2B&Rev_Buf[i+1]==0x38&Rev_Buf[i+2]==0x36)
{
t=i;

}
}
for(i=t+3;i {
TEL_Buf[i-t-3]=Rev_Buf[i];
}
TEL_Buf[11]=0x00;

for(i=t-20;i {
CMD_Buf[i-t+20]=Rev_Buf[i];
CMD_Buf[5]=0x00;
}


}




Del_Mes(num)
{
Cls_Rebuf();
SELInt_off();
Ser_TXDstring(TC_HEAD,3);
Ser_TXDstring(TC_CMGD,5);
Ser_TxDchar(num);
gsm_Over();
SELInt_on();
while(Rev_count<14);

Rev_count=0;
for(i=12;i<14;i++)
{
temp[i-12]=Rev_Buf[i];
}
    if(!strcmp(temp,TC_OK))
return rev_OK;
else
return rev_FAUSE;
Cls_Rebuf();
}






void CMD_SHIBIE(void)
{
if(!strcmp(TEL_Buf,TelNumber))
{
P1_2=0;
TELNUM_OK=1;  

}
else  
{ P1_3=0;
TELNUM_OK=0;
Del_Mes(MES_COUNT);
Cls_Rebuf();
NewSMS_flag=0;
}
if(!strcmp(CMD_Buf,CMD_1))
{
CMD=1;


}
else if(!strcmp(CMD_Buf,CMD_2))
{
CMD=2;


}
else
{
CMD=0;
}
}






void INIT_GSM(void)
{
if(Test_Mc39i())
{
if(MES_Mode(1))
{
if(Set_Speed())
{
if(Store_Location())
{
if(Auto_Prompt())
P1_0=0;
}


}

}
}
Cls_Rebuf();

}


我做过一点;
(1)pc机和单片机发送的串口数据是不是不一样?
答:一样,一般都为9600,n,8,1

(2)把单片机和pc上位机相连,pc的超级终端接收的命令确实正确的?
答:可以连,注意RXD和TXD应交叉对联。满足单片机发送PC接收,PC发送MCU接收的关系

(2)是不是单片机和pc机波特率不一样?
答,GSM模块一般都是自适应模特率的,只要断电一次,就可以自己适应当前波特率

注意:你通讯补上可能是RXD和TXD交叉的问题(交换TXD和RXD尝试)
,也可能是需要硬件握手的问题(RTS CTS


推荐阅读
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
author-avatar
阿凯宜_
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有