找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3120|回复: 2
打印 上一主题 下一主题
收起左侧

STM32安卓APP控制+单片机315M/433M无线解码的十路遥控开关源码_学习型_成品

[复制链接]
跳转到指定楼层
楼主
手机控制由易安卓5.8编写的。
APP原理图与线路图由PADS9.5编辑。
一些调试工具由易语言编辑。

http://www.51hei.com/bbs/dpj-54638-1.html 单路
http://www.51hei.com/bbs/dpj-54161-1.html 四路
模拟315M/433M 2272解码程序
工作频率:72M
说明:10路继电器输出,10LED指示,1LED电源指示,1微动开关K1。
          按K1进入编辑模式,LED指示灯全亮。
          在编辑模式下 ,按下遥控器钮,LED1亮>>LED2亮>>....>>LED10亮>>全亮(此模式存储的遥控码是关闭所有的LED)>>退出编辑模式。
          在编辑模式下 ,按K1退出编辑模式或存储有效的遥控码。
          在编辑模式下 ,长按K1 (3S) 调整遥控模式。   
          在正常模式下,长按K1 (3S) 删除所有存储的遥控码。      
          在正常模式下 , 按下遥控器钮,及相应的LED.继电器亮灭。
注意: 同一条遥控码 在同一个LED上存两条,相当于亮了又灭,无动作。
优点: 能接收2262的1.2M-4.7M电阻编码,几乎所有的315M遥控器都兼容。
         由于定时读引脚,抗干扰能力强 ,和硬件解码距离无区别。

成品由洞洞板制作。
STM32选用STM32103C8T6最小系统开发板。
WiFI模块选用ESP8266 ESP-07,软件升级到V1.62版。
无线模块选用315M或433M超外差模块
3.3V选用DC12-DC3.3转换模块



所有资料51hei提供下载:
STM32-v1.62.7z (5.07 MB, 下载次数: 68)
8266升级资料.7z (1.39 MB, 下载次数: 51)

