SIM900A高效完整的STM32代码
一、问题
最近使用SIM900A做一个STM32的项目,用的正点原子的代码,单独对demo测试没有问题,但是当集成到整个项目中时,效果就非常不理想,主要问题:
1、后台服务器接收到的数据时而密集,时而分散,即并不是按照代码中的设计来呈现
2、会有卡死的现象
3、效率低,有时候连接上服务器,但就是没有数据,实际上板子已经发送出来数据
介于以上问题,查看了众多的手册(22篇GPRS无线模块SIM900软硬件设计技术资料合集),并进过多次测试,最终运行效果很好:
二、代码
1,正点原子的demo代码 (不建议使用)
void Landing_Init(int id,int num,char *jiaoben, u8 *humiture_buff )
{u8 ch = 0x1A;//结束输入,发送数据int i=1000;if(sim900a_send_cmd("AT", "OK", 500)) return; //模块有效性检查,无效时候就不进行联网配置USART2_RX_STA = 0;sim900a_send_cmd("AT+CIPCLOSE=1", "CLOSE OK", 500); sim900a_send_cmd("AT+CGCLASS=\"B\"", "OK", 500);USART2_RX_STA = 0;sim900a_send_cmd("AT+CGDCONT=1,\"IP\",\"CMNET\"", "OK", 500);USART2_RX_STA = 0;sim900a_send_cmd("AT+CGATT=1", "OK", 500);USART2_RX_STA = 0; sim900a_send_cmd("AT+CIPCSGP=1,\"CMNET\"", "OK", 500);USART2_RX_STA = 0;sim900a_send_cmd("AT+CLPORT=\"TCP\",\"2002\"", "OK",500);USART2_RX_STA = 0;if(sim900a_send_cmd("AT+CIPSTART=\"TCP\",\"194.233.101.180\",\"7890\"", "OK", 500)) //服务端不在线时候则重新建立发送请求{sim900a_send_cmd("AT+CIPCLOSE=1", "CLOSE OK", 500);return;}USART2_RX_STA = 0;for(i=1; i>0; --i){delay_ms(3000);if(sim900a_send_cmd("AT+CIPSEND", ">", 50)) //进入透传模式{i++;if(i>4) return;continue;};delay_ms(400);u2_printf("%s\n",humiture_buff);delay_ms(1000); uart2_send(&ch,1);delay_ms(400);USART2_RX_STA = 0;}delay_ms(1000);while(sim900a_send_cmd("AT+CIPSEND", ">", 500)&&(i--)); //进入透传模式delay_ms(400);u2_printf("%s",humiture_buff);delay_ms(1000); uart2_send(&ch,1);delay_ms(400);USART2_RX_STA = 0; sim900a_send_cmd("AT+CIPCLOSE=1", "CLOSE OK", 500);
}
2,我的最终代码(墙裂推荐)
void Send_GPRS(u8 GPRS_DATAset[], u16 len, u8 TXtimes)
{u8 ch = 0x1A;//AT指令,结束输入,发送数据int i=0,j=0;char* strs;strs = (char*)malloc(len*sizeof(char));array2char(GPRS_DATAset,strs,len);//16进制数组转换成字符串sim900a_send_cmd("ATE0", "OK", 100);//关闭回显,减少返回的状态内容,降低出错率。delay_ms(100); memset(USART3_RX_BUF, 0, strlen((char *)(USART3_RX_BUF))); if(sim900a_send_cmd("AT", "OK", 200)){//模块有效性检查,无效时候就不进行联网配置sim900a_send_cmd("AT+CFUN=1,1", "I", 1500);//软件复位free(strs);return;}delay_ms(100); if(sim900a_send_cmd("AT+CGCLASS?", "\"B\"", 100))//移动台类别.默认状态下不需要频繁设置该值,返回:+CGCLASS: "B" OKsim900a_send_cmd("AT+CGCLASS=\"B\"", "OK", 100);delay_ms(100);sim900a_send_cmd("AT+CGDCONT=1,\"IP\",\"CMNET\"", "OK", 100);//连接方式,互联网接入协议(IP),接入点delay_ms(100); if(sim900a_send_cmd("AT+CGATT?", "1", 100)){ //附着 GPRS 业务.默认状态下不需要频繁设置该值。返回:+CGATT: 1 OKif(sim900a_send_cmd("AT+CGATT=1", "OK", 100)){sim900a_send_cmd("AT+CIPSHUT", "SHUT OK", 100);//关闭GPRS应用场景free(strs);return;}}delay_ms(100);if(sim900a_send_cmd("AT+CIPCSGP?", "1", 100)){ //设置为GPRS 连接,接入点为”CMNET”.默认状态下不需要频繁设置该值,返回:+CIPCSGP: 1,"CMNET","","" OKsim900a_send_cmd("AT+CIPCSGP=1,\"CMNET\"", "OK", 100);}delay_ms(100);sim900a_send_cmd("AT+CLPORT=\"TCP\",2022", "OK",100);//设置 TCP 连接,本地端口号为2022delay_ms(100);memset(USART3_RX_BUF, 0, strlen((char *)(USART3_RX_BUF))); if(sim900a_send_cmd("AT+CIPSTART=\"TCP\",\"194.233.100.10\",\"7890\"", "CONNECT OK", 800)) //服务端不在线时候则重新建立发送请求.返回:CONNECT OK{if(sim900a_send_cmd("AT+CIPSHUT", "SHUT OK", 200))//关闭GPRS应用场景sim900a_send_cmd("AT+CFUN=1,1", "I", 1500); //软件复位,重启后(移动卡)大概10s后正常free(strs);return;}delay_ms(100); for(i=0; i<TXtimes; i++){sim900a_send_cmd("AT+CIPSEND", ">", 100); //发送数据指令delay_ms(300);u3_printf(strs);//开始上传数据到服务器delay_ms(200); uart3_send(&ch,1);//发送结束符。当使用“AT+CIPSEND=n”n为常数,此语句须注销memset(USART3_RX_BUF, '0', strlen((char *)(USART3_RX_BUF)));USART3_RX_STA = 0; while(sim900a_check_cmd("SEND OK") == NULL){delay_ms(25);//成功发送数据后大概2s后会返回“SEND OK”if(j++ > 300) {//延时8s后还未成功,说明数据传输故障,后面语句不再执行free(strs);return;}}if(j<=300) //成功返回了“SEND OK”{memset(USART3_RX_BUF, 0, strlen((char *)(USART3_RX_BUF)));USART3_RX_STA = 0;delay_ms(1000);delay_ms(1000);delay_ms(1000);//3s后服务器会返回接收的数据的相关信息printf("Server return strings:\d\n",strlen((const char*)USART3_TX_BUF));//打印服务器返回的数据长度sim900a_send_cmd("AT+CIPCLOSE=1", "OK", 100); //断开与服务器的链接break;}}
free(strs);
}
3,代码中需要注意的地方
- malloc()和free()配套使用,否则可能会出现单片机死机或者卡机。
- sizeof()函数和strlen()函数的区别。
- 转义字符“\”在sim900a_send_cmd()函数中的使用。
- 函数原型:u8 sim900a_send_cmd(char *cmd,char *ack,u16 waittime)中的”ack“的取值要合理,比如数据发送成功后返回值:SEND OK OK,这时候可以用“SEND”,或者“SEND OK”来判断发送数据是否成功,但最好不要用“OK”。
- 语句 while(sim900a_check_cmd(“SEND OK”) == NULL)处务必加上灵活的结束条件(如“if(j++ > 300) return;”),否则单片机可能会卡死在这里!
- 适当的加入延时。
SIM900A高效完整的STM32代码相关推荐
- 如何高效的学习TensorFlow代码?
如何高效的学习TensorFlow代码? 如题,或者如何掌握TensorFlow,应用到任何领域? 添加评论分享 10 个回答 爱琳李,老李,明天就辍学了 8 人赞同 本来都忘了这个问题了,不过看到很 ...
- html自动生成工具_关于STM32代码自动生成的工具的进度....
前情提要:STM32代码自动生成工具_本想...但是...可是...所以 首先说一下那几天大家的反应,有的持观望态度,毕竟STM32CUBE很香:有的很激动,期待我快点出东西:还有的很淡定,知道我在挖 ...
- 剑指 Offer 34. 二叉树中和为某一值的路径【附完整可运行代码】
立志用最少的代码做最高效的表达 输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径.从树的根节点开始往下一直到叶节点所经过的节点形成一条路径. 示例: 给定如下二叉树,以及目标和 ...
- 【三种解法】剑指 Offer 06. 从尾到头打印链表【附完整可运行代码】
立志用最少的代码做最高效的表达 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回). 示例 1: 输入:head = [1,3,2] 输出:[2,3,1] 限制: 0 <= 链表 ...
- Matlab/Simulink自动生成STM32代码_基于模型的开发_环境搭建
目录 前言 官方简介 Matlab R2018b安装 STM32-MAT/TARGET 安装 STM32CubeMX 安装 STM32CubeIDE, Keil安装 ST-Link驱动安装 微信公众号 ...
- simulink自动生成STM32代码详解
1.开发软件 STM32-MAT/TARGET_V5.6.0 STM32CubeMX_V5.6.0 JAVA 64_bit MATLAB_2018b MDK-ARM_V5 下图是STM32-MAT/T ...
- (十二) 完整注释的代码摘录
title: 完整注释的代码摘录 date: 2019/4/23 20:40:00 toc: true --- 完整注释的代码摘录 作者网页 #include <linux/kernel.h&g ...
- BC26通过LWM2M协议连接ONENET,AT流程,STM32代码
onenet平台操作 登录onenet后,进入控制台 选择NB-IoT物联网套件 新建产品 产品名字.类别根据自己情况填,协议选择LWM2M 产品新建成功 点击产品名字,进入产品详情 给产品添加设备 ...
- DL之DNN:利用numpy自定义三层结构+softmax函数建立3层完整神经网络全部代码实现(探究BP神经网络的底层思想)
DL之DNN:利用numpy自定义三层结构+softmax函数建立3层完整神经网络全部代码实现(探究BP神经网络的底层思想) 目录 输出结果 代码实现 输出结果 代码实现 #DL之NN:利用numpy ...
- Android 拖动条(SeekBar)实例 附完整demo项目代码
Android 拖动条(SeekBar)实例 附完整demo项目代码 1.拖动条的事件 实现SeekBar.OnSeekBarChangeListener接口.需要监听三个事件: 数值改变(onPro ...
最新文章
- oracle的shell命令,Shell实现的Oracle启动脚本分享
- 深圳坪山,中国首个全区全域全车无人的RoboTaxi运营区
- python3文件下载-python3获取文件中url内容并下载代码实例
- Lync Server 2013 部署前端池支持NLB吗?
- Python---将一字符串转换为字典,并按词语出现的频率由高到低进行排列。
- golang中map并发读写问题及解决方法
- 一个html表单赋给另一个表单,是否可以将表单输入到另一个html表单
- C语言编写工资管理系统类似学生管理系统
- leetcode59. 螺旋矩阵 II
- mysql用户 11_MySQL-快速入门(11)用户管理
- b站电脑客户端_如何将B站的flv格式的视频转换成mp4格式
- 基于Topic消息路由的M2M设备间通信Node JS SDK 示例
- harmonyOS智慧屏,在鸿蒙HarmonyOS智慧屏上实现一款粗糙的计算器
- 集合拆成固定长度的小集合_《集合啦动物森友会》钓鱼怎么玩?钓鱼小技巧攻略分享...
- [转]NVIDIA/ATI显卡后缀命名大盘点
- WindowsPhone8 应用开发学习笔记(一)
- python簇状柱形图_使用Matplotlib绘制堆积条形图
- mt4的服务器在哪个文件,MT4服务器地址在哪个文件
- 谷歌手机正式发布 售价179美元(图)
- 详细介绍NLP对话系统
热门文章
- 计算机信息检索自考知识点,计算机信息检索02139自考资料.doc
- 对voc2007数据集进行person的单类数据抽取
- 史上超强图像处理开源工具包--ImageMagick
- 可能是最简单暴力的卸载工具Geek Uninstaller
- Postman(1):postman测试post请求参数为json类型
- ATmega128单片机](熔丝修改后无法烧录程序情况)
- 华三服务器管理口地址_H3C服务器配置HDM远程管理系统
- SPSS -正态检验
- SUSE Linux Enterprise Server 12 SP5 Install
- 基于java jsp企业人事管理系统mysql