野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 548|回复: 0

【瑞萨RA MCU创意氛围赛】6. ESP8266 AT控制命令应用

[复制链接]
发表于 2023-8-19 23:33:26 | 显示全部楼层 |阅读模式

# 前言

本文将使用板载的ESP8266来进行网络连接控制。

# 1 硬件连接

如下图,有三根控制线用来控制ESP8266,其中:

- P601和P602是串口线,用来控制单片机与ESP8266的通信
- P115是普通IO口,控制ESP8266复位,如果需要ESP8266正常工作,需要保持高电平

野火论坛202308192331338176..png

# 2 RASC配置

RASC配置需要配置ESP8266使用到的引脚以及串口,配置串口如下,使用SCI串口9。

野火论坛202308192331544756..png

配置ESP8266连接的复位端口P115,配置默认输出高电平。

野火论坛202308192332062025..png

切换到Stack界面,配置UART9相关参数。

野火论坛202308192332159435..png

UART9详细配置如下:

野火论坛202308192332245767..png

# 3 代码开发

ESP32的驱动代码如下:

调用Esp8266_Init用来初始化串口9

调用Esp8266_Test来进行ESP8266连接测试。

需要修改下面的宏值,用来连接wifi与服务器。

  1. /*
  2. @hehung
  3. email: 1398660197@qq.com
  4. wechat: hehung95
  5. reproduced and please indicate the source @hehung
  6. */

  7. #include "app_common.h"
  8. #include "app_wifi_esp8266.h"
  9.   
  10. #define ESP8266_DEBUG

  11. #ifdef ESP8266_DEBUG
  12. #define LOG(fmt, ... )        printf ( fmt, ##__VA_ARGS__ )
  13. #else
  14. #define LOG(fmt, ... )
  15. #endif


  16. #define   HOTSPOT_ID             "hehungHome"           // Wifi hotspot name
  17. #define   HOTSPOT_PASSWORD       "1234543210"           // Wifi hostpot password

  18. #define   SeverIP                "192.168.6.100"        // Server IP
  19. #define   SeverPort              "8080"                 // Server Port

  20. #define Esp8266_ModuleEnable()     \
  21.             R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_15, BSP_IO_LEVEL_HIGH)  // Enable ESP8266
  22. #define Esp8266_ModuleDisable()    \
  23.             R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_15, BSP_IO_LEVEL_LOW)   // Disable ESP8266

  24. /* Fault Status, On Red LED */
  25. #define Esp8266_ErrorAlarm()     R_PORT4->PODR ^= 1<<(BSP_IO_PORT_04_PIN_00 & 0xFF); \
  26.                                   R_BSP_SoftwareDelay(500, BSP_DELAY_UNITS_MILLISECONDS);


  27. /* Clear Uart9 buffer */
  28. #define   Clear_Buff()   memset(At_Rx_Buff ,0 ,sizeof(At_Rx_Buff)); \
  29.                          Uart9_Num = 0;


  30. static _Bool uart9_receive_flag = false;
  31. static _Bool uart9_show_flag = false;    //控制UART9收发数据显示标志

  32. /*用来接收UART9数据的缓冲区*/
  33. static char    At_Rx_Buff[256];  
  34. static uint8_t Uart9_Num = 0;

  35. static void Esp8266_AT_Send(char * cmd);


  36. /*自动配置ESP8266函数*/
  37. void Esp8266_Test(void)
  38. {
  39.   
  40.     LOG("\r\nInitialize ESP8266...\r\n");
  41.     Esp8266_Init();
  42.   
  43.     LOG("\r\nSetting Station Mode...\r\n");
  44.     Esp8266_SetStationMode();
  45.    
  46.     LOG("\r\nWIFI connecting...\r\n");
  47.     Esp8266_StationConnect(HOTSPOT_ID ,HOTSPOT_PASSWORD ,20);
  48.     Esp8266_SetLinkMode(0);
  49.    
  50.     LOG("\r\nServer Connnecting...\r\n");
  51.     Esp8266_ServerConnect(SeverIP ,SeverPort ,20);
  52.   
  53.     LOG("\r\nTransparent Mode Configuring...\r\n");
  54.     Esp8266_SetTransparentMode();
  55.     Esp8266_SetSendData();
  56.   
  57. }


  58. /*ESP8266 (SPI9 UART) 初始化函数*/
  59. void Esp8266_Init(void)
  60. {
  61.     fsp_err_t err = FSP_SUCCESS;
  62.   
  63.     err = R_SCI_UART_Open(&g_uart9_ctrl, &g_uart9_cfg);
  64.     assert(FSP_SUCCESS == err);
  65. }


  66. /*向ESP8266发送AT指令函数*/
  67. static void Esp8266_AT_Send(char * cmd)  
  68. {
  69.     /*向ESP8266(UART9)发送指令*/
  70.     R_SCI_UART_Write(&g_uart9_ctrl, (uint8_t *)cmd, strlen(cmd));
  71.   
  72.     /*AT指令发送完成标志*/
  73.     uart9_receive_flag = false;

  74. }


  75. /*设置ESP8266为 STA 模式*/
  76. void Esp8266_SetStationMode(void)
  77. {
  78.     Esp8266_AT_Send("AT+CWMODE=1\r\n");
  79.    
  80.     /*等待设置完成*/
  81.     while (!uart9_receive_flag)
  82.     {
  83.          if (strstr(At_Rx_Buff , "OK\r\n"))
  84.          {
  85.              LOG("\r\nESP8266 has been in Ststion Mode\r\n");
  86.              Clear_Buff();      //清除缓冲区数据
  87.          }   
  88.     }
  89. }


  90. /*设置ESP8266为 AP 模式*/
  91. void ESP8266_SetApMode(void)
  92. {
  93.       Esp8266_AT_Send ( "AT+CWMODE=2\r\n" );

  94.       /*等待设置完成*/
  95.       while ( !uart9_receive_flag )
  96.       {
  97.            if (strstr( At_Rx_Buff , "OK\r\n" ))
  98.            {
  99.            LOG("\r\nESP8266 has been in AP Mode\r\n");
  100.            Clear_Buff();      //清除缓冲区数据
  101.            }
  102.       }
  103. }


  104. /*设置ESP8266为 STA + AP 模式*/
  105. void Esp8266_SetStationAndApMode(void)
  106. {
  107.       Esp8266_AT_Send ( "AT+CWMODE=3\r\n" );

  108.       /*等待设置完成*/
  109.       while ( !uart9_receive_flag )
  110.       {
  111.            if (strstr( At_Rx_Buff , "OK\r\n" ))
  112.            {
  113.            LOG("\r\nESP8266 has been in AP+Station Mode\r\n");
  114.            Clear_Buff();      //清除缓冲区数据
  115.            }
  116.       }
  117. }


  118. /*ESP8266连接WiFi函数,timeout:期望最大连接时间*/
  119. void Esp8266_StationConnect(char * id ,  char * password , uint8_t timeout)
  120. {
  121.     char  JoinAP_AT[256];
  122.   
  123.     uint8_t i;
  124.   
  125.     sprintf( JoinAP_AT , "AT+CWJAP="%s","%s"\r\n" , id , password);
  126.   
  127.     Esp8266_AT_Send( JoinAP_AT );

  128.    /*判断连接是否设置成功,失败则打印错误信息*/
  129.    while ( !uart9_receive_flag )
  130.      {
  131.     for(i = 0; i <= timeout; i++)
  132.        {
  133.           if ( strstr( At_Rx_Buff , "OK\r\n" ) )
  134.            {
  135.                LOG("\r\nWifi Conncted\r\n");
  136.                Clear_Buff();      //清除缓冲区数据
  137.                break;
  138.            }
  139.           if ( strstr( At_Rx_Buff , "ERROR\r\n" ) ) //根据ESP8266的固件版本不同有不同的响应,一般为“FAIL”或“ERROR”
  140.            {
  141.                if( strstr( At_Rx_Buff , "+CWJAP:1\r\n" ))
  142.                LOG("\r\nWifi connect timeout\r\n");
  143.       
  144.                if( strstr( At_Rx_Buff , "+CWJAP:2\r\n" ))
  145.                LOG("\r\nWifi password error\r\n");
  146.       
  147.                if( strstr( At_Rx_Buff , "+CWJAP:3\r\n" ))
  148.                    LOG("\r\nNo target hotspot found\r\n");
  149.       
  150.                if( strstr( At_Rx_Buff , "+CWJAP:4\r\n" ))
  151.                LOG("\r\nWifi Connected Fail\r\n");
  152.       
  153.                while(1)
  154.                {
  155.                 Esp8266_ErrorAlarm();
  156.                }      //LED灯警告错误,红灯闪烁
  157.            }
  158.            if ( i == timeout )
  159.            {
  160.                LOG("\r\nWifi Connect Timeout\r\n");
  161.                while(1)
  162.                {
  163.                 Esp8266_ErrorAlarm();
  164.                }      //LED灯警告错误,红灯闪烁
  165.            }
  166.            R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS);
  167.         }
  168.       }
  169. }

  170. /*设置连接模式为单连接或者多连接*/
  171. void Esp8266_SetLinkMode(uint8_t mode)
  172. {
  173.       switch (mode)
  174.       {
  175.           case 0 :
  176.             Esp8266_AT_Send("AT+CIPMUX=0\r\n"); //设置为单连接模式,透传只有在单连接模式下才能进行
  177.             break;
  178.           case 1 :
  179.             Esp8266_AT_Send("AT+CIPMUX=1\r\n"); //设置为多连接模式,服务器只有在多连接模式下才能打开
  180.             break;
  181.       }
  182.   
  183.        /*等待设置完成*/
  184.       while ( !uart9_receive_flag )
  185.       {
  186.            if (strstr( At_Rx_Buff , "OK\r\n" ))
  187.            {
  188.                if( mode )
  189.                 LOG("\r\nESP8266 has been in Multi-connection Mode\r\n");
  190.                else
  191.                 LOG("\r\nESP8266 has been in Single-connection Mode\r\n");
  192.                 Clear_Buff();      //清除缓冲区数据
  193.            }
  194.       }
  195. }


  196. /*ESP8266连接服务器函数,timeout:期望最大连接时间*/
  197. void Esp8266_ServerConnect( char * server_id ,  char * port , uint8_t timeout )
  198. {
  199.     char  JoinServer_AT[256];
  200.   
  201.     uint8_t i;
  202.   
  203.     sprintf( JoinServer_AT , "AT+CIPSTART="TCP","%s",%s\r\n" , server_id , port );
  204.   
  205.     Esp8266_AT_Send( JoinServer_AT );
  206.   
  207.       /*判断连接是否设置成功,失败则打印错误信息*/
  208.       while ( !uart9_receive_flag )
  209.       {
  210.            for(i = 0; i <= timeout; i++)
  211.        {
  212.            if (strstr( At_Rx_Buff , "OK\r\n" ))
  213.            {
  214.                LOG("\r\nServer Connect Successfully\r\n");
  215.                Clear_Buff();      //清除缓冲区数据
  216.                break;
  217.            }
  218.            if (strstr( At_Rx_Buff , "ERROR\r\n" ))
  219.            {
  220.                LOG("\r\nServer Connect Failed\r\n");
  221.                while(1)
  222.                {
  223.                 Esp8266_ErrorAlarm();
  224.                }      //LED灯警告错误,红灯闪烁
  225.            }
  226.            if ( i == timeout )
  227.            {
  228.                LOG("\r\nServer Connect Timeout\r\n");
  229.                while(1)
  230.                {
  231.                 Esp8266_ErrorAlarm();
  232.                }      //LED灯警告错误,红灯循环闪烁
  233.            }
  234.            R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS);
  235.        }
  236.       }
  237. }


  238. /*设置ESP8266为透传模式*/
  239. void Esp8266_SetTransparentMode(void)
  240. {
  241.       Esp8266_AT_Send ( "AT+CIPMODE=1\r\n" );

  242.       /*等待设置完成*/
  243.       while ( !uart9_receive_flag )
  244.       {
  245.            if (strstr( At_Rx_Buff , "OK\r\n" ))
  246.            {
  247.            LOG("\r\nESP8266 has in Transparent Mode\r\n");
  248.            Clear_Buff();      //清除缓冲区数据
  249.            }
  250.       }
  251. }


  252. /*设置ESP8266为发送数据模式*/
  253. void Esp8266_SetSendData(void)
  254. {
  255.     Esp8266_AT_Send ( "AT+CIPSEND\r\n" );
  256.   
  257.     /*等待设置完成*/
  258.     while ( !uart9_receive_flag )
  259.     {
  260.          if (strstr( At_Rx_Buff , "OK\r\n" ))
  261.          {
  262.             LOG("\r\nESP8266 has been in Transparent Mode\r\n\r\n>");
  263.             uart9_show_flag = true;   
  264.             Clear_Buff();      //清除缓冲区数据
  265.          }
  266.     }  
  267. }


  268. /*Wifi串口回调函数*/
  269. void uart9_notification(uart_callback_args_t * p_args)
  270. {
  271.        switch(p_args->event)
  272.        {
  273.            case UART_EVENT_RX_CHAR:  
  274.       
  275.                 At_Rx_Buff[Uart9_Num++] = (uint8_t ) p_args->data;  //将UART9收到的数据放到Buff缓冲区中
  276.         
  277.                 /*进入透传模式后打开串口调试助手收发数据显示*/
  278.                 //if( uart9_show_flag )
  279.                 R_SCI_UART_Write(&g_uart4_ctrl, (uint8_t *)&(p_args->data), 1);
  280.         
  281.                 break;
  282.    
  283.            case UART_EVENT_TX_COMPLETE:
  284.            {
  285.                 uart9_receive_flag = true;      //ESP8266回应完成标志
  286.       
  287.                 break;
  288.            }
  289.            default:
  290.                break;
  291.        }
  292. }
复制代码



野火论坛202308192332552142..png
回复

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-2 14:55 , Processed in 0.056944 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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