前言:看懂這一節,前提!!!!
這節代碼區區幾十行而已!很多時候只看到別人揮一次劍定全局,卻不知為了那一次揮劍准備了幾十年.
一,有多少人在為給模塊發送配置指令,然后判斷返回發愁哈?
現在來看一下為大家准備的阻塞版的模板!
所謂阻塞版就是執行命令的時候程序就停在了那里
/** ****************************************************************************** * @file usart.c * @author fengwu yang * @version V1.0.0 * @date 2019/10/12 * @brief ****************************************************************************** 一,使用說明 1,把以下程序放在1ms定時器中斷中 ConfigModuleBlockDelay++; 2,使用 //使用printf發送AT\r\n,希望串口返回的數據是 OK, ConfigModuleBlock("AT\r\n","OK",NULL) //判斷返回了OK,或者該指令發送了3次,執行下一條 //使用printf發送AT+RST\r\n,希望串口返回的數據是 OK, ConfigModuleBlock("AT+RST\r\n","ready","OK") //判斷返回了OK,或者返回了"ready",或者該指令發送了3次,執行下一條 //接收返回的配置狀態 flage = ConfigModuleBlock("AT\r\n","OK",NULL);//flage:1 配置OK ****************************************************************************** */ #define CONFIGMODULEBLOCK_C_ #include "include.h" int ConfigModuleBlockCnt = 0; int ConfigModuleBlockFlage = 1; int ConfigModuleBlockDelay=0; /** * @brief 發送指令配置模塊,阻塞版 * @param dat: 發送的數據 * @param returnc: 預期返回的數據1 * @param returncc: 預期返回的數據2 * @retval 1:配置當前指令OK * @example **/ char ConfigModuleBlock(char *dat,char *returnc,char *returncc) { ConfigModuleBlockCnt = 0; ConfigModuleBlockFlage = 1; while(1) { if(ConfigModuleBlockFlage == 1)//發送指令 { ConfigModuleBlockDelay = 0; memset(Usart1ReadBuff,NULL, sizeof(Usart1ReadBuff));//清零,把自己的串口接收數組放在這里清零 ConfigModuleBlockFlage = 0; printf("%s",dat);//發送指令 } if(Usart1ReadFlage == 1)//串口接收到一條完整的數據 { Usart1ReadFlage = 0; if(returnc!=NULL && strstr(Usart1ReadBuff,returnc))//比較數據 { return 1; } if(returncc!=NULL && strstr(Usart1ReadBuff,returncc))//比較數據 { return 1; } } if(ConfigModuleBlockDelay>=3000)//超過3S { ConfigModuleBlockDelay = 0; ConfigModuleBlockFlage = 1;//允許發送數據 ConfigModuleBlockCnt++; } if(ConfigModuleBlockCnt>=3)//超過三次繼續發送下一條 { ConfigModuleBlockCnt = 0; return 0; } } }
#ifndef CONFIGMODULEBLOCK_H_ #define CONFIGMODULEBLOCK_H_ #include <stm32f10x.h> #ifndef CONFIGMODULEBLOCK_C_//如果沒有定義 #define CONFIGMODULEBLOCK_C_ extern #else #define CONFIGMODULEBLOCK_C_ #endif CONFIGMODULEBLOCK_C_ int ConfigModuleBlockDelay; char ConfigModuleBlock(char *dat,char *returnc,char *returncc); #endif
二,把文件復制,添加到工程
測試:
測試視頻:
來點實際的,配置8266連接路由器
測試視頻:
這套模板應用於不苛刻的場合 (不要求一定一次性成功的場合)
因為一條指令最多執行三次,超過三次接着執行下一條指令
當然大家也可以通過返回值來判斷是否配置成功
不過不建議這樣做,此模板只是應用於不苛刻的場合!
苛刻的場合咱使用下一套模板.