【转载】单片机AT指令配置模块程序模板(非阻塞版)

[复制链接]
 楼主| HuangHongLun 发表于 2019-10-31 19:07 | 显示全部楼层 |阅读模式
拷贝这两个文件到自己的工程
819239-20191014223143795-51446073.jpg



819239-20191014223206591-607437730.jpg



819239-20191014223618866-1979272515.jpg




819239-20191014223723150-675334800.jpg

819239-20191014223841940-434224344.jpg

 楼主| HuangHongLun 发表于 2019-10-31 19:08 | 显示全部楼层
测试1://单片机发送AT+RST\r\n  如果单片机串口接收到OK 或者ready 执行下一条
819239-20191014224139038-2117928793.jpg


测试视频:
https://qqqqqbucket.oss-cn-beijing.aliyuncs.com/%E5%8D%95%E7%89%87%E6%9C%BA%E6%A8%A1%E5%9D%97%E5%8C%96%E7%A8%8B%E5%BA%8F/%E5%8D%95%E7%89%87%E6%9C%BAAT%E6%8C%87%E4%BB%A4%E9%85%8D%E7%BD%AE%E6%A8%A1%E5%9D%97%E7%A8%8B%E5%BA%8F%E6%A8%A1%E6%9D%BF(%E9%9D%9E%E9%98%BB%E5%A1%9E%E7%89%88)/20191014_224710.mp4


 楼主| HuangHongLun 发表于 2019-10-31 19:08 | 显示全部楼层
测试2: 平时发送数据的时候有时候需要先执行一些函数打包数据,然后再发送
为了直观,我做的单片机控制WIFI连接路由器的程序
819239-20191014225851483-2077945125.jpg



819239-20191014225921716-1957283676.jpg



测试:为了直观一点,我分别监听了STM32发送的  和 WIFI发送的数据
https://qqqqqbucket.oss-cn-beijing.aliyuncs.com/%E5%8D%95%E7%89%87%E6%9C%BA%E6%A8%A1%E5%9D%97%E5%8C%96%E7%A8%8B%E5%BA%8F/%E5%8D%95%E7%89%87%E6%9C%BAAT%E6%8C%87%E4%BB%A4%E9%85%8D%E7%BD%AE%E6%A8%A1%E5%9D%97%E7%A8%8B%E5%BA%8F%E6%A8%A1%E6%9D%BF(%E9%9D%9E%E9%98%BB%E5%A1%9E%E7%89%88)/20191014_230134.mp4

 楼主| HuangHongLun 发表于 2019-10-31 19:09 | 显示全部楼层
本帖最后由 HuangHongLun 于 2019-10-31 19:11 编辑

测试3: 有时候需要获取一下模块返回的数据,咱获取WIFI的MAC地址
既然获取MAC,就需要对字符串处理,给大家我写的常用的函数
819239-20191015001650925-106101597.jpg

  1. /**
  2.   ******************************************************************************
  3.   * [url=home.php?mod=space&uid=288409]@file[/url]    String.c
  4.   * [url=home.php?mod=space&uid=187600]@author[/url]  yang feng wu
  5.   * [url=home.php?mod=space&uid=895143]@version[/url] V1.0.0
  6.   * [url=home.php?mod=space&uid=212281]@date[/url]    2019/10/13
  7.   * [url=home.php?mod=space&uid=247401]@brief[/url]   字符串处理函数
  8.   ******************************************************************************

  9.   ******************************************************************************
  10.   */
  11. #define CSTRING_C_
  12. #include "include.h"

  13. char *StringStr = NULL;
  14. void cStringFree(void){
  15.     free(StringStr);
  16. }

  17. /**
  18. * @brief  获取两个字符串之间的字符串
  19. * @param  Str  源字符串
  20. * @param  StrBegin  开始的字符串
  21. * @param  StrEnd    结束的字符串
  22. * @retval 字符串首地址
  23. * [url=home.php?mod=space&uid=389923]@example[/url]  printf("%s",StrBetwString("wqe5w4ew46e5w","5w","6e"));cStringFree(Str);  输出:4ew4   
  24. **/
  25. char *StrBetwString(char *Str,char *StrBegin,char *StrEnd)
  26. {
  27.     char *StrStart=0,*StrStop=0,len=0;
  28.     len = strlen(StrBegin);//字符串长度
  29.    
  30.   StrStart=strstr(Str, StrBegin);//第一个字符串开始的地址
  31.     if(StrStart)
  32.     {
  33.       StrStop = strstr(StrStart+len+1, StrEnd);//第二个字符串开始的地址
  34.         if(StrStop)
  35.         {
  36.             StringStr = (char *)malloc(((StrStop - (StrStart+len))+1) *sizeof(char));//多分配一个空间,防止其它数据干扰
  37.             
  38.             memset(StringStr,NULL,(StrStop - (StrStart+len))+1);
  39.             memcpy(StringStr, StrStart+len, (StrStop - (StrStart+len)));
  40.         
  41.             return StringStr;
  42.         }
  43.         else
  44.         {
  45.             return NULL;
  46.         }
  47.     }
  48.     else
  49.     {
  50.       return NULL;
  51.     }
  52. }



  53. /**
  54. * @brief  分割字符串
  55. * @param  src        源字符串
  56. * @param  separator  分割
  57. * @param  dest       接收子串的数组
  58. * @param  num        子字符串的个数
  59. * @retval None
  60. * @example split("42,uioj,dk4,56",",",temp,&cnt);  temp[0]=42,...temp[3]=56  cnt=4
  61. **/
  62. void split(char *src,const char *separator,char **dest,int *num)
  63. {
  64.     char *pNext;
  65.     int count = 0;
  66.     if (src == NULL || strlen(src) == 0)
  67.         return;
  68.     if (separator == NULL || strlen(separator) == 0)
  69.         return;
  70.     pNext = (char *)strtok(src,separator);
  71.     while(pNext != NULL)
  72.     {
  73.         if(dest != NULL)
  74.         *dest++ = pNext;
  75.         ++count;
  76.         pNext = (char *)strtok(NULL,separator);
  77.     }  
  78.     *num = count;
  79. }


