Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
网络学习营
【网络编程学习】+ Eric + rt1052野火mini- AT 网络编程与遇到...
发布于 2018-08-09 23:21:41 浏览:3121
订阅该版
[tocm] * 本帖最后由 EricYYG 于 2018-8-9 23:30 编辑 * 文本排版布局有些乱,可以看附件pdf较为清晰 ![rt1052野火mini- AT 网络编程与遇到的坑.pdf](/uploads/201808/09/232910qbcrtsffzkvfrjtq.attach)# 软件硬件准备 - rthtead源码最新 - 野火rt1052mini开发板 - esp8266模块 ![7.png](/uploads/201808/09/231516bkl2vw192n6nz29m.png) 7.png # muneconfig配置 ![3.png](/uploads/201808/09/231513p91neu1wipu9ucie.png) 3.png ![4.png](/uploads/201808/09/231513pa62ap770pa4a8o7.png) 4.png 配置完成后生成工程:scons --target=mdk5 -s 点击打开mkd工程 ![5.png](/uploads/201808/09/231603omhbxoxsh4uuvem5.png) 5.png ![6.png](/uploads/201808/09/231603aakwj364zb3ab6sz.png) 6.png # 命令行下使用AT指令测试模块是否正常连接 输入 at client 进入测试界面 在接着输入AT+GMR获取WiFi模块版本信息 ![8.png](/uploads/201808/09/231628v4hmffmssurraufs.png) 8.png 如上图:模块连接正常,指令发送成功 # 任务一:在开发板上运行起 RT-Thread,使能 AT 组件,能够通过 ESP8266 模块接入网络 1. menuconfig配置 AT 组件配置选项介绍如下: - Enable debug log output:开启调试日志; - Enable AT commands server:开启 AT 服务端 - Enable AT commands client:开启 AT 客户端; - Client device name:配置与 AT 模块通信用的串口; - The maximum length of client data accepted:配置 AT客户端单次接收数据最大长度; - Enable command‐line interface for AT commands:开启和关闭 AT CLI 模式 - Enable print RAW format AT command communication data: 开启收发数据实时打印功能。 ![9.png](/uploads/201808/09/231646miq213c8204242zu.png) 9.png SAL 配置选项介绍如下: - protocol stack implement:配置 SAL 支持的协议栈实现方式 - Enable BSD socket operated by file system API:开启标准 BSD socket - the number of protocol family:配置最多支持的协议栈的个数 ![10.png](/uploads/201808/09/231647x7ht7ux7u6wewuuk.png) 10.png 开启AT组件实现协议栈 选择对应的wifi模块ESP8266,填入相应的WiFi账号和密码 ![11.png](/uploads/201808/09/231713ubennd5njlvfbn51.png) 11.png 2. 编译运行查看结果 使用finsh命令at_ping百度看看,成功ping通证明模块初始化成功。 ![12.png](/uploads/201808/09/231713j2okqfh2hul22rz6.png) 12.png 3. 代码分析 URC数据列表,用于处理wifi模块主动下发相关信息,根据数据头尾,自动跑到相关的处理函数中 static struct at_urc urc_table[] = { {"SEND OK", "
", urc_send_func}, {"SEND FAIL", "
", urc_send_func}, {"Recv", "bytes
", urc_send_bfsz_func}, {"", ",CLOSED
", urc_close_func}, {"+IPD", ":", urc_recv_func}, {"busy p", "
", urc_busy_p_func}, {"busy s", "
", urc_busy_s_func}, {"WIFI CONNECTED", "
", urc_func}, {"WIFI DISCONNECT", "
", urc_func}, }; ESP8266初始化 /* AT client port initialization */ int at_client_port_init(void) { /* create current AT socket event */ at_socket_event = rt_event_create("at_sock_event", RT_IPC_FLAG_FIFO); if (!at_socket_event) { LOG_E("RT AT client port initialize failed! at_sock_event create failed!"); return -RT_ENOMEM; } /* create current AT socket lock */ at_event_lock = rt_mutex_create("at_event_lock", RT_IPC_FLAG_FIFO); if (!at_event_lock) { LOG_E("RT AT client port initialize failed! at_sock_lock create failed!"); rt_event_delete(at_socket_event); return -RT_ENOMEM; } /* register URC data execution function */ at_set_urc_table(urc_table, sizeof(urc_table) / sizeof(urc_table[0])); return RT_EOK; } # 任务二:能够通过 http client 组件从网络下载文件保存到开发板文件系统中 1. 背景介绍 HTTP 协议是互联网上应用最为广泛的一种网络协议,越来越多的应用程序需要直接通过 HTTP 协议来访问网络资源。webclient 是 RT-Thread 上实现的一个 HTTP 客户端,用来提供高效且功能丰富的 HTTP 客户端编程工具包。 2. 开启 WebClient 软件包 webclient 是一个 HTTP 协议的客户端工具 ,利用这个工具可以完成与 HTTP 服务器的通信。 ![14.png](/uploads/201808/09/231932ts7x9v56i7eveuse.png) 14.png 3. 编写代码,使用webclient下载文件 #include
/* 使用 HTTP 协议与服务器通信需要包含此头文件 */ #include
/* 使用BSD socket,需要包含socket.h头文件 */ #include
#define BUF_SZ 4096 //缓冲区大小 #define HTTP_CONNET_RETRY_MAX 100 //尝试重连最大次数 void http_client_download(void) { rt_uint8_t *ptr = RT_NULL; int length = 0, result, retry; int fd = -1; int offset; struct webclient_session *session = RT_NULL; char *download_url = "http://183.193.243.90:9012/www/rt-thread.txt"; //rt_thread_delay(RT_TICK_PER_SECOND * 10); /* 为结构体 webclient_session 分配空间 */ session = (struct webclient_session *)rt_calloc(1, sizeof(struct webclient_session)); if (!session) { rt_kprintf("No memory for session structure!
"); goto __exit; } /* 连接天气网站 */ rt_kprintf("Webclient connect URI(%s) .", download_url); for(retry = 0; retry < HTTP_CONNET_RETRY_MAX; retry++) { result = webclient_connect(session, download_url); if (result < 0) { rt_kprintf("."); rt_thread_delay(RT_TICK_PER_SECOND * 5); if(retry == (HTTP_CONNET_RETRY_MAX - 1)) { rt_kprintf("Webclient connect URI(%s) failed %d!
", download_url, retry); goto __exit; } } else { rt_kprintf("
"); break; } } /* 发送官方标准 header */ result = webclient_send_header(session, WEBCLIENT_GET, RT_NULL, RT_NULL); if (result < 0) { rt_kprintf("Webclient send header buffer failed return %d!", result); goto __exit; } /* 检查响应 */ if (webclient_handle_response(session)) { if (session->response != 200) { rt_kprintf("webclient handle response(%d) error!", session->response); goto __exit; } } fd = open("/rt-thread.txt", O_WRONLY | O_CREAT, 0); if (fd < 0) { /* 创建文件出错,返回 */ rt_kprintf("open file failed
"); goto __exit; } /* 分配用于存放接收数据的缓冲 */ ptr = rt_calloc(1, BUF_SZ); if(!ptr) { rt_kprintf("No memory for data receive buffer!
"); goto __exit; } /* 接受数据打印 */ rt_kprintf("download url: %s lenght: %d
", download_url, session->content_length); if(session->content_length == 0) { /* 如果服务端未给出数据内容长度,读取数据直到服务端关闭连接 */ while (1) { length = webclient_read(session, ptr, BUF_SZ); if (length > 0) { write(fd, ptr, length); ptr[length] = '\0'; rt_kprintf("%s", ptr); } else { rt_kprintf("
"); break; } } } else { for (offset = 0; offset < session->content_length; ) { /* 从连接读取数据 */ length = webclient_read(session, ptr, session->content_length - offset > BUF_SZ? BUF_SZ:session->content_length - offset); /* 写入到文件中 */ if (length > 0) { write(fd, ptr, length); ptr[length] = '\0'; rt_kprintf("%s", ptr); } else { rt_kprintf("
"); break; } /* 挪动偏移位置 */ offset += length; } } __exit: /* 关闭会话 */ if (session != RT_NULL) webclient_close(session); if (fd >= 0) close(fd); /* 释放缓冲区空间 */ if (ptr != RT_NULL) rt_free(ptr); } #ifdef FINSH_USING_MSH #include
MSH_CMD_EXPORT(http_client_download, Download file by webclient); #endif 下载成功: ![17.png](/uploads/201808/09/232032gnt1ewwocjbhjjjf.png) 17.png # 错误与解决办法 - 错误:Contents mismatch at: 6000000CH (Flash=01H Required=03H) ! ![1.png](/uploads/201808/09/232044iz4n47n4hy9cyyny.png) 1.png 原因:没有选择对应的开发板 解决:选择对应的开发版 ![2.png](/uploads/201808/09/232045js2za8c20w079878.png) 2.png - 错误:[E/AT] The client porting initialize for AT client is not implement. 原因:提示你at client 还没有自行移植初始化 解决:自行初始化本函数 - 错误: [E/AT] socket (0) send failed, wait connect result timeout. ![22.png](/uploads/201808/09/232118k5essl3lx93xx3i3.png) 22.png 原因:未知 解决:关闭RAW调试 ![19.png](/uploads/201808/09/232117v0k00u04unkjuk1i.png) 19.png - 错误:无法下载文件,提示许多异常 ![15.png](/uploads/201808/09/232117vno63xopppoqgpo3.png) 15.png 原因:未知 解决:更新rtthread源码 + pkgs --upgrade + pkgs --update + 关闭RAW调试 ![13.png](https://oss-club.rt-thread.org/uploads/201808/09/231714oxiwborscb39vx4i.png)
查看更多
2
个回答
默认排序
按发布时间排序
armink
2018-08-10
这家伙很懒,什么也没写!
开启 RAW 命令调试,要记得把调试串口的波特率提高,比如:921600,保证不会影响到 AT 串口的接收时序。 你的最后一个问题,得配合 RAW 日志分析
EricYYG
2018-08-11
这家伙很懒,什么也没写!
>开启 RAW 命令调试,要记得把调试串口的波特率提高,比如:921600,保证不会影响到 AT 串口的接收时序。 > > ... --- thank you,问题解决了 [md]``` int imxrt_hw_uart_init(void) { struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; #ifdef AT_PRINT_RAW_CMD struct serial_configure RAW_uart_config = {\ BAUD_RATE_921600, /* 921600 bits/s */ \ DATA_BITS_8, /* 8 databits */ \ STOP_BITS_1, /* 1 stopbit */ \ PARITY_NONE, /* No parity */ \ BIT_ORDER_LSB, /* LSB first sent */ \ NRZ_NORMAL, /* Normal mode */ \ RT_SERIAL_RB_BUFSZ, /* Buffer size */ \ 0 \ }; #endif int i; /* Configure UART divider to default */ CLOCK_SetMux(kCLOCK_UartMux, 0); /* Set UART source to PLL3 80M */ CLOCK_SetDiv(kCLOCK_UartDiv, 0); /* Set UART divider to 1 */ for (i = 0; i < sizeof(uarts) / sizeof(uarts[0]); i++) { uarts[i].serial->ops = &imxrt_uart_ops; #ifdef AT_PRINT_RAW_CMD if(rt_strcmp(uarts[i].device_name, RT_CONSOLE_DEVICE_NAME) == 0) uarts[i].serial->config = RAW_uart_config; else #endif uarts[i].serial->config = config; /* register UART device */ rt_hw_serial_register(uarts[i].serial, uarts[i].device_name, RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX, (void *)&uarts[i]); } return 0; } ```[/md]
撰写答案
登录
注册新账号
关注者
0
被浏览
3.1k
关于作者
EricYYG
这家伙很懒,什么也没写!
提问
13
回答
9
被采纳
0
关注TA
发私信
相关问题
1
【LWIP学习营】第一关开发环境搭建
2
LWIP学习营第一周入门移植问题汇总贴
3
【LWIP学习营】f407+lan8720A小结
4
【LwIP学习营】【第一周】仅零散记录,无主题
5
【LWIP学习营】正点原子探索者F407+LAN8720第一周小结
6
【LwIP学习营】【第一周】网络通信基础及实现TCP 聊天客户端
7
【LwIP学习营】【第一周】LWIP移植
8
【LwIP学习营】【第一周】LWIP移植
9
【LwIP学习营】【第一周】开发板适配
10
【LwIP学习营】【第一周】环境搭建和配置验证
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
组件 lwip v2.0.3 版本使用 netdev网卡的 ping 功能
2
简单两步配置RTT源码阅读环境 vsc+clangd
3
恩智浦[FRDM-MCXN947]初探 之 ADC与DAC
4
LVGL使用字库IC芯片显示中文
5
基于STM32H750和Rt-Thread的CANFD通信实现的记录(一)
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
线程
RT-Thread Nano
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
SFUD
msh
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1443
个答案
289
次被采纳
张世争
807
个答案
174
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
4
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
1
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部