GSM/GPRS芯片是手机中负责收发短信、拨打电话以及访问GPRS网络的核心器件。有方M660+为深圳有方公司生产的一款超小封装的GSM/GPRS工业无线模块,可以提供高品质的语音、短信、数据业务等功能,在各种工业和民用领域得到广泛的应用。

有方M660+ GPRS模块的硬件设计

硬件设计参考附件《M660+ 硬件设计指南》。

需要注意的几点:

  1. 模块工作电压为3.5V~4.3V(推荐值3.9V),不是5V。

  2. 模块平时工作电流较小,但是在模块注册网络或者其他一些特殊情况下,电流可能瞬间达到1.8A,如果电源供电能力不足,电压瞬间下降严重,将可能导致模块工作异常,没有信号,无法收发短信等情况。建议采用大电流的开关电源芯片供电,如LM2596 DC-DC转换模块;对于移动式设备,采用一块3.7V锂离子电池则刚好可以满足要求;另外应在GPRS模块供电端附近增加大电容滤波,滤波电容大小见硬件设计指南。

    • 瞬间电流Max 1.8A
    • 平均工作电流 <300mA
    • 待机电流1.5mA typ

  3. 该模块使用3.3V 电平串口,即高电平为3.3V,不是5V,对于5V电平的单片机或TTL串口,为保证工作可靠,不至于烧坏芯片,最好按照硬件设计指南中电路图搭建电平转换电路。

单片机系统的硬件设计

通常使用较多的单片机有51、AVR、MSP430、STM32等。需要根据系统功能,考虑选择合适的单片机。

51单片机使用5V电平,且多数型号RAM、ROM较小,运行速度较慢,适合做一些较简单的应用,优点是简便易学,且焊接容易(很容易买到使用DIP(直插式)封装的51单片机)。

430单片机使用3.3V电平,与GPRS模块能很好的兼容,且配置相比51更好,最大的特点是低功耗,且性价比较高,适合做不需要处理大量数据(如多媒体信息处理,复杂的人机交互)的多数应用。缺点是大部分430采用贴片封装,不易于焊接,且使用不当容易烧坏芯片。

STM32单片机基于ARM7内核,功能强大,功耗较低,性价比很高,但对于只接触过51一类单片机的人来说,不一定能很好的掌握,因为正是由于功能强大,导致其程序庞大,一些比较简单的应用不需要使用STM32。STM32适合开发一些需要处理一些图片、音频,以及用户可视化交互的系统。

总体来说,推荐优先选用MSP430;如果应用比较简单,可使用51;如果需要一些较为复杂的数据处理,尤其是多媒体信息,可考虑使用STM32、ARM9及以上处理器,或者结合FPFA、DSP来实现。

有方M660+ GPRS模块的软件设计

从硬件层面来说,有方GPRS模块仅仅涉及了串口通信,硬件层的编程比较容易。初次接触GPRS模块编程时,比较难的是面向AT指令集协议编程(尤其是字符串处理很麻烦),以及如何编写高效,而又可靠健壮的程序。

AT指令集是一种可用于GSM/GPRS模块的通信协议。何谓协议?举个简单的例子,我们说话过程中使用的语言,作为大家共同接受的标准,可以在我们之间传递信息,这就叫做协议。而串口则是一种接口,接口又是什么呢?接口就是收发信息的实现,我们的嘴巴和耳朵就相当于接口。

接口和协议又有什么关系呢?串口作为接口,只能一个字节一个字节的传输字符,类似的,我们的嘴巴和耳朵原本也只能收发不同的声音。接口是具体实现,而协议则规定了接口传输的信息代表什么含义。如果没有接口,协议肯定没法实现,人没有嘴巴和耳朵是没法用声音交流的。另一方面,如果没有协议,或者协议不兼容,接口的实现也并不能代表什么含义。没有语言的话,两个人只是乱叫完全没法交流;如果两个人使用不同的语言,而且听不懂彼此的语言(相当于协议不兼容),也是同样不能交流的。

在GPRS模块软件的开发中,接口的实现远比协议实现要简单。接口的实现在这里就不做介绍,这里主要探讨如何编写高效可靠的程序来实现GPRS模块的协议即AT指令集。

