第四周 GSM模块测试
开源第四周
这几天做的主要就是sim900模块了,这个模块其实是个很有意思的模块,加上控制器和显示器基本算是一个小手机了,可以语音通话,发送短信,最主要的是还可以GPRS上网,所以很适合拿来做数据传输节点。我们用的模块是已经封装好了的模块,模块内部集成了各种指令,只需要用户调用各种指令就可以自动实现各种功能了。这个模块需要配合一张2G的sim卡来配合打电话发短信以及上网功能的实现。
模块指令的格式基本为AT+" ",发送完指令后模块会向返回一个反馈信息,例如拨打电话指令发送成功后会返回“OK”,如果不成功则返回“ERROR”。向模块发送AT指令在我理解有三种方式,第一种是电脑加连接线硬串口连接输入AT指令;第二种使用软串口通过电脑端向模块发送指令;第三种通过程序写入控制器,控制器程序向模块发送指令。
模块的功能大概分为三种:打电话、发信息、GPRS上网。打电话的功能非常简单,只需要一个简单的<ATD"电话号码";>就可以实现功能了,而发信息和打电话则要复杂得多了。
短信步骤:
1、需要设置发送模式,选择文本格式还是PUD模式;
2、设置文本发送模式的参数;
3、设置为 UCS2 编码字符集;
4、将所需发送的内容和电话号码转换为UNICODE 编码;
5、发送: AT+CMGS=“电话号码UNICODE 编码”,等待返回‘>’字符;
6、等到返回'>'字符后,输入内容的UNICODE 编码,再发送一个十六进制的OX1A发送信息。
上网的设置更加复杂,进行 GPRS 通信,实现模块与电脑的
TCP 和 UDP 数据传输。这里将要用到的指令有: 10 余条 AT 指令。需要选择联网模式、设置协议、设置端口、设置IP、等待返回‘>’字符输入内容、设置数据中心等等。
这里有些常用的AT指令:
测试信号质量,用串口发送下面的指令:
AT+CSQ
此时会收到形如下面这样的回复消息:
+CSQ: 11,0
OK
拨打电话(这条指令后的分号不可少),可以把下面指令里的10086,替换成其他号码。
ATD10086;(回车)
挂断电话
ATH
接听电话
ATA
发送短信
首先设置成文本模式:
AT+CMGF=1
设置使用模块默认的国际标准字母字符集发送短信
AT+CSCS?
发送目标号码
AT+CMGS=”10086″(回车)
此时系统会出现“>”提示符,直接输入短信内容
> YE
这条短信的目的是发送给10086,用来查询余额。
0x1A (16进制发送)
发送成功以后会收到系统如下提示,后面的数字表示发送短信的编号。
+CMGS: 115
OK
接收短信
如果接收到了短信,则系统会在串口输出如下的提示,后面的数字表示短信收件箱里的短信数目:
+CMTI: “SM”,2
发送如下AT指令,后面的数字是短信索引号。由于使用的是IRA编码,中文短信不能显示,可以发英文短信用来测试。
AT+CMGR=2
还有一些代码:
int val; //定义变量val
#define MAXCHAR 81 //recive buff max char
char aa[MAXCHAR]; //recive gsm model back signal
int j=0; //recive index
int g_timeout=0; //handing timechar ATE0[]="ATE0";
char CREG_CMD[]="AT+CREG?";
char SMS_send[]="AT+CMGS=18";
char ATCN[]="AT+CNMI=2,1";
char CMGF0[]="AT+CMGF=0";
char CMGF1[]="AT+CMGF=1";
char CMGR[12]="AT+CMGR=1";
char CMGD[12]="AT+CMGD=1";
/*************************************************/
#define SEND_MESSA_TO_YOUR "at+cmgs=\"18382117086\"\r\n" //发短信接收的手机号码
#define SEND_MESSA_CONTENT "http://shop69712475.taobao.com \n openjumper " //短信内容
#define CALL_YOU_TELNUMBER "ATD18382117086;\r\n" //打电话接受的手机号码
/*************************************************/
int readSerial(char result[]){int i = 0;while (Serial.available() > 0){char inChar = Serial.read();if (inChar == '\n'){result[i] = '\0';Serial.flush();return 0;}if(inChar!='\r'){result[i] = inChar;i++;}}}void clearBuff(void)//打电话发短信清除指令{for(j=0;j<MAXCHAR;j++){aa[j]=0x00;}j=0;}
int Hand(char *s)//发短信打电话发短信调用指令{delay(200);clearBuff();delay(300);readSerial(aa);if(strstr(aa,s)!=NULL) //检测单片机和模块的连接{g_timeout=0;clearBuff();return 1;}if(g_timeout>50){g_timeout=0;return -1;}g_timeout++;return 0;}
void send_english(void) //发短信{clearBuff();Serial.println(CMGF1);delay(500);while(Hand("OK")==0);clearBuff();Serial.println(SEND_MESSA_TO_YOUR);delay(500);while(Hand(">")==0);Serial.println(SEND_MESSA_CONTENT); //发短信内容delay(100);Serial.print("\x01A"); //发送结束符号 delay(10);delay(1000);while(Hand("OK")==0);}
void send_call(void) //打电话{clearBuff();Serial.println(CALL_YOU_TELNUMBER); //打电话delay(2000);while(Hand("OK")==0);}
void setup (void) { Serial.begin(115200);//设置波特率为115200// Serial.println("serial port [ok]!");
}
void loop (void)
{ send_english(); //发短信delay(1000);send_call(); //打电话while(1);
}
这一周感觉各种问题缠身,进度被卡住了。虽然脑子里的思路比较清晰,但是总被各种跳出来的拦路虎给难住了。
最近进度被有些慢,前几天终于把无线串口弄明白了,能够初步将无线串口发送而来的数据进行处理或者转发了,以前没想到这一点,总以为就是把数据显示出来就ok了。但是我果然还是很傻很天真,现实远远不是这样,显示出来远远不够。于是我就使用软串口来读取和处理数据。
现在能把数据传到节点的节点控制器控制了,但是但是,让我很痛苦的就是gsm900模块了,现在感觉就是它是一块大石头。gsm900模块对我的指令一闻不闻,我通过电脑连接模块,然后用硬串口发送AT指令根本无济于事及没有执行,也没有发聩,我把控制器写成空程序也是同效果。
我想到一种办法,将控制器内部编写一个程序,然后将控制器用外接电源供电,用软串口接收数据,硬串口发送指令。程序的大体思想就是用一个无线串口在电脑上发送AT指令,然后再用一块无线串口连接到节点控制器上,靠软串口接收指令。在程序内部,用一个字符串来接收存储指令。因为不是很了解是软串口和硬串口发送的指令到底是哪一个有效,所以我用软串口和硬串口两个串口同时输出字符串指令,但是都没有一个成功。
后来我想到了把指令通过程序写到控制器里,通过串口发送一些字符进去,用字符去控制指令的发送(或者直接用程序自动调动指令)。做了个最简单的打电话,传入一个字符命令开始打电话,再传入一个去挂断,结果成功了,我感觉问题解决了。但是今天后实验让我又苦恼了,电话的实验能够成功,但是我发短信因为要等到模块返回一个">"符号才能输入要发送的内容,所以没办法输入内容,所以GPRS功能也实现不了了。
现在最大的问题就是:发送指令到模块,模块一点反馈信息也没有,不知道到底生效没有。第一次使用sim900的时候直接用硬串口在电脑端输入AT指令就可以打电话了,当时也有反馈信息,但是测试过后一会就扩展板好像就出问题了。现在硬串口软串口AT指令都输不进去,就算行了指令也没有任何反馈信息,也不知道到底是哪里出了问题。现在指令通过串口发不进去,程序也没反馈,有点麻烦了,不过靠程序应该还是能行吧。
第四周 GSM模块测试相关推荐
- 孤尽训练营打卡日记day28--第四周总结
前言 光阴似箭,日月如梭.转眼已经过去了一个月,孤尽训练营第四周也已经结束,今天我们一起来对这一周的内容做个简单回顾. 第一次课 单元测试和系统安全规约 什么是单元测试? 对软件组成单元进行的测试,其 ...
- 制作一个老旧C118的GSM便携式测试设备
对于OsmocomBB也是被国内外大神玩得不亦乐乎.什么重定向攻击,中间人攻击.都是N年前的东西咯.当然鄙人不会这些.对于地下市场无非就是获取对方短信,大则支付宝.某日翻了翻"咸" ...
- stm32双向可控硅调压程序_单向可控硅和双向可控硅的测量与模块测试
可控硅,是可控硅整流元件的简称,是一种具有三个PN结的四层结构的大功率半导体器件,亦称为晶闸管.具有体积小.结构相对简单.功能强等特点,是比较常用的半导体器件之一. 可控硅导通条件:一是可控硅阳极与阴 ...
- android 获取手机GSM/CDMA信号信息,并获得基站信息
本文转自:http://software.intel.com/zh-cn/blogs/2011/12/16/android-gsmcdma/ 在Android中我们常用的轻松获取WIFI信号列表,那如 ...
- GSM中时隙、信道、突发序列、帧的解释
刚从论坛中看到有人问GSM中时隙.信道.突发序列.帧知识.今天我们数字通信正好上到这一块,我就根据我知道的和网上搜索的回答! 1.时分多路复用技术 FDMA:频分多址 TDMA:时分多址 CDMA:码 ...
- 20169212 2016-2017-2 《网络攻防实践》第四周学习总结
20169212 2016-2017-2 <网络攻防实践>第四周学习总结 教材学习中的问题和解决过程 wireshark学习 主机:Kali ip:192.168.1.117 目标:www ...
- pve rust 能拆家吗_RUST:2020年9月第四周:向上向上再向上!
九月第四周,马上就要迎来中秋国庆八天假!昨天被什么秋天第一杯奶茶的梗弄得一愣一愣的今天刚缓过劲来本期内容依旧是围绕了下个月即将上线的电梯展开更多消息被公布,让我们进来看个痛快!RUST:2020年9月 ...
- GSM A5/1算法C语言代码实现和分析
介绍 全球超过200个国家和地区超过10亿人正在使用GSM电话.对中国用户来说,GSM就是移动和联通的2g模式. 在1982年A5首次提出时,人们认为A5 / 1密钥长度要128位,但最终确定的结果是 ...
- 普通硬件就能破解GSM A5加密算法
如果你还在使用基于早期信号标准的GSM手机,那么你最好在使用手机的过程中小心一点了.因为根据国外媒体的最新报道,安全研究专家通过测试发现,他们只需要使用三张NVIDIA GeForce GTX690显 ...
最新文章
- 网站截图工具EyeWitness
- QButtonGroup
- (操作系统题目题型总结)第五章:设备管理
- 《浪潮之巅》读书笔记2
- phpMyAdmin链接MySQL拒接_phpmyadmin连接MySQL服务器被拒绝
- 网络协议:TCP/IP协议,你看懂了吗?
- DataSet里的数据写入XML文件
- 罗马仕php30重量,认真测评 篇三:罗马仕sence8P+两年使用报告
- visio2010最新密钥
- LeetCode1818:绝对差值和
- 开发常用词汇表(带音标)
- ps—添加、去除水印
- linux v4l2色调,V4L2下摄像头的详细参数调整
- css+js实现自动伸缩导航栏
- 紫羚云秦鸿林:大中型企业实施IT服务管理(ITSM)的几大难题
- 情感分析的分类,情感分析模型有哪些,情感分析的应用场景,情感分析的发展趋势
- Libgdx介绍及环境安装
- unittest使用详解
- 复数的概念及运算(复变函数)
- 海尔集团CEO张瑞敏演讲稿:人不成熟的5大特征
热门文章
- 2022年怎样的企业才能迎难而上?这场年会给你答案
- python实现找任意点关于直线的对称点
- 如何求数组中绝对值最小的数?
- django迁移数据库乱了,彻底重新再来的步骤
- (已部分解决)MySQL:IntegrityError(1062, Duplicate entry 'NULL' for key 'id')
- Other | PPTV电视安装第三方应用教程
- 100行matlab,中国大学MOOC: Matlab中可以产生100行100列元素全是1的正确的命令是() 答案:ones(100)...
- 动态规划的框架(套路), 总结
- 基于qt和opencv3人脸检测
- 俞敏洪励志演讲稿【一】