Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
RTT升级 加netdev 相关问题
发布于 2019-04-22 10:05:13 浏览:2574
订阅该版
[tocm] # RTT升级 加netdev 相关问题 首先是更新 esp8266 的包, 出错 提示没有 netdev, 就去更新了内核,尤其是 直接使用了 ping 等 netutils 小工具。不过编译时出了一些问题。 ## 1. lwip 2.1.0 / 2.0 2 编译出错 ``` CC build\kernel\components\libc\time\posix_sleep.o CC build\kernel\components
et\lwip-2.1.0\src
etif\ethernetif.o CC build\kernel\components
et
etdev\src
etdev.o CC build\kernel\components
et
etdev\src
etdev_ipaddr.o CC build\kernel\components
et\sal_socket\dfs_net\dfs_net.o F:\Loongson-Smartloong-V3.0-RTT\components
et\lwip-2.1.0\src
etif\ethernetif.c: In function 'lwip_netdev_ping': F:\Loongson-Smartloong-V3.0-RTT\components
et\lwip-2.1.0\src
etif\ethernetif.c:211:45: error: 'IP_PROTO_ICMP' undeclared (first use in this function) if ((s = lwip_socket(AF_INET, SOCK_RAW, IP_PROTO_ICMP)) < 0) ^ F:\Loongson-Smartloong-V3.0-RTT\components
et\lwip-2.1.0\src
etif\ethernetif.c:211:45: note: each undeclared identifier is reported only once for each function it appears in scons: *** [build\kernel\components
et\lwip-2.1.0\src
etif\ethernetif.o] Error 1 scons: building terminated because of errors. ``` 如果修改成 lwip1.4.1, 则正常编译。 在 components
et\lwip-2.1.0\src
etif\ethernetif.c 中添加语句 ``` #include "lwip/ip.h" ``` 解决该问题。 ## 2. AT esp8266 中的问题 - **首先是 at_ping 的命令** 更换成了 **ping**. - 在配置好一切后,无线的网络和密码,自动初始化联网,发现无法 ping 通,打开调试信息和 raw 后,卡在以下位置: [查看卡住时的运行位置在AT+CIPMUX处](![at 调试成功.png](/uploads/201904/22/095728gbdsl7cqztqzqabc.png)) 在发送 ```AT+CIPSTA?```命令时,回复 的MAC地址为空,于是将 文件 at_socket_esp8266.c中的以下语句 ```sscanf(mac ......```注释: ``` /* set netdev info */ inet_aton(ip, &sal_ip_addr); netdev_low_level_set_ipaddr(netdev, &sal_ip_addr); inet_aton(gateway, &sal_ip_addr); netdev_low_level_set_gw(netdev, &sal_ip_addr); inet_aton(netmask, &sal_ip_addr); netdev_low_level_set_netmask(netdev, &sal_ip_addr); //sscanf(mac, "%x:%x:%x:%x:%x:%x", (rt_uint32_t *)&mac_addr[0], (rt_uint32_t *)&mac_addr[1], (rt_uint32_t *)&mac_addr[2], (rt_uint32_t *)&mac_addr[3], (rt_uint32_t *)&mac_addr[4], (rt_uint32_t *)&mac_addr[5]); memcpy(netdev->hwaddr, (const void *)mac_addr, netdev->hwaddr_len); ``` - 现在一切风平浪静了。 ## 3. at webclient 示例 将 tcpclient.c 适当修改,使用 at socket 去联网。 ``` #include
#include
#if !defined(SAL_USING_POSIX) #error "Please enable SAL_USING_POSIX!" #else #include
#include
#endif #include
/* 使用BSD socket,需要包含socket.h头文件 */ #include "netdb.h" #define DEBUG_TCP_CLIENT #define DBG_TAG "TCP" #ifdef DEBUG_TCP_CLIENT #define DBG_LVL DBG_LOG #else #define DBG_LVL DBG_INFO /* DBG_ERROR */ #endif #include
#define BUFSZ 1024 static int started = 0; static int is_running = 0; static char url[256]; static int port = 8080; static const char send_data[] = "This is TCP Client from RT-Thread."; /* 发送用到的数据 */ static void tcpclient(void *arg) { int ret; char *recv_data; int bytes_received; int sock = -1; struct hostent *host = RT_NULL; struct sockaddr_in server_addr; struct timeval timeout; fd_set readset; /* 通过函数入口参数url获得host地址(如果是域名,会做域名解析) */ host = gethostbyname(url); if (host == RT_NULL) { LOG_E("Get host by name failed!"); return; } /* 分配用于存放接收数据的缓冲 */ recv_data = rt_malloc(BUFSZ); if (recv_data == RT_NULL) { LOG_E("No memory"); return; } /* 创建一个socket,类型是SOCKET_STREAM,TCP类型 */ if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) { /* 创建socket失败 */ LOG_E("Create socket error"); goto __exit; } /* 初始化预连接的服务端地址 */ server_addr.sin_family = AF_INET; server_addr.sin_port = htons(port); server_addr.sin_addr = *((struct in_addr *)host->h_addr); rt_memset(&(server_addr.sin_zero), 0, sizeof(server_addr.sin_zero)); /* 连接到服务端 */ if (connect(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1) { /* 连接失败 */ LOG_E("Connect fail!"); goto __exit; } started = 1; is_running = 1; timeout.tv_sec = 3; timeout.tv_usec = 0; while (is_running) { FD_ZERO(&readset); FD_SET(sock, &readset); /* Wait for read */ if (select(sock + 1, &readset, RT_NULL, RT_NULL, &timeout) == 0) continue; /* 从sock连接中接收最大BUFSZ - 1字节数据 */ bytes_received = recv(sock, recv_data, BUFSZ - 1, 0); if (bytes_received < 0) { /* 接收失败,关闭这个连接 */ LOG_E("Received error, close the socket."); goto __exit; } else if (bytes_received == 0) { /* 打印recv函数返回值为0的警告信息 */ LOG_W("Received warning, recv function return 0."); continue; } else { /* 有接收到数据,把末端清零 */ recv_data[bytes_received] = '\0'; if (rt_strcmp(recv_data, "q") == 0 || rt_strcmp(recv_data, "Q") == 0) { /* 如果是首字母是q或Q,关闭这个连接 */ LOG_I("Got a 'q' or 'Q', close the socket."); goto __exit; } else { /* 在控制终端显示收到的数据 */ LOG_D("Received data = %s", recv_data); } } /* 发送数据到sock连接 */ ret = send(sock, send_data, rt_strlen(send_data), 0); if (ret < 0) { /* 接收失败,关闭这个连接 */ LOG_I("send error, close the socket."); goto __exit; } else if (ret == 0) { /* 打印send函数返回值为0的警告信息 */ LOG_W("Send warning, send function return 0."); } } __exit: if (recv_data) { rt_free(recv_data); recv_data = RT_NULL; } if (sock >= 0) { closesocket(sock); sock = -1; } started = 0; is_running = 0; return; } static void usage(void) { rt_kprintf("Usage: attcpclient -h
-p
"); rt_kprintf(" attcpclient --stop
"); rt_kprintf(" attcpclient --help
"); rt_kprintf("
"); rt_kprintf("Miscellaneous:
"); rt_kprintf(" -h Specify host address
"); rt_kprintf(" -p Specify the host port number
"); rt_kprintf(" --stop Stop tcpclient program
"); rt_kprintf(" --help Print help information
"); } static void at_tcp_client_test(int argc, char** argv) { rt_thread_t tid; if (argc == 1 || argc > 5) { LOG_I("Please check the command you entered!
"); goto __usage; } else { if (rt_strcmp(argv[1], "--help") == 0) { goto __usage; } else if (rt_strcmp(argv[1], "--stop") == 0) { is_running = 0; return; } else if (rt_strcmp(argv[1], "-h") == 0 && rt_strcmp(argv[3], "-p") == 0) { if (started) { LOG_I("The tcpclient has started!"); LOG_I("Please stop tcpclient firstly, by: tcpclient --stop"); return; } if (rt_strlen(argv[2]) > sizeof(url)) { LOG_E("The input url is too long, max %d bytes!", sizeof(url)); return; } rt_memset(url, 0x0, sizeof(url)); rt_strncpy(url, argv[2], rt_strlen(argv[2])); port = atoi(argv[4]); } else { goto __usage; } } tid = rt_thread_create("at_client", tcpclient, RT_NULL, 2048, RT_THREAD_PRIORITY_MAX/3, 10); if (tid != RT_NULL) { rt_thread_startup(tid); } return; __usage: usage(); } #ifdef RT_USING_FINSH MSH_CMD_EXPORT_ALIAS(at_tcp_client_test, attcpclient, Start a at tcp client. Help: attcpclient --help); #endif ``` 在 msh 中运行以下命令: ``` attcpclient -h 221.***.***.*** -p *** //联网 attcpclient --stop //断网 attcpclient --help //帮助 ``` 运行结果如下图: [at调试成功](![查看卡住时的运行位置在AT+CIPMUX处.png](/uploads/201904/22/095728tioifdyot88ys5bd.png))
查看更多
6
个回答
默认排序
按发布时间排序
flyboy
2019-04-22
Do my self();
楼主的调试功底还是很深的:D
sundm75
2019-04-22
这家伙很懒,什么也没写!
对了,根本就不用修改 tcpclient.c 文件, 可以直接使用的。 在env 中选中 tcp client 的 samples, 在 finsh 中直接用 tcpclient -h 192.168.1.23 -p 9000 就行。 192.168.1.23 为IP地址 9000 为端口号
Cheney_Chen
2019-04-22
这家伙很懒,什么也没写!
为什么 MAC 地址为空呀,是获取不到还是获取到了解析失败了? RAW 数据时怎么显示的呀
Cheney_Chen
2019-04-22
这家伙很懒,什么也没写!
这个可能是 mac_addr 定义的 uint8_t 类型,%x 解析出来的是 uint32_t 类型导致的问题,问题已经记下准备修复
Cheney_Chen
2019-04-23
这家伙很懒,什么也没写!
lwIP 和 esp8266 MAC 地址获取失败问题已修复,感谢楼主问题反馈 [https://github.com/RT-Thread-packages/at_device/pull/43](https://github.com/RT-Thread-packages/at_device/pull/43)
sundm75
2019-04-24
这家伙很懒,什么也没写!
修的好快,改的好快,2天没有看,就已经全好了,赞!!!
撰写答案
登录
注册新账号
关注者
0
被浏览
2.6k
关于作者
sundm75
这家伙很懒,什么也没写!
提问
2
回答
6
被采纳
0
关注TA
发私信
相关问题
1
有关动态模块加载的一篇论文
2
最近的调程序总结
3
晕掉了,这么久都不见layer2的踪影啊
4
继续K9ii的历程
5
[GUI相关] FreeType 2
6
[GUI相关]嵌入式系统中文输入法的设计
7
20081101 RT-Thread开发者聚会总结
8
嵌入式系统基础
9
linux2.4.19在at91rm9200 上的寄存器设置
10
[转]基于嵌入式Linux的通用触摸屏校准程序
推荐文章
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
使用RC522软件包驱动FM1722
2
常量数据类型和表达式陷阱分享
3
进行i2c驱动移植的经验总结
4
在VSCode中使用clang-format
5
我该如何使用这个微雪的WIFI400 WIFI-LPB-100在rtt里或者我该怎样为它开发驱动
热门标签
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在线升级
freemodbus
PWM
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1444
个答案
289
次被采纳
张世争
809
个答案
175
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
catcatbing
3
篇文章
5
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
Woshizhapuren
1
篇文章
5
次点赞
YZRD
1
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部