完整的AT指令集请参考附件《AT命令手册》,这里只介绍一些基本用法。

AT指令集的学习

要想编写程序实现AT指令集的功能,就应该先学习AT指令集。如何学习AT指令集呢?一些人会直接给单片机写程序去控制GPRS模块的方式学习。事实上,这样很难学好AT指令集,往往会出现各种错误。当你对AT指令集不了解的情况下,盲目的去写程序,而又并不能保证程序没有错误按设想运行(如果你能保证这一点,那么你就是编程经验非常丰富的高手了,反正我是做不到这一点),这样的情况下,实验失败时,你根本没法确定是程序的问题还是AT指令集的问题,甚至有可能是硬件问题等等。

于是,一般我们将GPRS模块连接到计算机上来学习AT指令集。对于大多数没有串口的计算机,你需要有个USB转TTL串口的转接线,即使有RS232串口,也需要通过一些转接芯片进行电平转换,转换成TTL串口。注意GPRS模块TTL串口的电平为3.3V,尽量使用电平转换电路以免电平不兼容烧坏GPRS模块。同时,你需要设计好GPRS模块的供电电路,给其提供一个稳定可靠的电压。然后插上一张可用的手机SIM卡,连接好电源和串口,GPRS模块上电后会和手机开机一样,需要数分钟的时间搜索信号,然后就可以正常工作。

电脑端我们使用串口超级终端软件来调试GPRS模块。

当我们从超级终端给GPRS模块发送“AT”,并按回车时,如果一切正常,屏幕上会显示返回的“OK”字符,这就是AT指令集最基本的操作:确认AT指令集工作正常。

