查看: 112|回复: 0

[中移One NET] kyLinMini学习笔记:6. 搭建ESP8266 AT命令调试界面

[复制链接]

5

主题

1

好友

115

积分

童生

Rank: 2

  • TA的每日心情
    开心
    2017-8-23 08:39
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2017-9-14 12:19:35 |显示全部楼层
    通过这几天代码的分析和试验,我发现如果想实现计划中的通过云平台做ISP升级,还真不是一件容易的事情,我当初把它想简单了。因为OneNET平台通过EDP协议向设备发送信息的途径,我只找到了通过“命令请求”这一消息类型发送的途径,也就是OneNET平台上的这个界面
    cmd-ui.jpg

    目前的SDK中只有能LED灯的命令,在kyLinMini收到命令后就会有如下打印,并点亮或熄灭相应的LED灯,具体命令解析的函数可以参考函数OneNet_RevPro
    cmd-led.jpg

    论坛里的网友@mabo124 在他的文章"EDP方式操作LED灯"里,对发送命令的具体格式和效果有很详细的描述,感兴趣的同学可以移步那篇文章

    而升级需要通过ESP8266发送二进制的image包;由于还不了解网页应用的开发,所以如果基于目前的EDP协议,我感觉只有通过转发(透传)格式的数据包才能由一个设备将image包发给另一个设备了,奈何只有一个ESP8266,又没有大容量存储设备。所以我想还是通过PC上的FTP或者tftp server,在ESP8266上实现client来获取iamge比较靠谱。
    如果要使用ESP8266做网络应用,首先得熟悉它的AT命令与返回结果,但是SDK中的代码都是调好的,并针对OneNET做了相应的适配,而且没有FTP和tftp的应用。所以我先做了一个简单的ESP8266的AT命令调试功能,即用调试串口做一个最简单的command shell,在串口中输入命令后,cpu执行相应的函数向ESP8266发送AT命令,然后把ESP8266的返回再回显到调试串口上
    1. CPU_INT32U f_cmdsh_at (CPU_INT32U argc, CPU_INT08U *argv[])
    2. {
    3.     CPU_INT08U *cmd;

    4.     if (argc == 2) {
    5.         cmd = argv[1];
    6.         Mem_Clr(AppATBufTx, 64);
    7.         sprintf((char *)AppATBufTx, "%s\r\n", cmd);
    8.         BSP_USART_BufRxStartup(AppATBufRx, 512);
    9.         BSP_USART_BufTxStartup(AppATBufTx, Str_Len((const CPU_CHAR *)AppATBufTx));
    10.     } else {
    11.         cmdshPutSyntax(argv, " <addr>");
    12.     }
    13.     return 1;
    14. }
    复制代码
    1. void  AppATTask (void *p_arg)
    2. {
    3.     (void)p_arg;

    4.     BSP_USART_BufInit();

    5.     while (DEF_TRUE) {
    6.         BSP_USART_BufRxWait();                                  /* Wait for signal from idle interrupt                  */
    7.         printf("\n\rlen: %d\n\rrcv: %s\n\r",
    8.                Str_Len((const CPU_CHAR *)AppATBufRx),
    9.                AppATBufRx);                                     /* Echo-back                                            */
    10.         BSP_USART_BufRxStop();
    11.         Mem_Clr(AppATBufRx, 512);
    12.     }
    13. }
    复制代码
    CPU和ESP8266通信的串口驱动里,收发可选DMA或是普通的串口中断;回显方式可选发送命令后500ms定时回显,还是idle中断触发回显。
    1. void  BSP_USART_BufTxStartup (const void *tx_buf, size_t nwords)
    2. {
    3.     const CPU_INT08U *p_buf = tx_buf;
    4. #ifndef BSP_USART_DMA
    5.     BSP_USART_DEV   *usart_dev = &BSP_USART_Dev[BSP_USART_COM2];

    6.     if (p_buf == (CPU_INT08U *)0) {
    7.         return;
    8.     }

    9.     while ((*p_buf) != (CPU_CHAR )0) {
    10.         BSP_USART_WrByteUnlocked(usart_dev, *p_buf++);
    11.     }
    12. #else
    13.     BSP_USART_DmaTxSetup(p_buf, nwords);
    14.     BSP_USART_DmaTxStartup();
    15. #endif
    16. }

    17. void  BSP_USART_BufRxStartup (void *rx_buf, size_t nwords)
    18. {
    19.     CPU_REG32  RxData;
    20. #ifndef BSP_USART_IDLE_INT
    21.     OS_ERR        err;
    22. #endif

    23.     USART_GetFlagStatus(USART2, (USART_FLAG_IDLE | USART_FLAG_ORE |
    24.                                  USART_FLAG_NE | USART_FLAG_FE |
    25.                                  USART_FLAG_PE));
    26.     RxData = USART_ReceiveData(USART2) & 0xFF;                          /* Clear the USART2 error interrupt.                */
    27. #ifndef BSP_USART_DMA
    28.     BSP_USART_RxPtr = 0;
    29.     BSP_USART_RxBuf = rx_buf;
    30.     BSP_USART_RxSize = nwords;
    31. #else
    32.     BSP_USART_DmaRxSetup(rx_buf, nwords);
    33. #endif
    34.     USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
    35. #ifndef BSP_USART_IDLE_INT
    36.     OSTmrStart(&BSP_USART_RxRdyTmr, &err);
    37. #endif
    38.     return;
    39. }

    40. void  BSP_USART_BufTxStop (void)
    41. {
    42. #ifndef BSP_USART_DMA
    43.     USART_ITConfig(USART2, USART_IT_TC, DISABLE);
    44. #else
    45.     DMA_Cmd(DMA1_Channel7, DISABLE);
    46. #endif
    47.     return;
    48. }

    49. void  BSP_USART_BufRxStop (void)
    50. {
    51.     USART_ITConfig(USART2, USART_IT_IDLE, DISABLE);
    52. #ifndef BSP_USART_DMA
    53.     USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);
    54.     BSP_USART_RxPtr = 0;
    55. #else
    56.     DMA_Cmd(DMA1_Channel6, DISABLE);
    57. #endif
    58.     return;
    59. }

    60. void  BSP_USART_BufTxWait (void)
    61. {
    62.     BSP_OS_SemWait(&SemUsartTxWait, 0);
    63. }

    64. void  BSP_USART_BufRxWait (void)
    65. {
    66.     BSP_OS_SemWait(&SemUsartRxWait, 0);
    67. }
    复制代码
    试验的几条命令回显如下
    AT+GMR:Checks Version Information
    AT GMR.jpg

    AT+CWMODE=3:Set WiFi mode
    AT CWMODE.jpg

    AT+CWJAP="SSID","password":Connect to a router
    AT CWJAP.jpg

    AT+CIFSR:Query the ESP8266 device's IP address
    AT CIFSR.jpg


    需要注意的一点是,向ESP8266发送复位命令后,其先返回OK,之后串口会有idle信号,然后ESP8266的启动信息也会通过串口发送出来,所以如果用idle中断触发回显,就只有响应命令的OK信息;但如果使用定时回显,就会把ESP8266的启动信息也回显出来,有400多字节(从启动信息也能看到kyLinMini上ESP8266模块中的配置和firmware信息
    AT+RST:Restarts the Module
    AT RST.jpg

    后面的开发如果有进一步的进展,我会继续更新学习笔记

    回复

    使用道具 举报

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

    关闭

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

    手机版|爱板网 |网站地图  

    GMT+8, 2017-9-24 02:20 , Processed in 0.137337 second(s), 11 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部