一、问题

最近使用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代码相关推荐

  1. 如何高效的学习TensorFlow代码?

    如何高效的学习TensorFlow代码? 如题,或者如何掌握TensorFlow,应用到任何领域? 添加评论分享 10 个回答 爱琳李,老李,明天就辍学了 8 人赞同 本来都忘了这个问题了,不过看到很 ...

  2. html自动生成工具_关于STM32代码自动生成的工具的进度....

    前情提要:STM32代码自动生成工具_本想...但是...可是...所以 首先说一下那几天大家的反应,有的持观望态度,毕竟STM32CUBE很香:有的很激动,期待我快点出东西:还有的很淡定,知道我在挖 ...

  3. 剑指 Offer 34. 二叉树中和为某一值的路径【附完整可运行代码】

    立志用最少的代码做最高效的表达 输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径.从树的根节点开始往下一直到叶节点所经过的节点形成一条路径. 示例: 给定如下二叉树,以及目标和 ...

  4. 【三种解法】剑指 Offer 06. 从尾到头打印链表【附完整可运行代码】

    立志用最少的代码做最高效的表达 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回). 示例 1: 输入:head = [1,3,2] 输出:[2,3,1] 限制: 0 <= 链表 ...

  5. Matlab/Simulink自动生成STM32代码_基于模型的开发_环境搭建

    目录 前言 官方简介 Matlab R2018b安装 STM32-MAT/TARGET 安装 STM32CubeMX 安装 STM32CubeIDE, Keil安装 ST-Link驱动安装 微信公众号 ...

  6. simulink自动生成STM32代码详解

    1.开发软件 STM32-MAT/TARGET_V5.6.0 STM32CubeMX_V5.6.0 JAVA 64_bit MATLAB_2018b MDK-ARM_V5 下图是STM32-MAT/T ...

  7. (十二) 完整注释的代码摘录

    title: 完整注释的代码摘录 date: 2019/4/23 20:40:00 toc: true --- 完整注释的代码摘录 作者网页 #include <linux/kernel.h&g ...

  8. BC26通过LWM2M协议连接ONENET,AT流程,STM32代码

    onenet平台操作 登录onenet后,进入控制台 选择NB-IoT物联网套件 新建产品 产品名字.类别根据自己情况填,协议选择LWM2M 产品新建成功 点击产品名字,进入产品详情 给产品添加设备 ...

  9. DL之DNN:利用numpy自定义三层结构+softmax函数建立3层完整神经网络全部代码实现(探究BP神经网络的底层思想)

    DL之DNN:利用numpy自定义三层结构+softmax函数建立3层完整神经网络全部代码实现(探究BP神经网络的底层思想) 目录 输出结果 代码实现 输出结果 代码实现 #DL之NN:利用numpy ...

  10. Android 拖动条(SeekBar)实例 附完整demo项目代码

    Android 拖动条(SeekBar)实例 附完整demo项目代码 1.拖动条的事件 实现SeekBar.OnSeekBarChangeListener接口.需要监听三个事件: 数值改变(onPro ...

最新文章

  1. oracle的shell命令,Shell实现的Oracle启动脚本分享
  2. 深圳坪山,中国首个全区全域全车无人的RoboTaxi运营区
  3. python3文件下载-python3获取文件中url内容并下载代码实例
  4. Lync Server 2013 部署前端池支持NLB吗?
  5. Python---将一字符串转换为字典,并按词语出现的频率由高到低进行排列。
  6. golang中map并发读写问题及解决方法
  7. 一个html表单赋给另一个表单,是否可以将表单输入到另一个html表单
  8. C语言编写工资管理系统类似学生管理系统
  9. leetcode59. 螺旋矩阵 II
  10. mysql用户 11_MySQL-快速入门(11)用户管理
  11. b站电脑客户端_如何将B站的flv格式的视频转换成mp4格式
  12. 基于Topic消息路由的M2M设备间通信Node JS SDK 示例
  13. harmonyOS智慧屏,在鸿蒙HarmonyOS智慧屏上实现一款粗糙的计算器
  14. 集合拆成固定长度的小集合_《集合啦动物森友会》钓鱼怎么玩?钓鱼小技巧攻略分享...
  15. [转]NVIDIA/ATI显卡后缀命名大盘点
  16. WindowsPhone8 应用开发学习笔记(一)
  17. python簇状柱形图_使用Matplotlib绘制堆积条形图
  18. mt4的服务器在哪个文件,MT4服务器地址在哪个文件
  19. 谷歌手机正式发布 售价179美元(图)
  20. 详细介绍NLP对话系统

热门文章

  1. 计算机信息检索自考知识点,计算机信息检索02139自考资料.doc
  2. 对voc2007数据集进行person的单类数据抽取
  3. 史上超强图像处理开源工具包--ImageMagick
  4. 可能是最简单暴力的卸载工具Geek Uninstaller
  5. Postman(1):postman测试post请求参数为json类型
  6. ATmega128单片机](熔丝修改后无法烧录程序情况)
  7. 华三服务器管理口地址_H3C服务器配置HDM远程管理系统
  8. SPSS -正态检验
  9. SUSE Linux Enterprise Server 12 SP5 Install
  10. 基于java jsp企业人事管理系统mysql