通过AT指令集初始化GPRS模块一般包括以下步骤(前面加“--”符号的表示正常工作返回的字符串,不同模块不完全一样,仅供参考,//表示注释):

AT // 确认AT指令集工作正常
--OK
ATE0 // 关闭回显(即禁止GPRS模块发送接收到每一个的字符,在电脑上调试时不需此语句)
--OK
AT+CPIN? // SIM卡准备好?
--READY
AT+CMGF=1 // 设置短消息格式为Text模式,需在模块上电一段时间后才能正常返回OK,在此之前会返回ERROR
--OK
AT+CSMP=17,167,0,0 // 设置Text模式参数,用于短信发送
--OK
AT+CSCS="GSM" // 设置GSM字符集,用于短信发送
--OK
AT+CREG? // 网络注册完成?应该一直循环发送此句直到网络注册完成才能进行短信和电话操作,如果没有信号,也会返回错误信息
--+CREG: 0, 1, "341B", "2DBF"

如果需要使用GPRS网络,也可以在此处初始化,或者在需要使用时才初始化。

写程序时发送这些字符串要注意,在每一句结尾处应有一个"\r"结束标志(回车符,ASCII码中的13,常缩写为)。对于大部分指令,GPRS模块接收到此结束符才会执行指令。另外有些引号不可省略,在写程序时应写为转义字符。

网络注册正常后,发送ATD10086,就会给10086打电话,返回OK说明正在尝试拨打,拨号成功或没有信号会返回相应字符串。拨号成功,如果连接了话筒和耳机,就能正常通话了。

发送短信有两种方式,一种是TEXT模式,另一种是PDU模式,需要先设置好。其中TEXT模式只支持英文(不排除可能有些模块或者某些特别的方法能使其支持中文),PDU模式支持中文,但编码方式较为复杂。

PDU可参考:http://yuanyu5237.iteye.com/blog/1126185

注:文中提到一个字符ASCII码中的26(0x1A),在超级终端中可通过Ctrl+Z输入

AT指令集协议的编程实现

要编写一个高效而又可靠的程序,我们既要向GPRS模块发送数据,又需要接收返回的数据并判断返回值是否正确。

发送数据可以调用串口发送函数直接发送,而接收数据时,需要接收一段完整的字符串。由于单片机可能正在处理其他任务,并不一定能马上响应接收的指令。编程时我们可以使用环形队列作为串口接收缓冲区,并在接收到"\r"结束符时置位一个接收标志,然后等待CPU处理。对于一些特殊情形,返回值并不是以"\r"结束,比如发送短信提示输入短信内容时是以">"结束,此时可以通过延时等待并不断查询的方式判断是否接收到正常的返回值。

还有一种通过超时判断是否接收完一条指令的方法,效果相对比较好。当接收到第一个字符时,启动定时器计时,如果一定时间内接收到下一个字符,清零定时器,再次重新计时……当接收到某个字符之后,计时到超过一定时间仍未收到下一个字符,表明接收完一条指令。因为返回的每条指令都是连续发送出来的,间隔时间固定,所以这种方式能准确判断指令是否接收完成,缺点是会占用更多硬件资源(需要多用一个定时器)。

为了充分实现代码复用,加快程序开发,可以考虑实现这样几个函数:

// 字符串复制(可使用string.h中的标准函数)
void StrCopy(char*, char*);
// 判断一个字符串是否包含另一个字符串
unsigned char StrContain(char*, char*);
// 发送指令并等待返回指定字符串。注意如果超时仍未返回指定字符串,则应退出函数,以免死机
unsigned char SendAndGet(char*, char*);
// 发送指令并等待返回指定字符串,尝试n次
unsigned char SendAndGetTimes(char*, char*, unsigned char);
// 初始化AT指令集设备,返回初始化是否成功结果
unsigned char AT_Init(void);
// 发送短信,并返回发送是否成功标志
unsigned char SendMsg(char*, char*);
// 检测模块当前是否有信号
unsigned char CheckSignal(void);

一些更复杂的问题

当先后间隔很短时间发送多条指令,或者是前一条指令需要GPRS模块使用较长时间去响应时,情况就变得比较复杂了。比如说,我们给出指令发送一条短信,一般可能在10秒左右时间发完,然后返回OK。而在返回OK之前,如果又需要发送另外一条指令,或者很不幸有人打电话来,处理起来就很麻烦了。再比如在间隔很短时间内接收到多条消息,前一条正在处理,后一条消息又被接收到,这个时候怎么保证不遗漏消息呢?我们可以考虑使用队列来解决这个问题。

类似这样的问题很多,尤其对于速度低存储空间小的单片机来说也不太好解决,而对于一些简单应用也不一定要考虑这么多情况,本文不做详细探讨。

附件

串口超级终端 http://download.csdn.net/detail/jzj1993/5744509

有方M660+硬件设计指南 http://download.csdn.net/detail/jzj1993/5507753

AT命令手册 http://download.csdn.net/detail/jzj1993/5507747

本文由jzj1993原创,转载请注明来源:http://www.paincker.com/gprs-design

GSM/GPRS模块 AT指令集C语言编程——基于有方M660+和MSP430单片机的更多相关文章

  1. Linux-C实现GPRS模块发送短信

    “GSM模块,是将GSM射频芯片.基带处理芯片.存储器.功放器件等集成在一块线路板上,具有独立的操作系统.GSM射频处理.基带处理并提供标准接口的功能模块.GSM模块根据其提供的数据传输速率又可以分为 ...

  2. 认识和选用常用的几种 GPRS 模块(转)

    源:http://blog.sina.com.cn/s/blog_4d80055a0100e8kr.html 我在这里把常见的GPRS模块分成3种: (1)GPRS DTU(GPRS数传单元,常称GP ...

  3. 个人c语言编程风格总结

    总结一下我个人的编程风格及这样做的原因吧,其实是为了给实验室写一个统一的C语言编程规范才写的.首先声明,我下面提到的编程规范,是自己给自己定的,不是c语言里面规定的. 一件事情,做成和做好中间可能隔了 ...

  4. linux下利用GPRS模块发短信、打电话

    一.开发环境     内核版本:linux-3.0    开发板:FL2440(nandflash:K9F1G08 128M)    GPRS模块:SIM900   二.与发短信和拨号相关的 AT 指 ...

  5. GSM Hacking:如何对GSM/GPRS网络测试进行测试

    写在前面 这里需要介绍的是GSM / GPRS网络测试的一些方法,随着现在硬件设备连网现象的普遍存在,例如智能电表.自动变速箱控制单元(TCU).POS机.报警系统等.这些设备通常需要与网络连接,GS ...

  6. 第二章 C语言编程实践

    上章回顾 宏定义特点和注意细节 条件编译特点和主要用处 文件包含的路径查询规则 C语言扩展宏定义的用法 第二章 第二章 C语言编程实践 C语言编程实践 预习检查 异或的运算符是什么 宏定义最主要的特点 ...

  7. 华为C语言编程规范

    DKBA华为技术有限公司内部技术规范DKBA 2826-2011.5C语言编程规范2011年5月9日发布 2011年5月9日实施华为技术有限公司Huawei Technologies Co., Ltd ...

  8. linux 操作系统下c语言编程入门

    2)Linux程序设计入门--进程介绍 3)Linux程序设计入门--文件操作 4)Linux程序设计入门--时间概念 5)Linux程序设计入门--信号处理 6)Linux程序设计入门--消息管理  ...

  9. R语言编程艺术(5)R语言编程进阶

    本文对应<R语言编程艺术> 第14章:性能提升:速度和内存: 第15章:R与其他语言的接口: 第16章:R语言并行计算 ================================== ...

