请选择 进入手机版 | 继续访问电脑版
查看: 1295|回复: 4

[智能家居挑战赛] (补充)基于LPC845及ESP8266的简易WIFI控制器

[复制链接]
  • TA的每日心情

    2024-2-5 12:06
  • 签到天数: 627 天

    [LV.9]以坛为家II

    94

    主题

    1628

    帖子

    2

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    4429

    热心会员

    最后登录
    2024-2-5
    发表于 2021-5-22 12:47:15 | 显示全部楼层 |阅读模式
    本帖最后由 胤幻1988 于 2021-5-22 12:57 编辑

    智能家居已经结束。比较惭愧的是,本想用LPC1768做的基于百度云的远程控制器,因为时间关系和LPC1768板子的损坏而告终。
    今天周六上班,就搞一个简易版本的,不通过云端,仅基于ESP8266 设置为TCP CLIENT AP模式的控制器。来纪念我那死去的LPC1768。
    ESP8266啥的就不多说了。本例程参考了网上一些教程。
    本例程的WIFI串口部分,分为2种情况,发送指令配置阶段、透传阶段。
    配置阶段仅接收进数值,然后查询数组中,有无期望的应答,来判断该条指令是否正确执行。
    透传阶段:接收进数组,并开启一定时器来判断当次传输结束。如果结束就触发中断,置位接收完成标志。
    在main函数while循环里面查询接收完成标志,并处理接收的数组,来判断执行相应的控制指令。
    本例程,仅仅是论证,控制已路LED,并查询一路KEY状态,模拟读取2中操作。
    当然读取状态也可再开1路定时器,在定时器中,定时发送状态。本例初始化代码均由配置工具完成,IDE使用MCUXpresso.
    主要的几个外设配置:
    DD1.png
    DD2.png
    DD3.png
    DD4.png
    DD5.png
    DD6.png
    WIFI 串口配置程序:
    1. /*
    2. * usart2.c
    3. *
    4. *  Created on: 2021年5月20日
    5. *      Author: Administrator
    6. */


    7. #include "usart2.h"
    8. #include "wifi.h"
    9. #include <stdio.h>
    10. #include <stdarg.h>
    11. #include <string.h>


    12. #if  USART2_RX_ENABLE                   //如果使能接收功能
    13. char Usart2_RxCompleted = 0;            //定义一个变量 0:表示接收未完成 1:表示接收完成
    14. unsigned int Usart2_RxCounter = 0;      //定义一个变量,记录串口2总共接收了多少字节的数据
    15. char Usart2_RxBuff[USART2_RXBUFF_SIZE]; //定义一个数组,用于保存串口2接收到的数据
    16. #endif



    17. /*-------------------------------------------------*/
    18. /*函数名:初始化串口2发送功能                      */
    19. /*参  数:bound:波特率                            */
    20. /*返回值:无                                       */
    21. /*-------------------------------------------------*/
    22. void Usart2_Init(unsigned int bound)
    23. {
    24.         usart_config_t USART2N_config = {
    25.           .baudRate_Bps = 9600UL,
    26.           .syncMode = kUSART_SyncModeDisabled,
    27.           .parityMode = kUSART_ParityDisabled,
    28.           .stopBitCount = kUSART_OneStopBit,
    29.           .bitCountPerChar = kUSART_8BitsPerChar,
    30.           .loopback = false,
    31.           .enableRx = true,
    32.           .enableTx = true,
    33.           .clockPolarity = kUSART_RxSampleOnFallingEdge,
    34.           .enableContinuousSCLK = false
    35.         };

    36.   USART2N_config.baudRate_Bps=bound;
    37.   /* USART2 peripheral initialization */
    38.    USART_Init(USART2_PERIPHERAL, &USART2N_config, USART2_CLOCK_SOURCE);
    39.    USART_EnableInterrupts(USART2_PERIPHERAL, kUSART_RxReadyInterruptEnable);
    40.    /* Enable interrupt USART2_IRQn request in the NVIC. */
    41.    EnableIRQ(USART2_USART_IRQN);
    42. }

    43. /*-------------------------------------------------*/
    44. /*函数名:串口2 printf函数                         */
    45. /*参  数:char* fmt,...  格式化输出字符串和参数    */
    46. /*返回值:无                                       */
    47. /*-------------------------------------------------*/
    48. //__attribute__((aligned(16)))
    49. char  __attribute__((aligned(8))) USART2_TxBuff[USART2_TXBUFF_SIZE];

    50. void u2_printf(char* fmt,...)
    51. {
    52.         unsigned int i,length;

    53.         va_list ap;
    54.         va_start(ap,fmt);
    55.         vsprintf(USART2_TxBuff,fmt,ap);
    56.         va_end(ap);

    57.         length=strlen((const char*)USART2_TxBuff);
    58.         while (!(kUSART_TxReady & USART_GetStatusFlags(USART2_PERIPHERAL)));
    59.         for(i = 0;i < length;i ++)
    60.         {
    61.                 USART_WriteByte(USART2_PERIPHERAL,USART2_TxBuff[i]);
    62.                 while (!(kUSART_TxReady & USART_GetStatusFlags(USART2_PERIPHERAL)));
    63.         }
    64. }


    65. /*-------------------------------------------------*/
    66. /*函数名:串口2发送缓冲区中的数据                  */
    67. /*参  数:data:数据                               */
    68. /*返回值:无                                       */
    69. /*-------------------------------------------------*/
    70. void u2_TxData(unsigned char *data)
    71. {
    72.         int        i;
    73.         while (!(kUSART_TxReady & USART_GetStatusFlags(USART2_PERIPHERAL)));
    74.         for(i = 1;i <= data[0];i ++){
    75.                 USART_WriteByte(USART2_PERIPHERAL,USART2_TxBuff[i]);
    76.                 while (!(kUSART_TxReady & USART_GetStatusFlags(USART2_PERIPHERAL)));
    77.         }
    78. }

    79. /*-------------------------------------------------*/
    80. /*函数名:串口3接收中断函数                        */
    81. /*参  数:无                                       */
    82. /*返回值:无                                       */
    83. /*-------------------------------------------------*/
    84. /* USART2_IRQn interrupt handler */
    85. void USART2_USART_IRQHANDLER(void)
    86. {
    87.   /*  Place your code here */
    88.         uint8_t data;

    89.         /* If this Rx read flag is set, read data to buffer. */
    90.         if (kUSART_RxReady & USART_GetStatusFlags(USART2_PERIPHERAL))
    91.         {
    92.                 data = USART_ReadByte(USART2_PERIPHERAL);

    93.                 if(Connect_flag==0)                                   //如果Connect_flag等于0,当前还没有连接服务器,处于指令配置状态
    94.                 {
    95.                         if(data)
    96.                         {
    97.                                 Usart2_RxBuff[Usart2_RxCounter]=data;       //保存到缓冲区
    98.                                 Usart2_RxCounter ++;                        //每接收1个字节的数据,Usart2_RxCounter加1,表示接收的数据总量+1
    99.                         }
    100.                 }
    101.                 else
    102.                 {
    103.                         Usart2_RxBuff[Usart2_RxCounter] = data;      //把接收到的数据保存到Usart2_RxBuff中
    104.                         if(Usart2_RxCounter == 0)
    105.                         {                                            //如果Usart2_RxCounter等于0,表示是接收的第1个数据,进入if分支
    106.                         //TIM_Cmd(TIM4,ENABLE);
    107.                                 CTIMER_StartTimer(CTIMER0_PERIPHERAL);
    108.                         }
    109.                         else
    110.                         {                                                                //else分支,表示果Usart2_RxCounter不等于0,不是接收的第一个数据
    111.                         //TIM_SetCounter(TIM4,0);
    112.                                 CTIMER0_PERIPHERAL->TC=0;
    113.                         }
    114.                         Usart2_RxCounter ++;                                             //每接收1个字节的数据,Usart2_RxCounter加1,表示接收的数据总量+1
    115.                 }
    116.         }
    117.   /* Add for ARM errata 838869, affects Cortex-M4, Cortex-M4F
    118.      Store immediate overlapping exception return operation might vector to incorrect interrupt. */
    119.   #if defined __CORTEX_M && (__CORTEX_M == 4U)
    120.     __DSB();
    121.   #endif
    122. }

    复制代码
    判断串口发送结束的定时器配置程序:
    1. /* clang-format on */
    2. const ctimer_config_t CTIMER0_config = {
    3.   .mode = kCTIMER_TimerMode,
    4.   .input = kCTIMER_Capture_0,
    5.   .prescale = 29
    6. };
    7. const ctimer_match_config_t CTIMER0_Match_0_config = {
    8.   .matchValue = 1000,
    9.   .enableCounterReset = true,
    10.   .enableCounterStop = false,
    11.   .outControl = kCTIMER_Output_NoAction,
    12.   .outPinInitState = false,
    13.   .enableInterrupt = true
    14. };
    15. /* Single callback functions definition */
    16. ctimer_callback_t CTIMER0_callback[] = {CTIMER0_Singlecallback};

    17. static void CTIMER0_init(void) {
    18.   /* CTIMER0 peripheral initialization */
    19.   CTIMER_Init(CTIMER0_PERIPHERAL, &CTIMER0_config);
    20.   /* Match channel 0 of CTIMER0 peripheral initialization */
    21.   CTIMER_SetupMatch(CTIMER0_PERIPHERAL, CTIMER0_MATCH_0_CHANNEL, &CTIMER0_Match_0_config);
    22.   CTIMER_RegisterCallBack(CTIMER0_PERIPHERAL, CTIMER0_callback, kCTIMER_SingleCallback);
    23. }

    24. static uint32_t i            = 0;
    25. void CTIMER0_Singlecallback(uint32_t flags)
    26. {
    27.     i++;

    28.     if(i>=30) //周期1ms 30ms
    29.         {
    30.                 i=0;
    31.                 //LED_RED_TOGGLE();

    32.                 Usart2_RxCompleted = 1;                                       //串口2接收完成标志位置位
    33.                 memcpy(&Data_buff[2],Usart2_RxBuff,Usart2_RxCounter);         //拷贝数据
    34.                 Data_buff[0] = WiFi_RxCounter/256;                            //记录接收的数据量
    35.                 Data_buff[1] = WiFi_RxCounter%256;                            //记录接收的数据量
    36.                 Data_buff[WiFi_RxCounter+2] = '\0';                           //加入结束符
    37.                 WiFi_RxCounter=0;                                             //清零计数值
    38.                                                 
    39.                 CTIMER_StopTimer(CTIMER0_PERIPHERAL);                         //关闭CTIM0定时器                                            
    40.                 CTIMER0_PERIPHERAL->TC=0;                                     //清零CTIM0计数器
    41.         }
    42. }
    复制代码
    WIFI配置程序:
    1. /*
    2. * wifi.c
    3. *
    4. *  Created on: 2021年5月21日
    5. *      Author: Administrator
    6. */

    7. #include "wifi.h"
    8. #include "delay.h"            //包含需要的头文件
    9. #include "led.h"        //包含需要的头文件
    10. #include "key.h"        //包含需要的头文件
    11. #include <stdio.h>
    12. /*-----------------------------------------------------------------------------*/
    13. /*                              根据自己的网络环境修改                         */
    14. /*-----------------------------------------------------------------------------*/
    15. char *ServerIP = "192.168.10.2";           //存放服务器IP或是域名
    16. int  ServerPort = 5050;                    //存放服务器的端口号区
    17. /*-----------------------------------------------------------------------------*/
    18. char  Data_buff[2048];     //数据缓冲区

    19. char wifi_mode = 1;     //联网模式 0:SSID和密码写在程序里   1:Smartconfig方式用APP发送
    20. char Connect_flag;      //同服务器连接状态  0:还没有连接服务器  1:连接上服务器了

    21. /*-------------------------------------------------*/
    22. /*函数名:初始化WiFi的复位IO                       */
    23. /*参  数:无                                       */
    24. /*返回值:无                                       */
    25. /*-------------------------------------------------*/
    26. void WiFi_ResetIO_Init(void)
    27. {
    28.         /* Enables the clock for the GPIO1 module */
    29.         CLOCK_EnableClock(kCLOCK_Gpio1);

    30.         gpio_pin_config_t gpio1_pin1_6 = {
    31.                 .pinDirection = kGPIO_DigitalOutput,
    32.                 .outputLogic = 1U,
    33.         };
    34.         /* Initialize GPIO functionality on pin PIO1_6 (pin )  */
    35.         GPIO_PinInit(GPIO, 1U, 6U, &gpio1_pin1_6);

    36.         RESET_IO(1);                                              //复位IO拉高电平
    37. }
    38. /*-------------------------------------------------*/
    39. /*函数名:WiFi发送设置指令                         */
    40. /*参  数:cmd:指令                                */
    41. /*参  数:timeout:超时时间(100ms的倍数)         */
    42. /*返回值:0:正确   其他:错误                     */
    43. /*-------------------------------------------------*/
    44. char WiFi_SendCmd(char *cmd, int timeout)
    45. {
    46.         WiFi_RxCounter=0;                           //WiFi接收数据量变量清零
    47.         memset(WiFi_RX_BUF,0,WiFi_RXBUFF_SIZE);     //清空WiFi接收缓冲区
    48.         WiFi_printf("%s\r\n",cmd);                  //发送指令
    49.         while(timeout--){                           //等待超时时间到0
    50.                 Delay_Ms(100);                          //延时100ms
    51.                 if(strstr(WiFi_RX_BUF,"OK"))            //如果接收到OK表示指令成功
    52.                         break;                                                       //主动跳出while循环
    53.                 u0_printf("%d ",timeout);               //串口输出现在的超时时间
    54.         }
    55.         u0_printf("\r\n");                          //串口输出信息
    56.         if(timeout<=0)return 1;                     //如果timeout<=0,说明超时时间到了,也没能收到OK,返回1
    57.         else return 0;                                                         //反之,表示正确,说明收到OK,通过break主动跳出while
    58. }
    59. /*-------------------------------------------------*/
    60. /*函数名:WiFi复位                                 */
    61. /*参  数:timeout:超时时间(100ms的倍数)         */
    62. /*返回值:0:正确   其他:错误                     */
    63. /*-------------------------------------------------*/
    64. char WiFi_Reset(int timeout)
    65. {
    66.         RESET_IO(0);                                    //复位IO拉低电平
    67.         Delay_Ms(500);                                  //延时500ms
    68.         RESET_IO(1);                                    //复位IO拉高电平
    69.         while(timeout--){                               //等待超时时间到0
    70.                 Delay_Ms(100);                              //延时100ms
    71.                 if(strstr(WiFi_RX_BUF,"ready"))             //如果接收到ready表示复位成功
    72.                         break;                                                           //主动跳出while循环
    73.                 u0_printf("%d ",timeout);                   //串口输出现在的超时时间
    74.         }
    75.         u0_printf("\r\n");                              //串口输出信息
    76.         if(timeout<=0)return 1;                         //如果timeout<=0,说明超时时间到了,也没能收到ready,返回1
    77.         else return 0;                                                             //反之,表示正确,说明收到ready,通过break主动跳出while
    78. }
    79. /*-------------------------------------------------*/
    80. /*函数名:WiFi加入路由器指令                       */
    81. /*参  数:timeout:超时时间(1s的倍数)            */
    82. /*返回值:0:正确   其他:错误                     */
    83. /*-------------------------------------------------*/
    84. char WiFi_JoinAP(int timeout)
    85. {
    86.         WiFi_RxCounter=0;                               //WiFi接收数据量变量清零
    87.         memset(WiFi_RX_BUF,0,WiFi_RXBUFF_SIZE);         //清空WiFi接收缓冲区
    88.         WiFi_printf("AT+CWJAP="%s","%s"\r\n",SSID,PASS); //发送指令
    89.         while(timeout--){                               //等待超时时间到0
    90.                 Delay_Ms(1000);                             //延时1s
    91.                 if(strstr(WiFi_RX_BUF,"WIFI GOT IP\r\n\r\nOK")) //如果接收到WIFI GOT IP表示成功
    92.                         break;                                                           //主动跳出while循环
    93.                 u0_printf("%d ",timeout);                   //串口输出现在的超时时间
    94.         }
    95.         u0_printf("\r\n");                              //串口输出信息
    96.         if(timeout<=0)return 1;                         //如果timeout<=0,说明超时时间到了,也没能收到WIFI GOT IP,返回1
    97.         return 0;                                       //正确,返回0
    98. }
    99. /*-------------------------------------------------*/
    100. /*函数名:WiFi_Smartconfig                         */
    101. /*参  数:timeout:超时时间(1s的倍数)            */
    102. /*返回值:0:正确   其他:错误                     */
    103. /*-------------------------------------------------*/
    104. char WiFi_Smartconfig(int timeout)
    105. {
    106.         WiFi_RxCounter=0;                           //WiFi接收数据量变量清零
    107.         memset(WiFi_RX_BUF,0,WiFi_RXBUFF_SIZE);     //清空WiFi接收缓冲区
    108.         while(timeout--){                           //等待超时时间到0
    109.                 Delay_Ms(1000);                         //延时1s
    110.                 if(strstr(WiFi_RX_BUF,"connected"))     //如果串口接受到connected表示成功
    111.                         break;                              //跳出while循环
    112.                 u0_printf("%d ",timeout);               //串口输出现在的超时时间
    113.         }
    114.         u0_printf("\r\n");                          //串口输出信息
    115.         if(timeout<=0)return 1;                     //超时错误,返回1
    116.         return 0;                                   //正确返回0
    117. }
    118. /*-------------------------------------------------*/
    119. /*函数名:等待加入路由器                           */
    120. /*参  数:timeout:超时时间(1s的倍数)            */
    121. /*返回值:0:正确   其他:错误                     */
    122. /*-------------------------------------------------*/
    123. char WiFi_WaitAP(int timeout)
    124. {
    125.         while(timeout--){                               //等待超时时间到0
    126.                 Delay_Ms(1000);                             //延时1s
    127.                 if(strstr(WiFi_RX_BUF,"WIFI GOT IP"))       //如果接收到WIFI GOT IP表示成功
    128.                         break;                                                           //主动跳出while循环
    129.                 u0_printf("%d ",timeout);                   //串口输出现在的超时时间
    130.         }
    131.         u0_printf("\r\n");                              //串口输出信息
    132.         if(timeout<=0)return 1;                         //如果timeout<=0,说明超时时间到了,也没能收到WIFI GOT IP,返回1
    133.         return 0;                                       //正确,返回0
    134. }
    135. /*-------------------------------------------------*/
    136. /*函数名:等待连接wifi,获取IP地址                 */
    137. /*参  数:ip:保存IP的数组                         */
    138. /*参  数:timeout:超时时间(100ms的倍数)         */
    139. /*返回值:0:正确   其他:错误                     */
    140. /*-------------------------------------------------*/
    141. char WiFi_GetIP(int timeout)
    142. {
    143.         char *presult1,*presult2;
    144.         char ip[50];

    145.         WiFi_RxCounter=0;                               //WiFi接收数据量变量清零
    146.         memset(WiFi_RX_BUF,0,WiFi_RXBUFF_SIZE);         //清空WiFi接收缓冲区
    147.         WiFi_printf("AT+CIFSR\r\n");                    //发送指令
    148.         while(timeout--){                               //等待超时时间到0
    149.                 Delay_Ms(100);                              //延时100ms
    150.                 if(strstr(WiFi_RX_BUF,"OK"))                //如果接收到OK表示成功
    151.                         break;                                                           //主动跳出while循环
    152.                 u0_printf("%d ",timeout);                   //串口输出现在的超时时间
    153.         }
    154.         u0_printf("\r\n");                              //串口输出信息
    155.         if(timeout<=0)return 1;                         //如果timeout<=0,说明超时时间到了,也没能收到OK,返回1
    156.         else{
    157.                 presult1 = strstr(WiFi_RX_BUF,""");
    158.                 if( presult1 != NULL ){
    159.                         presult2 = strstr(presult1+1,""");
    160.                         if( presult2 != NULL ){
    161.                                 memcpy(ip,presult1+1,presult2-presult1-1);
    162.                                 u0_printf("ESP8266 IP address:%s\r\n",ip);     //串口显示IP地址
    163.                                 return 0;    //正确返回0
    164.                         }else return 2;  //未收到预期数据
    165.                 }else return 3;      //未收到预期数据
    166.         }
    167. }
    168. /*-------------------------------------------------*/
    169. /*函数名:获取连接状态                             */
    170. /*参  数:无                                       */
    171. /*返回值:连接状态                                 */
    172. /*        0:无状态                                */
    173. /*        1:有客户端接入                          */
    174. /*        2:有客户端断开                          */
    175. /*-------------------------------------------------*/
    176. char WiFi_Get_LinkSta(void)
    177. {
    178.         char id_temp[10]={0};    //缓冲区,存放ID
    179.         char sta_temp[10]={0};   //缓冲区,存放状态

    180.         if(strstr(WiFi_RX_BUF,"CONNECT")){                 //如果接受到CONNECT表示有客户端连接
    181.                 sscanf(WiFi_RX_BUF,"%[^,],%[^,]",id_temp,sta_temp);
    182.                 u0_printf("client connect,ID=%s\r\n",id_temp);  //串口显示信息
    183.                 WiFi_RxCounter=0;                              //WiFi接收数据量变量清零
    184.                 memset(WiFi_RX_BUF,0,WiFi_RXBUFF_SIZE);        //清空WiFi接收缓冲区
    185.                 return 1;                                      //有客户端接入
    186.         }else if(strstr(WiFi_RX_BUF,"CLOSED")){            //如果接受到CLOSED表示有链接断开
    187.                 sscanf(WiFi_RX_BUF,"%[^,],%[^,]",id_temp,sta_temp);
    188.                 u0_printf("client disconnect,ID=%s\r\n",id_temp);        //串口显示信息
    189.                 WiFi_RxCounter=0;                                    //WiFi接收数据量变量清零
    190.                 memset(WiFi_RX_BUF,0,WiFi_RXBUFF_SIZE);              //清空WiFi接收缓冲区
    191.                 return 2;                                            //有客户端断开
    192.         }else return 0;                                          //无状态改变
    193. }
    194. /*-------------------------------------------------*/
    195. /*函数名:获取客户端数据                           */
    196. /*        两组回车换行符\r\n\r\n作为数据的结束符   */
    197. /*参  数:data:数据缓冲区                         */
    198. /*参  数:len: 数据量                             */
    199. /*参  数:id:  发来数据的客户端的连接ID           */
    200. /*返回值:数据状态                                 */
    201. /*        0:无数据                                */
    202. /*        1:有数据                                */
    203. /*-------------------------------------------------*/
    204. char WiFi_Get_Data(char *data, char *len, char *id)
    205. {
    206.         char temp[10]={0};      //缓冲区
    207.         char *presult;

    208.         if(strstr(WiFi_RX_BUF,"\r\n\r\n")){                     //两个连着的回车换行作为数据的结束符
    209.                 sscanf(WiFi_RX_BUF,"%[^,],%[^,],%[^:]",temp,id,len);//截取各段数据,主要是id和数据长度
    210.                 presult = strstr(WiFi_RX_BUF,":");                  //查找冒号。冒号后的是数据
    211.                 if( presult != NULL )                               //找到冒号
    212.                         sprintf((char *)data,"%s",(presult+1));         //冒号后的数据,复制到data
    213.                 WiFi_RxCounter=0;                                   //WiFi接收数据量变量清零
    214.                 memset(WiFi_RX_BUF,0,WiFi_RXBUFF_SIZE);             //清空WiFi接收缓冲区
    215.                 return 1;                                           //有数据到来
    216.         } else return 0;                                        //无数据到来
    217. }
    218. /*-------------------------------------------------*/
    219. /*函数名:服务器发送数据                           */
    220. /*参  数:databuff:数据缓冲区<2048                */
    221. /*参  数:data_len:数据长度                       */
    222. /*参  数:id:      客户端的连接ID                 */
    223. /*参  数:timeout: 超时时间(10ms的倍数)         */
    224. /*返回值:错误值                                   */
    225. /*        0:无错误                                */
    226. /*        1:等待发送数据超时                      */
    227. /*        2:连接断开了                            */
    228. /*        3:发送数据超时                          */
    229. /*-------------------------------------------------*/
    230. char WiFi_SendData(char id, char *databuff, int data_len, int timeout)
    231. {
    232.         int i;

    233.         WiFi_RxCounter=0;                                 //WiFi接收数据量变量清零
    234.         memset(WiFi_RX_BUF,0,WiFi_RXBUFF_SIZE);           //清空WiFi接收缓冲区
    235.         WiFi_printf("AT+CIPSEND=%d,%d\r\n",id,data_len);  //发送指令
    236.     while(timeout--){                                 //等待超时与否
    237.                 Delay_Ms(10);                                 //延时10ms
    238.                 if(strstr(WiFi_RX_BUF,">"))                   //如果接收到>表示成功
    239.                         break;                                                             //主动跳出while循环
    240.                 u0_printf("%d ",timeout);                     //串口输出现在的超时时间
    241.         }
    242.         if(timeout<=0)return 1;                                   //超时错误,返回1
    243.         else{                                                     //没超时,正确
    244.                 WiFi_RxCounter=0;                                     //WiFi接收数据量变量清零
    245.                 memset(WiFi_RX_BUF,0,WiFi_RXBUFF_SIZE);               //清空WiFi接收缓冲区
    246.                 for(i=0;i<data_len;i++)WiFi_printf("%c",databuff[i]); //发送数据
    247.                 while(timeout--){                                     //等待超时与否
    248.                         Delay_Ms(10);                                     //延时10ms
    249.                         if(strstr(WiFi_RX_BUF,"SEND OK")){                //如果接受SEND OK,表示发送成功
    250.                         WiFi_RxCounter=0;                                 //WiFi接收数据量变量清零
    251.                         memset(WiFi_RX_BUF,0,WiFi_RXBUFF_SIZE);           //清空WiFi接收缓冲区
    252.                                 break;                                        //跳出while循环
    253.                         }
    254.                         if(strstr(WiFi_RX_BUF,"link is not valid")){      //如果接受link is not valid,表示连接断开
    255.                                 WiFi_RxCounter=0;                             //WiFi接收数据量变量清零
    256.                                 memset(WiFi_RX_BUF,0,WiFi_RXBUFF_SIZE);       //清空WiFi接收缓冲区
    257.                                 return 2;                                     //返回2
    258.                         }
    259.             }
    260.                 if(timeout<=0)return 3;      //超时错误,返回3
    261.                 else return 0;                    //正确,返回0
    262.         }
    263. }
    264. /*-------------------------------------------------*/
    265. /*函数名:连接TCP服务器,并进入透传模式            */
    266. /*参  数:timeout: 超时时间(100ms的倍数)        */
    267. /*返回值:0:正确  其他:错误                      */
    268. /*-------------------------------------------------*/
    269. char WiFi_Connect_Server(int timeout)
    270. {
    271.         WiFi_RxCounter=0;                               //WiFi接收数据量变量清零
    272.         memset(WiFi_RX_BUF,0,WiFi_RXBUFF_SIZE);         //清空WiFi接收缓冲区
    273.         WiFi_printf("AT+CIPSTART="TCP","%s",%d\r\n",ServerIP,ServerPort);//发送连接服务器指令
    274.         while(timeout--){                               //等待超时与否
    275.                 Delay_Ms(100);                              //延时100ms
    276.                 if(strstr(WiFi_RX_BUF ,"CONNECT"))          //如果接受到CONNECT表示连接成功
    277.                         break;                                  //跳出while循环
    278.                 if(strstr(WiFi_RX_BUF ,"CLOSED"))           //如果接受到CLOSED表示服务器未开启
    279.                         return 1;                               //服务器未开启返回1
    280.                 if(strstr(WiFi_RX_BUF ,"ALREADY CONNECTED"))//如果接受到ALREADY CONNECTED已经建立连接
    281.                         return 2;                               //已经建立连接返回2
    282.                 u0_printf("%d ",timeout);                   //串口输出现在的超时时间
    283.         }
    284.         u0_printf("\r\n");                        //串口输出信息
    285.         if(timeout<=0)return 3;                   //超时错误,返回3
    286.         else                                      //连接成功,准备进入透传
    287.         {
    288.                 u0_printf("start in dirsend mode\r\n");          //串口显示信息
    289.                 WiFi_RxCounter=0;                               //WiFi接收数据量变量清零
    290.                 memset(WiFi_RX_BUF,0,WiFi_RXBUFF_SIZE);         //清空WiFi接收缓冲区
    291.                 WiFi_printf("AT+CIPSEND\r\n");                  //发送进入透传指令
    292.                 while(timeout--){                               //等待超时与否
    293.                         Delay_Ms(100);                              //延时100ms
    294.                         if(strstr(WiFi_RX_BUF,"\r\nOK\r\n\r\n>"))   //如果成立表示进入透传成功
    295.                                 break;                          //跳出while循环
    296.                         u0_printf("%d ",timeout);           //串口输出现在的超时时间
    297.                 }
    298.                 if(timeout<=0)return 4;                 //透传超时错误,返回4
    299.         }
    300.         return 0;                                        //成功返回0
    301. }
    302. /*-------------------------------------------------*/
    303. /*函数名:设置AP                                   */
    304. /*参  数:ssid:ssid                               */
    305. /*参  数:password:密码                           */
    306. /*参  数:mode:加密方式                            */
    307. /*参  数:timeout :超时时间                       */
    308. /*返回值:0;正确  其他:错误                      */
    309. /*-------------------------------------------------*/
    310. char WiFi_SET_AP(char *ssid, char *password, char mode, int timeout)
    311. {
    312.         WiFi_RxCounter=0;                                                   //WiFi接收数据量变量清零
    313.         memset(WiFi_RX_BUF,0,WiFi_RXBUFF_SIZE);                             //清空WiFi接收缓冲区
    314.         WiFi_printf("AT+CWSAP="%s","%s",4,%d\r\n",ssid,password,mode);  //发送设置AP指令
    315.         while(timeout--){                           //等待超时时间到0
    316.                 Delay_Ms(100);                          //延时100ms
    317.                 if(strstr(WiFi_RX_BUF,"OK"))            //如果接收到OK表示指令成功
    318.                         break;                                                       //主动跳出while循环
    319.                 u0_printf("%d ",timeout);               //串口输出现在的超时时间
    320.         }
    321.         u0_printf("\r\n");                          //串口输出信息
    322.         if(timeout<=0)return 1;                     //如果timeout<=0,说明超时时间到了,也没能收到OK,返回1
    323.         else return 0;                                                         //反之,表示正确,说明收到OK,通过break主动跳出while
    324. }
    325. /*-------------------------------------------------*/
    326. /*函数名:连接服务器                               */
    327. /*参  数:无                                       */
    328. /*返回值:0:正确   其他:错误                     */
    329. /*-------------------------------------------------*/
    330. char WiFi_ConnectServer_AP(void)
    331. {
    332.         char res;
    333.         char temp[50];

    334.         u0_printf("reset module\r\n");                     //串口提示数据
    335.         if(WiFi_Reset(50)){                                //复位,100ms超时单位,总计5s超时时间
    336.                 u0_printf("reset fail,try reset...\r\n");           //返回非0值,进入if,串口提示数据
    337.                 return 1;                                      //返回1
    338.         }else u0_printf("reset ok!\r\n");                   //串口提示数据

    339.         u0_printf("Try set AP mode\r\n");                   //串口提示数据
    340.         if(WiFi_SendCmd("AT+CWMODE=2",50)){                //设置AP模式,100ms超时单位,总计5s超时时间
    341.                 u0_printf("set AP mode,try reset...\r\n");     //返回非0值,进入if,串口提示数据
    342.                 return 2;                                      //返回2
    343.         }else u0_printf("set AP mode OK\r\n");             //串口提示数据

    344.         u0_printf("start set AP para\r\n");                   //串口提示数据
    345.         u0_printf("SSID:%s\r\n",SSID);                    //串口提示数据
    346.         u0_printf("key:%s\r\n",PASS);                    //串口提示数据
    347.         u0_printf("AP IP:%s\r\n",AP_IP);               //串口提示数据
    348.         u0_printf("key mode:WPA_WPA2_PSK\r\n");           //串口提示数据

    349.         u0_printf("start set AP IP\r\n");                 //串口提示数据
    350.         memset(temp,0,50);                                 //清除临时缓冲区
    351.         sprintf(temp,"AT+CIPAP="%s"",AP_IP);             //构建命令
    352.         if(WiFi_SendCmd(temp,50)){                         //设置AP热点IP,100ms超时单位,总计5s超时时间
    353.                 u0_printf("set AP IP fail,start reset\r\n");   //返回非0值,进入if,串口提示数据
    354.                 return 3;                                      //返回3
    355.         }else u0_printf("set AP IP ok\r\n");           //串口提示数据

    356.         u0_printf("start set AP para\r\n");                   //串口提示数据
    357.         if(WiFi_SET_AP(SSID,PASS,WPA_WPA2_PSK,50)){        //设置AP参数,100ms超时单位,总计5s超时时间
    358.                 u0_printf("set AP para fail,start reset\r\n");     //返回非0值,进入if,串口提示数据
    359.                 return 4;                                      //返回4
    360.         }else u0_printf("set AP para ok\r\n");             //串口提示数据

    361.         u0_printf("start open dirsend\r\n");                     //串口提示数据
    362.         if(WiFi_SendCmd("AT+CIPMODE=1",50)){               //开启透传,100ms超时单位,总计5s超时时间
    363.                 u0_printf("open dirsend fail,start reset\r\n");       //返回非0值,进入if,串口提示数据
    364.                 return 5;                                      //返回5
    365.         }else u0_printf("close dirsend ok\r\n");               //串口提示数据

    366.         u0_printf("start close multiconnect\r\n");                 //串口提示数据
    367.         if(WiFi_SendCmd("AT+CIPMUX=0",50)){                //关闭多路连接,100ms超时单位,总计5s超时时间
    368.                 u0_printf(" close multiconnect fail,start reset\r\n");   //返回非0值,进入if,串口提示数据
    369.                 return 6;                                      //返回6
    370.         }else u0_printf("close multiconnect ok\r\n");           //串口提示数据

    371. Connect:
    372.         u0_printf("start connect server\r\n");                   //串口提示数据
    373.         res = WiFi_Connect_Server(100);                    //连接服务器,100ms超时单位,总计10s超时时间
    374.         if(res==1){                                                                   //返回值=1,进入if
    375.                 u0_printf("connect server fail,try reconnect\r\n");       //串口提示数据
    376.                 Delay_Ms(2000);                                //延时
    377.                 goto Connect;                                  //跳转到Connect重连
    378.         }else if(res==2){                                  //返回值=2,进入if
    379.                 u0_printf("connect already exist\r\n");                 //串口提示数据
    380.         }else if(res==3){                                                                   //返回值=3,进入if
    381.                 u0_printf("connect server out time,try reconnect\r\n");     //串口提示数据
    382.                 return 7;                                      //返回7
    383.         }else if(res==4){                                                                   //返回值=4,进入if
    384.                 u0_printf("open dirsend fail\r\n");                 //串口提示数据
    385.                 return 8;                                      //返回8
    386.         }
    387.         u0_printf("connect server OK\r\n");                   //串口提示数据
    388.         return 0;                                          //正确返回0
    389. }
    复制代码
    1. /*
    2. * wifi.h
    3. *
    4. *  Created on: 2021年5月21日
    5. *      Author: Administrator
    6. */

    7. #ifndef WIFI_H_
    8. #define WIFI_H_

    9. #include "usart2.h"               //包含需要的头文件
    10. #include "fsl_debug_console.h"
    11. #include "pin_mux.h"
    12. #include "delay.h"

    13. #define u0_printf  PRINTF

    14. extern char Connect_flag;  //外部变量声明,同服务器连接状态  0:还没有连接服务器  1:连接上服务器了

    15. #define BOARD_INITPINS_wifi_rest_GPIO GPIO                /*!<@brief GPIO peripheral base pointer */
    16. #define BOARD_INITPINS_wifi_rest_GPIO_PIN_MASK (1U << 6U) /*!<@brief GPIO pin mask */
    17. #define BOARD_INITPINS_wifi_rest_PORT 1U                  /*!<@brief PORT device index: 1 */
    18. #define BOARD_INITPINS_wifi_rest_PIN 6U                   /*!<@brief PORT pin number */
    19. #define BOARD_INITPINS_wifi_rest_PIN_MASK (1U << 6U)      /*!<@brief PORT pin mask */
    20.                                                           /* @} */
    21. #define RESET_IO_L  GPIO_PortClear(BOARD_INITPINS_wifi_rest_GPIO, BOARD_INITPINS_wifi_rest_PORT,                      \
    22.                     1U << BOARD_INITPINS_wifi_rest_PIN) /*!< Turn on target LED_GREEN \ \ \ \ \
    23.                                                     */
    24. #define RESET_IO_H  GPIO_PortSet  (BOARD_INITPINS_wifi_rest_GPIO, BOARD_INITPINS_wifi_rest_PORT,                       \
    25.                     1U << BOARD_INITPINS_wifi_rest_PIN)
    26. #define RESET_IO(x)    (x>0)?RESET_IO_H:RESET_IO_L  //PA4控制WiFi的复位

    27. #define WiFi_printf       u2_printf           //串口2控制 WiFi
    28. #define WiFi_RxCounter    Usart2_RxCounter    //串口2控制 WiFi
    29. #define WiFi_RX_BUF       Usart2_RxBuff       //串口2控制 WiFi
    30. #define WiFi_RXBUFF_SIZE  USART2_RXBUFF_SIZE  //串口2控制 WiFi
    31. #define Delay_Ms          delay_ms

    32. #define SSID   "ESP8266-AP"                 //路由器SSID名称
    33. #define PASS   "123456789"                    //路由器密码
    34. #define WPA_WPA2_PSK     4                    //加密方式
    35. #define AP_IP  "192.168.10.1"                 //AP热点的ip

    36. extern char *ServerIP;         //存放服务器IP或是域名
    37. extern int  ServerPort;        //存放服务器的端口号区
    38. extern char Data_buff[2048];   //数据缓冲区

    39. void WiFi_ResetIO_Init(void);
    40. char WiFi_SendCmd(char *cmd, int timeout);
    41. char WiFi_Reset(int timeout);
    42. char WiFi_JoinAP(int timeout);
    43. char WiFi_Connect_Server(int timeout);
    44. char WiFi_Smartconfig(int timeout);
    45. char WiFi_WaitAP(int timeout);
    46. char WiFi_GetIP(int timeout);
    47. char WiFi_Get_LinkSta(void);
    48. char WiFi_Get_Data(char *data, char *len, char *id);
    49. char WiFi_SendData(char id, char *databuff, int data_len, int timeout);
    50. char WiFi_Connect_Server(int timeout);
    51. char WiFi_SET_AP(char *ssid, char *password, char mode, int timeout);
    52. char WiFi_ConnectServer_AP(void);

    53. #endif /* WIFI_H_ */
    复制代码
    main函数中调用:
    1. WiFi_ResetIO_Init();            //初始化WiFi的复位IO
    2.         while(WiFi_ConnectServer_AP()){  //循环,初始化,连接服务器,直到成功
    3.                 Delay_Ms(2000);              //延时
    4.         }
    5.         WiFi_RxCounter=0;                          //WiFi接收数据量变量清零
    6.         memset(WiFi_RX_BUF,0,WiFi_RXBUFF_SIZE);    //清空WiFi接收缓冲区
    7.         Connect_flag = 1;                          //Connect_flag=1,表示连接上服务器

    8.         while(1){
    9.                 if(Usart2_RxCompleted==1){                                          //如果Usart2_RxCompleted等于1,表示接收数据完成
    10.                         Usart2_RxCompleted = 0;                               //清除标志位
    11.                         u0_printf("the server send %d byte date\r\n",(Data_buff[0]*256+Data_buff[1])); //串口输出信息
    12.                         u0_printf("data:%s\r\n",&Data_buff[2]);               //串口输出信息
    13.                         WiFi_printf("you send data:%s\r\n",&Data_buff[2]);          //把接收到的数据,返回给服务器
    14.                         //判断指令,执行操作
    15.                         //写控制
    16.                         if (strstr(&Data_buff[2],"LED ON"))    LED_RED_ON();
    17.                         if (strstr(&Data_buff[2],"LED OFF"))   LED_RED_OFF();
    18.                         //读控制
    19.                         if (strstr(&Data_buff[2],"KEY VALUE")) WiFi_printf("KEY VALUE IS:%d\r\n",key_wakeup);
    20.                 }
    21.                 if(time>=1000){                                           //当time大于等于1000的时候,大概经过1s的时间
    22.                         time=0;                                               //清除time计数
    23.                         WiFi_printf("I'm client,send me data!\r\n");           //给服务器发送数据
    24.                 }
    25.                 Delay_Ms(1);  //延时1ms
    26.                 time++;       //time计数器+1
    27.         }
    复制代码
    编译无误后,下载程序,发现串口输出信息卡在连接服务器这里:
    SS1.png
    拿出手机,连接热点,并配置服务器:
    1、连接到ESP8266 AP的WIFI网络上:
    当前热点帐号密码:
    SS6.png
    手机连接上AP:
    SS2.jpg
    打开手机网络调试助手,在TCP SERVER 一栏添加一个服务器端口
    设置为5050,要与程序中的一致,,设置好后,可看到IP地址:
    SS8.png
    SS3.jpg
    发送数据,板子做出应答:
    CLIENT接收到SERVER发送的任何数据,均会重新发回来:
    SS4.jpg
    发送对应指令:LED ON 会打开板子LED,LED OFF 关闭板子LED ,
    KEY VALUE 发送按键当前状态。
    SS11.jpg
    板子实物图。
    SS12.jpg
    好了,今天的分享就到这了。谢谢观看~

    哎...今天够累的,签到来了~
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-10 22:38
  • 签到天数: 1335 天

    [LV.10]以坛为家III

    88

    主题

    4292

    帖子

    12

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    9049
    最后登录
    2024-4-13
    发表于 2021-5-22 14:36:38 | 显示全部楼层
    现在一颗LPC1768也得过百元了吧
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2024-2-5 12:06
  • 签到天数: 627 天

    [LV.9]以坛为家II

    94

    主题

    1628

    帖子

    2

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    4429

    热心会员

    最后登录
    2024-2-5
     楼主| 发表于 2021-5-22 15:08:49 | 显示全部楼层
    jobszheng5 发表于 2021-5-22 14:36
    现在一颗LPC1768也得过百元了吧

    根本还买不到 上次有人说都要400一颗了 准备换芯片了~
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-10 22:38
  • 签到天数: 1335 天

    [LV.10]以坛为家III

    88

    主题

    4292

    帖子

    12

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    9049
    最后登录
    2024-4-13
    发表于 2021-5-23 16:53:06 | 显示全部楼层
    听楼主这么一说,我手里的LPC1176的开发板都不敢玩了
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    前天 13:19
  • 签到天数: 589 天

    [LV.9]以坛为家II

    31

    主题

    1343

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    3569
    最后登录
    2024-4-18
    发表于 2021-5-24 10:55:00 | 显示全部楼层
    芯片涨价涨的厉害啊!
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-19 10:14 , Processed in 0.126666 second(s), 24 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

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