819239-20191015001817590-516970664.jpg




819239-20191015001857307-1735810727.jpg





测试:
https://qqqqqbucket.oss-cn-beijing.aliyuncs.com/%E5%8D%95%E7%89%87%E6%9C%BA%E6%A8%A1%E5%9D%97%E5%8C%96%E7%A8%8B%E5%BA%8F/%E5%8D%95%E7%89%87%E6%9C%BAAT%E6%8C%87%E4%BB%A4%E9%85%8D%E7%BD%AE%E6%A8%A1%E5%9D%97%E7%A8%8B%E5%BA%8F%E6%A8%A1%E6%9D%BF(%E9%9D%9E%E9%98%BB%E5%A1%9E%E7%89%88)/20191015_002018.mp4


然后说一下,
819239-20191015002837360-378224251.jpg


  1. /**
  2. * @brief  »ñÈ¡É豸MAC
  3. * @param  data
  4. * @param  
  5. * @retval
  6. * @example
  7. **/
  8. void FunctionParseGetMac(char *data)
  9. {
  10.     char *Str;
  11.     int Len;
  12.     memset(MAC,0,strlen(MAC));
  13.    
  14.     //»ñÈ¡MAC_CUR:"  ºÍ " Ö®¼äµÄ×Ö·û´®
  15.     Str = StrBetwString(data,"MAC_CUR:"",""");//+CIPSTAMAC_CUR:"dc:4f:22:10:b8:fc"
  16.     cStringFree();//ÊÍ·ÅcStringº¯ÊýËùÓÃÄÚ´æ
  17.     if((Str!=NULL) && strlen(Str) == 17)//»ñÈ¡ÁËÊý¾Ý
  18.     {
  19.         sprintf(MAC,"%s",Str);//¿½±´Êý¾Ý
  20.         split(Str,":",NULL,&Len);//·Ö¸îdc:4f:22:10:b8:fc
  21.         if(Len == 6)//·Ö¸î³öµÄ×Ö´®Îª6
  22.         {
  23.             //ÊÇÕýÈ·µÄÊý¾Ý¿ÉÒÔ·¢ËÍÏÂÒ»ÌõÊý¾Ý(ÒÔϳÌÐò¹Ì¶¨)
  24.             DataReturnFlage=1;
  25.             ConfigModuleNoBlockCnt = (SendNextDelay == 0 ? ConfigModuleNoBlockCnt:SendNextDelay);
  26.         }
  27.     }
  28. }


这两句代码不要动!


如果判断数据处理成功,就写上这两句就可以.

最后一个参数
819239-20191015003004834-1727493905.jpg



819239-20191015003318927-1399658945.jpg




这个参数是控制如果当前指令返回正确,控制发送下一条数据的时间  写 CompareValue  就是下一条立即发送
如果不希望下一条立即发送,可以写 0 - CompareValue  的值,延时时间为 (CompareValue  - 你输入的值 ) Ms



现在说一下如何控制重新配置
假设 串口接收到 CLOSED  咱需要重新配置
819239-20191015005613471-1040353783.jpg



为了实现那个效果,我连接我的TCP服务器,然后大约20秒,服务器会自动断开连接,然后WIFI就会打印 CLOSED
819239-20191015005906489-1953243959.jpg




测试:
https://qqqqqbucket.oss-cn-beijing.aliyuncs.com/%E5%8D%95%E7%89%87%E6%9C%BA%E6%A8%A1%E5%9D%97%E5%8C%96%E7%A8%8B%E5%BA%8F/%E5%8D%95%E7%89%87%E6%9C%BAAT%E6%8C%87%E4%BB%A4%E9%85%8D%E7%BD%AE%E6%A8%A1%E5%9D%97%E7%A8%8B%E5%BA%8F%E6%A8%A1%E6%9D%BF(%E9%9D%9E%E9%98%BB%E5%A1%9E%E7%89%88)/20191015_005932.mp4

然后说一下
819239-20191015010504871-767522202.jpg



如果你希望程序一开始进来的时候不希望程序执行
819239-20191015011040595-1658867925.jpg

drer 发表于 2019-11-13 10:44 | 显示全部楼层
非常感谢分享
gwsan 发表于 2019-11-13 10:57 | 显示全部楼层
非常不错的资料
kxsi 发表于 2019-11-13 11:33 | 显示全部楼层
非常不错的资料
paotangsan 发表于 2019-11-19 12:51 | 显示全部楼层
非常感谢楼主分享
wym112500 发表于 2019-12-9 11:35 | 显示全部楼层
非常感谢
zykzyk 发表于 2019-12-14 17:04 | 显示全部楼层
打包代码发出分享学习一下吧!
zeshoufx 发表于 2019-12-16 08:45 | 显示全部楼层
HuangHongLun 发表于 2019-10-31 19:09
测试3: 有时候需要获取一下模块返回的数据,咱获取WIFI的MAC地址既然获取MAC,就需要对字符串处理,给大家我写 ...

谢谢分享,,,
您需要登录后才可以回帖 登录 | 注册

本版积分规则

50

主题

440

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部

50

主题

440

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部