随机推荐

  1. Java 将 PPT 形状(表格、文本框、心形、图表等)保存成图片

    MS PowerPoint中的表格.文本框.心形.图表.图片等均可以称为形状,将这些形状保存成图片,便可分类储存,方便日后查找,再利用. 本文将介绍如何使用 Spire.Presentation fo ...

  2. Elasticsearch进阶篇(一)~head插件的安装与配置

    1.安装node.js 1.1.通过官网下载二进制安装包 https://nodejs.org/en/download/ 选择对应的版本,右键复制下载链接,进入linux目录,切换到要安装目录的磁盘. ...

  3. Django框架之第六篇(模型层)--单表查询和必知必会13条、单表查询之双下划线、Django ORM常用字段和参数、关系字段

    单表查询 补充一个知识点:在models.py建表是 create_time = models.DateField() 关键字参数: 1.auto_now:每次操作数据,都会自动刷新当前操作的时间 2 ...

  4. Spring Boot与mybatis整合

    完整的项目截图 一:pom依赖 新增ojdbc6及batis-spring-boot-starter依赖 <dependency> <groupId>com.oracle< ...

  5. Docker容器挂载文件(转载)

    一.Docker pull 安装 Nginx 1.查看docker仓库中的 nginx 命令 # 使用 docker search 命令搜索存放在 Docker Hub 中的镜像 docker sea ...

  6. Scala 系列(一)—— Scala 简介及开发环境配置

    一.Scala简介 1.1 概念 Scala 全称为 Scalable Language,即"可伸缩的语言",之所以这样命名,是因为它的设计目标是希望伴随着用户的需求一起成长.Sc ...

  7. [golang]按图片中心旋转后的新图左顶点和原图左顶点的偏移量计算

    1 前言 略,作为记录使用 2 代码 /** * @Author: FB * @Description: * @File: RotateSample.go * @Version: 1.0.0 * @D ...

  8. 微信小程序代码开源啦

    想学习如何使用mpvue开发微信小程序吗? 想知道微信消息推送如何实现吗? 想知道如何用springboot开发小程序后台吗? 看这里就全都有了.耗时一个月打造的微信小程序:PSN折扣助手前后端所有源 ...

  9. CSS-宽度自适应和浏览器兼容笔记

    自适应 宽度自适应:网页元素根据窗口或子元素自动调整宽度 适用百分比进行设置,例如:100% 铺满:50% 占据一般宽度 块元素如果不设置宽度,默认为100% 自适应中可以设置最大或者最小宽度和高度 ...

  10. 设计的一些kubernetes面试题

    公司现在上了一部分的业务至k8s,老实说,我心里很慌,在项目改造中,每天都会遇到很多问题,好友找我出一份k8s面试题,参考了网上的一些,再加上自己公司遇到的一些问题,整理如下: 参考链接:http:/ ...