TA的每日心情 | 开心 2018-6-21 08:39 |
---|
签到天数: 8 天 连续签到: 2 天 [LV.3]偶尔看看II
|
本帖最后由 jasonwangse 于 2018-9-2 21:39 编辑
之前文章链接
kyLinMini学习笔记:5. NET代码学习之task
kyLinMini学习笔记:4. NET代码学习之one net
kyLinMini学习笔记:3. NET代码学习之net device
kyLinMini学习笔记:2. uCOS-III移植和调试
kyLinMini学习笔记:1. 开箱验板和资料学习
通过这几天代码的分析和试验,我发现如果想实现计划中的通过云平台做ISP升级,还真不是一件容易的事情,我当初把它想简单了。因为OneNET平台通过EDP协议向设备发送信息的途径,我只找到了通过“命令请求”这一消息类型发送的途径,也就是OneNET平台上的这个界面
目前的SDK中只有能LED灯的命令,在kyLinMini收到命令后就会有如下打印,并点亮或熄灭相应的LED灯,具体命令解析的函数可以参考函数OneNet_RevPro
论坛里的网友@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的返回再回显到调试串口上。- CPU_INT32U f_cmdsh_at (CPU_INT32U argc, CPU_INT08U *argv[])
- {
- CPU_INT08U *cmd;
- if (argc == 2) {
- cmd = argv[1];
- Mem_Clr(AppATBufTx, 64);
- sprintf((char *)AppATBufTx, "%s\r\n", cmd);
- BSP_USART_BufRxStartup(AppATBufRx, 512);
- BSP_USART_BufTxStartup(AppATBufTx, Str_Len((const CPU_CHAR *)AppATBufTx));
- } else {
- cmdshPutSyntax(argv, " <addr>");
- }
- return 1;
- }
复制代码- void AppATTask (void *p_arg)
- {
- (void)p_arg;
- BSP_USART_BufInit();
- while (DEF_TRUE) {
- BSP_USART_BufRxWait(); /* Wait for signal from idle interrupt */
- printf("\n\rlen: %d\n\rrcv: %s\n\r",
- Str_Len((const CPU_CHAR *)AppATBufRx),
- AppATBufRx); /* Echo-back */
- BSP_USART_BufRxStop();
- Mem_Clr(AppATBufRx, 512);
- }
- }
复制代码 CPU和ESP8266通信的串口驱动里,收发可选DMA或是普通的串口中断;回显方式可选发送命令后500ms定时回显,还是idle中断触发回显。- void BSP_USART_BufTxStartup (const void *tx_buf, size_t nwords)
- {
- const CPU_INT08U *p_buf = tx_buf;
- #ifndef BSP_USART_DMA
- BSP_USART_DEV *usart_dev = &BSP_USART_Dev[BSP_USART_COM2];
- if (p_buf == (CPU_INT08U *)0) {
- return;
- }
- while ((*p_buf) != (CPU_CHAR )0) {
- BSP_USART_WrByteUnlocked(usart_dev, *p_buf++);
- }
- #else
- BSP_USART_DmaTxSetup(p_buf, nwords);
- BSP_USART_DmaTxStartup();
- #endif
- }
- void BSP_USART_BufRxStartup (void *rx_buf, size_t nwords)
- {
- CPU_REG32 RxData;
- #ifndef BSP_USART_IDLE_INT
- OS_ERR err;
- #endif
- USART_GetFlagStatus(USART2, (USART_FLAG_IDLE | USART_FLAG_ORE |
- USART_FLAG_NE | USART_FLAG_FE |
- USART_FLAG_PE));
- RxData = USART_ReceiveData(USART2) & 0xFF; /* Clear the USART2 error interrupt. */
- #ifndef BSP_USART_DMA
- BSP_USART_RxPtr = 0;
- BSP_USART_RxBuf = rx_buf;
- BSP_USART_RxSize = nwords;
- #else
- BSP_USART_DmaRxSetup(rx_buf, nwords);
- #endif
- USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
- #ifndef BSP_USART_IDLE_INT
- OSTmrStart(&BSP_USART_RxRdyTmr, &err);
- #endif
- return;
- }
- void BSP_USART_BufTxStop (void)
- {
- #ifndef BSP_USART_DMA
- USART_ITConfig(USART2, USART_IT_TC, DISABLE);
- #else
- DMA_Cmd(DMA1_Channel7, DISABLE);
- #endif
- return;
- }
- void BSP_USART_BufRxStop (void)
- {
- USART_ITConfig(USART2, USART_IT_IDLE, DISABLE);
- #ifndef BSP_USART_DMA
- USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);
- BSP_USART_RxPtr = 0;
- #else
- DMA_Cmd(DMA1_Channel6, DISABLE);
- #endif
- return;
- }
- void BSP_USART_BufTxWait (void)
- {
- BSP_OS_SemWait(&SemUsartTxWait, 0);
- }
- void BSP_USART_BufRxWait (void)
- {
- BSP_OS_SemWait(&SemUsartRxWait, 0);
- }
复制代码 试验的几条命令回显如下
AT+GMR:Checks Version Information
AT+CWMODE=3:Set WiFi mode
AT+CWJAP="SSID","password":Connect to a router
AT+CIFSR:Query the ESP8266 device's IP address
需要注意的一点是,向ESP8266发送复位命令后,其先返回OK,之后串口会有idle信号,然后ESP8266的启动信息也会通过串口发送出来,所以如果用idle中断触发回显,就只有响应命令的OK信息;但如果使用定时回显,就会把ESP8266的启动信息也回显出来,有400多字节(从启动信息也能看到kyLinMini上ESP8266模块中的配置和firmware信息)
AT+RST:Restarts the Module
后面的开发如果有进一步的进展,我会继续更新学习笔记
|
|