单片机源程序如下:

  1. /*******************************************************************************
  2. *        
  3. * 软件功能:         遥控解码10# 主频72M
  4. *
  5. *******************************************************************************/
  6. #include "stm32f10x.h"

  7. //-----变量&常量定义-----
  8. #define DaiMaTiaoSu_100  100    //遥控条数
  9. #define YaoKongSu_5  10         //遥控码长度
  10. #define Key_600  600            //长按键时间计数,3秒时间

  11. u16 T2RL = 124*2-1;  //定时器重装值;
  12. u8 ircode[9];               //[0-5]2次脉冲解码值                [6-8]解码最终值
  13. u8 Tm1[50];          //0空位 1-24遥控码脉冲 25同步码 26-49第二次遥控码脉冲
  14. u8 Tm_bz[]={ 31 ,156 ,114 ,134 ,2 ,16 ,8 };
  15. //基准:0-1同步码时间范围,  2-3 同步码124a范围,  4-5 宽窄脉冲码4-12a范围,  6        宽窄脉冲

  16. 码中间值
  17. //遥控码发射时钟=1a,   1M电阻:1a=31us 5M电阻:1a=156us            
  18. //由于stc89c52单片机中断时间内执行指令数少,只能到 1a=60us.用stc15fXX是1T模式(同时钟频率

  19. 下是89c52单片机6-12倍)————全兼容        

  20. u16 E2BiaoJi;              //Flash空位位置值
  21. u8 ms =1;                         //防止误触延时&计数
  22. u8 BJ_500ms = 0;     //解码值有效时间0.5S标记
  23. u8 BJ_PulsrGood = 0; //脉冲读完标记
  24. u8 BJ_Traversal=0;         //Flash遍历标记
  25. u8 BJ_edit = 0;             //进入编辑标记
  26. u8 BJ_KeyLong=0;           //长按键标记
  27. u8 BJ_KeyShort=0;           //短按键标记   
  28. u16 Key_JiShu=0;           //长按键3秒计数
  29. u16 JIBU=0;          //按键第几步标记
  30. u16 LED_ZT=0;        //LED状态缓存标记

  31. u32 Net_No=0;        //定时联网检测处理
  32. u8 WiFi_200=0;             //200MS标记
  33. u8 WiFi_OK=0;               //模块返回数据与比对值匹配标记
  34. u8 WiFi_Hao;                     //返回消息的通道号
  35. u8 Index;                         //比对值索引;
  36. u8 WiFi_Step=0;      //模块启动执行到的步数                           

  37. /*以下为WiFi模块接收处理函数*/
  38. void WiFi_initial(void);                       //模块初始化流程
  39. void WiFi_initial0(u8 dat,u8 Ten, u8 sx);//AT初始化流程_子程序
  40. void WiFi_initial1(u8 dat,u8 Ten, u8 sx);//AT初始化流程_子程序
  41. void Command(u8 *ptr, u8 len);           //命令的汇总处理,收到的数据格式
  42. void AT_CIPSEND(u8 *ptr,u8 len);                     //AT命令组装并发送
  43. u8 LED_state(u8 *ptr,u8 len);            //LED状态提取准备返回
  44. void Check(u8 *ptr, u8 len, u8 Ten);     //位异或校验
  45.                                                                                                 

  46.                                        
  47. /*以下为模拟2262解码调用函数 */
  48. void Configuration_2262(void);//初始化
  49. void BM_KeyLong(void);              //长按键处理_删除遥控码及处理遥控条码输出状态
  50. void BM_KeyShort(void);                    //短按键处理_进入退出编辑模式,存储遥控条码等功能
  51. void LED_add(void);                              //编辑模式下LED顺序累加
  52. void Decoding(u8 add);              //脉冲解码 ,接收到脉冲编译成遥控条码
  53. void BM_PulsrDecoding(void);       //脉冲解码>>接收到的两次编码比较>>接收的编码和防止误

  54. 触延时编码比较
  55. void LED_KeyLong_State(void);      //LED长按键后的状态
  56. void BM_Flash_Traversal(void);     //Flash中查找对应值
  57. void LED_Mode(u16 add,u16 add1);         //LED动作程序,LED模式变换


  58. /*************************************************
  59. 函数: int main(void)
  60. 功能: main主函数
  61. 参数: 无
  62. 返回: 无
  63. **************************************************/
  64. int main(void)
  65. {
  66.         RCC_Configuration();           //复位和时钟控制配置72M
  67.         GPIO_Configuration();          //初始化GPIO配置
  68.         delay_init(SYSCLK_MHZ);        //SysTick定时器做为延时函数的初始化程序

  69. (SYSCLK_MHZ=72)
  70.         ConfigTimer_TIM2(124);               //定时器2配置 1ns
  71.         ConfigTimer_TIM3(5);                 //定时器3配置 1ms
  72.         USART1_Configuration(115200);  //初始化USART1配置
  73.         IWDG_Init_1S();                //初始化独立看门狗时间:1S
  74.         Configuration_2262();          //2622模拟解码初始化               

  75.         //printf("向串口输出字符串\r\n");
  76.         while (1)
  77.         {                                         //AT流程用
  78.                 UartDriver();                    //调用串口驱动 监测数据帧的接收 有命令

  79. 到达时
  80.                 if(WiFi_200)                     //200ms进入流程标记
  81.                 {   
  82.                         WiFi_200=0;                    //200ms标记
  83.                         WiFi_initial();                                         //模块初始化&工

  84. 作流程
  85.                         LED_KeyLong_State();                                   //LED在长按按

  86. 键下的状态
  87.                 }                  
  88.                                                  //2262模拟解码流程用
  89.                 if(BJ_PulsrGood)                 //脉冲读完标记
  90.                 { BJ_PulsrGood=0; BM_PulsrDecoding(); }         //2622模拟解码用
  91.                 if(BJ_Traversal)                               //Flash遍历标记
  92.                 { BJ_Traversal=0; BM_Flash_Traversal(); }//Flash中查找对应值                  

  93.       
  94.                 if(BJ_KeyLong)                                 //长按键标记
  95.                 { BJ_KeyLong=0; BM_KeyLong(); }                  
  96.                 if(BJ_KeyShort)                                 //短按键标记
  97.                 { BJ_KeyShort=0; BM_KeyShort(); }

  98.         }   
  99. }



  100. /*===============================================================================  
  101.   以下为AT控制流程
  102.   ===============================================================================*/
  103. /*************************************************
  104. 函数: void WiFi_initial()        
  105. 功能: AT初始化流程  200ms进入一次中断标记进入
  106. 参数: 无
  107. 返回: 无
  108. **************************************************/
  109. void WiFi_initial(void)         
  110. {                              
  111.         switch (WiFi_Step)           //第几步索引值
  112.         {         //--------------------正常模式-入口---------------------------------
  113.                  case 0:                                 
  114.                         WiFi_initial0(0,1,0);//AT就绪查询
  115.                         break;
  116.                  case 1:                                 
  117.                         WiFi_initial0(1,2,0);//关闭回显
  118.                         break;
  119.                  case 2:
  120.                         WiFi_initial0(7,3,0);//启用多线程
  121.                         break;
  122.                  case 3:
  123.                         WiFi_initial0(8,4,0);//启用服务器功能
  124.                         break;
  125.                  case 4:
  126.                         Index=0; WiFi_Step=5;//比对值索引
  127.                         break;        
  128.                  case 5:        
  129.                         if(Net_No++>1500)
  130.       {Net_No=0; WiFi_Step=6; }//5分钟联网检测
  131.                         break;
  132.                  case 6:        
  133.                         WiFi_initial0(11,7,4); //查询网络连接信息
  134.                         break;        
  135.                  case 7:        
  136.                         WiFi_initial1(3,13,4); //扫描当前可用的 AP
  137.                         break;                        
  138.                  //------------------------退出设置模式-入

  139. 口-----------------------------
  140.                  case 10:                                 
  141.                         WiFi_initial1(0,11,0); //配置 ESP8266 SoftAP 当前参数,保存到

  142. Flash
  143.                         break;
  144.                  case 11:
  145.                         WiFi_initial1(1,12,0); //设置 ESP8266 Station 的 IP 地址,保存到

  146. Flash
  147.                         break;
  148.                  case 12:
  149.                         WiFi_initial1(2,13,0); //连接 AP,保存到 Flash
  150.                         break;                                 
  151.                  case 13:        
  152.                         WiFi_initial0(9,0,0);  //重启模块
  153.                         break;
  154.                   //----------------连接临时AP后查询反馈-入

  155. 口---------------------------------
  156.                  case 15:                                   
  157.                         WiFi_initial0(0,16,15);//AT就绪查询
  158.                         break;                 
  159.                  case 16:
  160.                         if(BJ_edit)
  161.                         WiFi_initial0(10,28,28);//查询指令连接AP情况
  162.                         else
  163.                         WiFi_initial0(10,0,0);//查询指令连接AP情况
  164.                         break;
  165.                  //------------------设置模式-入口-----------------------------------
  166.                  case 20:                        
  167.                         WiFi_initial0(0,21,20);//AT就绪查询
  168.                         break;
  169.                  case 21:
  170.                         WiFi_initial0(2,22,20);//设置为AT工作模式        
  171.                         break;
  172.                  case 22:
  173.                         WiFi_initial0(3,23,20);//设置SoftAP配置        
  174.                         break;
  175.                  case 23:
  176.                         WiFi_initial0(4,24,20);//设置上电时动连接 AP
  177.                         break;
  178.                  case 24:         
  179.                         WiFi_initial0(5,25,20);//退出与AP的连接
  180.                         break;
  181.                  case 25:
  182.                         WiFi_initial0(6,26,20);//设置DHCP,不保存到Flash,确保自动获取IP
  183.                         break;        
  184.                  case 26:
  185.                         WiFi_initial0(7,27,20);//启用多线程
  186.                         break;
  187.                  case 27:
  188.                         WiFi_initial0(8,28,20);//启用服务器功能
  189.                         break;
  190.                  case 28:
  191.                         Index=0;  WiFi_Step=29;//比对值索引
  192.                         break;                        
  193.                 default:
  194.                         break;
  195.         }            
  196. }
  197. /*************************************************
  198. 函数: void WiFi_initial0(u8 dat,u8 Ten, u8 sx)
  199. 功能: AT初始化流程_ 发往WiFi模块命令用
  200. 参数: dat-命令索引值 Ten—成功跳转值索引 sx=失败跳转值
  201. 返回: 无
  202. **************************************************/
  203. void WiFi_initial0(u8 dat,u8 Ten, u8 sx)
  204. {
  205.         static u8 WiFi_0[] = "AT\r\n";                                  //AT就绪查询
  206.         static u8 WiFi_1[] = "ATE0\r\n";                    //关闭回显
  207.         static u8 WiFi_2[] = "AT+CWMODE_DEF=3\r\n";                //设置为AT模式,保存到

  208. Flash
  209.         static u8 WiFi_3[] = "AT+CWSAP_CUR=\"AT-01\",\"12345678\",8,4\r\n";          //配置

  210. ESP8266 SoftAP 当前参数,不保存到Flash
  211.         static u8 WiFi_4[] = "AT+CWAUTOCONN=1\r\n";                //设置上电时自动连接 AP        

  212. ,保存到Flash
  213.         static u8 WiFi_5[] = "AT+CWQAP\r\n";                      //退出与AP的连接
  214.         static u8 WiFi_6[] = "AT+CWDHCP_CUR=1,1\r\n";                          //设置 DHCP,不

  215. 保存到Flash ,确保自动获取IP
  216.         static u8 WiFi_7[] = "AT+CIPMUX=1\r\n";                    //启用多线程
  217.         static u8 WiFi_8[] = "AT+CIPSERVER=1,19730\r\n";          //启用服务器功能
  218.         static u8 WiFi_9[] = "AT+RST\r\n";                        //重启模块
  219.         static u8 WiFi_10[] = "AT+CIFSR\r\n";                      //查询本地 IP 地
  220.         static u8 WiFi_11[] = "AT+CIPSTATUS\r\n";            //查询网络连接信息

  221.         static u8 WiFi_fasong=1;   //命令发送标记
  222.         static u8 JiShi=0;                     //命令发送时间计数
  223.         static u8 WiFi_Len[] = { sizeof(WiFi_0)-1, sizeof(WiFi_1)-1, sizeof(WiFi_2)-1,

  224. sizeof(WiFi_3)-1, sizeof(WiFi_4)-1, sizeof(WiFi_5)-1,
  225.                                                                                 sizeof

  226. (WiFi_6)-1, sizeof(WiFi_7)-1, sizeof(WiFi_8)-1, sizeof(WiFi_9)-1, sizeof(WiFi_10)-1,

  227. sizeof(WiFi_11)-1};
  228.         static u8 * WiFi_Ptr[] = {&WiFi_0[0],  &WiFi_1[0],  &WiFi_2[0],  &WiFi_3[0],  

  229. &WiFi_4[0],  &WiFi_5[0], &WiFi_6[0],  &WiFi_7[0],  
  230.                                                                                 &WiFi_8

  231. [0],  &WiFi_9[0],  &WiFi_10[0],  &WiFi_11[0]};
  232.         static u8 WiFi_syz[] = { 1,1,1,1, 1,1,1,1, 1,1,2,3 };  //WiFi模块收到数据比对值

  233. 索引
  234.         
  235.         Shi_LED2=0;
  236.         Index=WiFi_syz[dat];//比对值索引
  237.         if(WiFi_fasong)            //发送数据
  238.         {  WiFi_fasong=0;  UartWrite(WiFi_Ptr[dat], WiFi_Len[dat]); }
  239.         if(WiFi_OK)                       //比对成功返回标记
  240.         {  WiFi_OK=0;  WiFi_fasong=1; JiShi=0;  WiFi_Step=Ten; Shi_LED2=1;return;}
  241.         if(JiShi++>10)                  //超时认定失败
  242.         {  WiFi_fasong=1; JiShi=0; WiFi_Step=sx;}
  243.         Shi_LED2=1;
  244. }

  245. /*************************************************
  246. 函数: void WiFi_initial1(u8 dat,u8 Ten, u8 sx)
  247. 功能: AT初始化流程_ 发往WiFi模块命令用
  248. 参数: dat-命令索引值 Ten—成功跳转值索引 sx=失败跳转值
  249. 返回: 无
  250. **************************************************/
  251. void WiFi_initial1(u8 dat,u8 Ten, u8 sx)
  252. {
  253.         static u8 Zfc_0[]="AT+CWSAP_DEF=\"AT_01\",\""; //配置 ESP8266 SoftAP 当前参数,

  254. 保存到 Flash
  255.         static u8 Zfc_1[]="12345678";
  256.         static u8 Zfc_2[]="\",8,4\r\n";
  257.         static u8 Zfc_3[]="AT+CWJAP_DEF=\"";           //连接 AP,保存到 Flash
  258.         static u8 Zfc_4[]="XX0XX";
  259.         static u8 Zfc_5[]="\",\"";
  260.         static u8 Zfc_6[]="\"\r\n";
  261.         static u8 Zfc_7[]="AT+CIPSTA_DEF=\"";          //设置 ESP8266 Station 的 IP 地址

  262. ,保存到 Flash
  263.         static u8 Zfc_8[]="AT+CWLAP=\"";               //扫描当前可用的 AP
  264.         static u8 WiFi_fasong=1;     //命令发送标记        
  265.         static u8 JiShi=0;                       //命令发送时间计数
  266.         static u8 WiFi_syx[] = { 1,1,1,4 }; //WiFi模块收到数据比对值索引
  267.         
  268.         u8 WiFi1[60];
  269.         u8 WiFi1_len=0;
  270.         u8 WiFi1_TAN=0;
  271.   
  272.         Shi_LED2=0;
  273.         Index=WiFi_syx[dat] ;        //比对值索引
  274.         if(WiFi_fasong)              //发送数据
  275.         {   WiFi_fasong=0;
  276.                
  277.                   switch(dat)
  278.                         {                        
  279.                                 case 0: WiFi1_len=Add_Merge0(WiFi1,WiFi1_len,Zfc_0);     

  280.         //配置 ESP8266 SoftAP 当前参数,保存到 Flash
  281.                                                                 WiFi1_TAN= WiFi1_len;
  282.                                                                 WiFi1_len=FLASH_read_8

  283. (FLASH_Address[2],WiFi1,WiFi1_len);//FLASH读出密码
  284.                                                                 if(WiFi1_TAN==WiFi1_len)
  285.                                                                 WiFi1_len=Add_Merge0

  286. (WiFi1,WiFi1_len,Zfc_1);
  287.                                                                 WiFi1_len=Add_Merge0

  288. (WiFi1,WiFi1_len,Zfc_2);
  289.                                 break;
  290.                                 case 1: WiFi1_len=Add_Merge0(WiFi1,WiFi1_len,Zfc_7);     

  291.         //设置 ESP8266 Station 的 IP 地址,保存到 Flash
  292.                                                                 WiFi1_TAN= WiFi1_len;
  293.                                                                 WiFi1_len=FLASH_read_8

  294. (FLASH_Address[3],WiFi1,WiFi1_len);//FLASH读出IP
  295.                                                                 if(WiFi1_TAN==WiFi1_len)
  296.                                                                 WiFi1_len=Add_character

  297. (WiFi1,WiFi1_len,'0');
  298.                                                                 WiFi1_len=Add_Merge0

  299. (WiFi1,WiFi1_len,Zfc_6);
  300.                                 break;
  301.                                 case 2: WiFi1_len=Add_Merge0(WiFi1,WiFi1_len,Zfc_3);     

  302.         //连接 AP,保存到 Flash
  303.                                                                 WiFi1_TAN= WiFi1_len;
  304.                                                                 WiFi1_len=FLASH_read_8

  305. (FLASH_Address[1],WiFi1,WiFi1_len);//FLASH读出账号
  306.                                                                 if(WiFi1_TAN==WiFi1_len)
  307.                                                                 WiFi1_len=Add_Merge0

  308. (WiFi1,WiFi1_len,Zfc_4);
  309.                                                                 WiFi1_len=Add_Merge0

  310. (WiFi1,WiFi1_len,Zfc_5);
  311.                                                                 WiFi1_TAN= WiFi1_len;
  312.                                                                 WiFi1_len=FLASH_read_8

  313. (FLASH_Address[2],WiFi1,WiFi1_len);//FLASH读出密码
  314.                                                                 if(WiFi1_TAN==WiFi1_len)
  315.                                                                 WiFi1_len=Add_Merge0

  316. (WiFi1,WiFi1_len,Zfc_1);
  317.                                                                 WiFi1_len=Add_Merge0

  318. (WiFi1,WiFi1_len,Zfc_6);
  319.                                 break;
  320.                                 case 3: WiFi1_len=Add_Merge0(WiFi1,WiFi1_len,Zfc_8);     

  321.         //扫描当前可用的 AP
  322.                                                                 WiFi1_TAN= WiFi1_len;
  323.                                                                 WiFi1_len=FLASH_read_8

  324. (FLASH_Address[1],WiFi1,WiFi1_len);//FLASH读出账号
  325.                                                                 if(WiFi1_TAN==WiFi1_len)
  326.                                                                 WiFi1_len=Add_Merge0

  327. (WiFi1,WiFi1_len,Zfc_4);
  328.                                                                 WiFi1_len=Add_Merge0

  329. (WiFi1,WiFi1_len,Zfc_6);
  330.                                 break;
  331.                                 default:break;
  332.                         }
  333.                         UartWrite(WiFi1, WiFi1_len);
  334.         }
  335.         if(WiFi_OK)                      //比对成功返回标记
  336.         {  WiFi_OK=0;  WiFi_fasong=1; JiShi=0; WiFi_Step=Ten; Shi_LED2=1;return;}         
  337.         if(JiShi++>10)                 //超时认定失败
  338.         { WiFi_fasong=1; JiShi=0; WiFi_Step=sx;}
  339.         Shi_LED2=1;
  340. }

  341. /*************************************************
  342. 函数: void UartAction(u8 *ptr, u8 len)
  343. 功能: 串口动作函数,根据接收到的数据响应的动作
  344. 参数:  buf-接收到的数据帧指针,len-数据帧长度
  345. 返回: 无
  346. **************************************************/
  347. void UartAction(u8 *ptr, u8 len)
  348. {
  349.         static u8 cmd0[] = "+IPD,";      //收到数据标识
  350.         static u8 cmd1[] = "OK";
  351.         static u8 cmd2[] = "STAIP,\"";   //IP查询返回标识
  352.         static u8 cmd3[] = "STATUS:5";   //查询网络连接信息返回标识
  353.         static u8 cmd4[] = "+CWLAP:";    //扫描当前可用的AP返回标识
  354.         static u8 LinS[] = "@@J000.000.000.000";
  355.         u8 cmdLen[] = {  sizeof(cmd0)-1, sizeof(cmd1)-1, sizeof(cmd2)-1, sizeof(cmd3)-1,

  356. sizeof(cmd4)-1};
  357.         u8 *cmdPtr[] = {&cmd0[0],  &cmd1[0],  &cmd2[0],  &cmd3[0],  &cmd4[0]};
  358.         u8 LinS_Tem = 3;
  359.         u8 FanHui,i;
  360.         
  361.         if (len >= cmdLen[Index])  //首先接收到的数据长度要不小于对比值长度
  362.         {   
  363.                 FanHui=Compare(ptr,len,cmdPtr[Index],cmdLen[Index]);
  364.                 if (FanHui>0)            //查找到匹配值
  365.                 {
  366.                         switch(Index)
  367.                         {                        
  368.                                 case 0: Command(ptr, FanHui);  //数据进一步处理
  369.                                 break;
  370.                                 case 1: WiFi_OK=1;
  371.                                 break;
  372.                                 case 2: WiFi_OK=1;                                  //IP

  373. 查询进一步处理
  374.                                         for (i=0; i<16; i++)                        //返

  375. 回临时IP值
  376.                                                                 { LinS[LinS_Tem++] =

  377. ptr[FanHui++]; }         
  378.                                                                 AT_CIPSEND

  379. (LinS,LinS_Tem);
  380.                                 break;
  381.                                 case 3: WiFi_OK=1;
  382.                                 break;
  383.                                 case 4: WiFi_OK=1;
  384.                                 break;
  385.                                 default:break;
  386.                         }
  387.                 }        
  388.         }        
  389. }


  390. /*************************************************
  391. 函数: void Command(u8 *ptr, u8 len)
  392. 功能: 收到数据处理  数据格式; +IPD,0,15:@@AAT_00
  393. 参数:  ptr-待处理数据  len-处理的起始位
  394. 返回: 无
  395. **************************************************/
  396. void Command(u8 *ptr, u8 len)
  397. {         
  398.         static u8 Zfc_0[]="AT+CWJAP_CUR=";
  399.         static u8 Zfc_1[]="\r\n";
  400.         static u8 Zfc_2[]="-err";
  401.         
  402.         u8 HuiDa[60];                       //回答字符串
  403.         u8 HuiDa_len = 0;      //回答字符串位置
  404.         u8 GeSu;                                       //到达数据长度
  405.         u8 Ten;                //特定标记位置
  406.         u16 i;
  407.         u32 Det;
  408.         
  409.         //计算校验值位置与数据长度-------------------
  410.         if ( ptr[len+3]==':' && ptr[len+4]=='@' )
  411.         {
  412.                 Ten=len+5;           //定位命令字位置
  413.                 GeSu =ptr[len+2]-48; //计算收到数据长度
  414.         }
  415.         else if (ptr[len+4]==':' && ptr[len+5]=='@' )
  416.         {  
  417.                 Ten=len+6;                  //定位命令字位置
  418.                 GeSu =(ptr[len+2]-48)*10;
  419.                 GeSu =GeSu+(ptr[len+3]-48); //计算收到数据长度
  420.         }
  421.         else
  422.         return;
  423.         if(GeSu<3)                //收到数据长度不够
  424.         return;        

  425.         //校验数据正确性-----------------------------
  426.         ptr[0] = ptr[Ten];              // ptr[0]作为临时变量使用,存放收到的校验值
  427.         Check(ptr, Ten, GeSu);    // 计算校验值
  428.         if(ptr[0] != ptr[Ten])          // 收到的校验值与计算的校验值比对
  429.         return;
  430.         //5分钟联网检测-----------------------------
  431.         Net_No=0;  
  432.         //发送数据命令头部组装-----------------------
  433.         Ten++;                                                  //移到命令位
  434.         GeSu=GeSu-3;                                //去除3位标识位
  435.         WiFi_Hao=ptr[len];              //保存收到数据的通道号,发送数据用这个通道
  436.         HuiDa_len = Add_character(HuiDa,HuiDa_len,'@');      //待发送数据组装
  437.         HuiDa_len++;                                         //校验值位
  438.         HuiDa_len = Add_character(HuiDa,HuiDa_len,ptr[Ten]); //待发送数据组装
  439.         if(ptr[Ten]=='A')                                        //LED状态消息处理
  440.         {  
  441.                 if(ptr[++Ten]=='0') ptr[0]=0; else ptr[0]=1;       //ptr[0]作为临时变量

  442. ……………………

  443. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:89704 发表于 2021-4-15 19:31 | 只看该作者
谢谢楼主,下载学习了!
回复

使用道具 举报

板凳
ID:89704 发表于 2021-4-15 22:31 | 只看该作者
上张实物图看看!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表