Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
stm32F4
tcpclient
20
stm32 tcpclient 网线直连问题
发布于 2021-11-02 11:18:51 浏览:1418
订阅该版
板载芯片为STM32F429VGT6,网络芯片为DP83848,程序为BSP中的TcpClient。目前的现象是:单片机做客户端,PC端做服务端,中间使用一个路由器能进行连接。将PC端的DHCP关闭,输入和单片机同一网段的ip,用网线直连,无法连接。 tcpclient的代码如下: ```c void tcpclient(int argc, char **argv) { if (argc < 3) { rt_kprintf("Usage: tcpclient URL PORT\n"); rt_kprintf("Like: tcpclient 192.168.12.44 5000\n"); return ; } url = argv[1]; //获取服务器地址 port = strtoul(argv[2], 0, 10); //获取端口号 /* 通过函数入口参数url获得host地址(如果是域名,会做域名解析) */ host = gethostbyname(url); /* 分配用于存放接收数据的缓冲 */ recv_data = rt_malloc(BUFSZ); if (recv_data == RT_NULL) { rt_kprintf("No memory\n"); return; } /* 创建一个socket,类型是SOCKET_STREAM,TCP类型 */ if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) { /* 创建socket失败 */ rt_kprintf("Socket error\n"); /* 释放接收缓冲 */ rt_free(recv_data); return; } /* 初始化预连接的服务端地址 */ 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)); /* 连接到服务端 */ while (connect(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) != 0) { /* 连接失败 */ rt_kprintf("Connect fail!\n"); closesocket(sock); rt_thread_delay(10); /*释放接收缓冲 */ rt_free(recv_data); return; } /* 连接成功 */ rt_kprintf("Connect successful\n"); ret = send(sock, version_number, sizeof(version_number), 0); //连接成功时,发送版本号 while (1) { /* 从sock连接中接收最大BUFSZ - 1字节数据 */ bytes_received = recv(sock, recv_data, BUFSZ - 1, 0); if (bytes_received < 0) { /* 接收失败,关闭这个连接 */ closesocket(sock); rt_kprintf("\nreceived error,close the socket.\r\n"); /* 释放接收缓冲 */ rt_free(recv_data); break; } else if (bytes_received == 0) { /* 默认 recv 为阻塞模式,此时收到0认为连接出错,关闭这个连接 */ closesocket(sock); rt_kprintf("\nreceived error,close the socket.\r\n"); /* 释放接收缓冲 */ rt_free(recv_data); break; } /* 有接收到数据,把末端清零 */ recv_data[bytes_received] = '\0'; if (ret < 0) { /* 发送失败,关闭这个连接 */ closesocket(sock); rt_kprintf("\nsend error,close the socket.\r\n"); break; } else if (ret == 0) { /* 打印send函数返回值为0的警告信息 */ rt_kprintf("\n Send warning,send function return 0.\r\n"); } datasize=bytes_received; //传输数据字节大小 rt_mq_send(cmd_mq,recv_data,bytes_received); //发送消息队列 } return; } ``` 函数传入的形参为 ```c char *para[] = {"tcpclient","192.168.3.9","5000"}; // 客户端/服务端 ip地址、端口号 ``` 在rtconfig.h中设置板载静态ip: ```c #define RT_LWIP_IPADDR "192.168.3.6" #define RT_LWIP_GWADDR "192.168.3.1" #define RT_LWIP_MSKADDR "255.255.255.0" ``` 在PC端的设置如下: ![image.png](https://oss-club.rt-thread.org/uploads/20211102/fe10b47aee31b6666892c62982a261ca.png) 使用网络调试助手开启TCP服务端 ![image.png](https://oss-club.rt-thread.org/uploads/20211102/72d8f85f1f00cd81a33fca33419ffe68.png) 使用网线直连的情况下,无法进行连接。 但如果加一个路由器的情况下,发现能连接上,如下图 ![image.png](https://oss-club.rt-thread.org/uploads/20211102/72544af19aeb5fd05ea9e497e81fdd94.png) 但是发现 板载的ip并非rtconfig中设置的静态ip,被路由器自动分配了一个地址为192.168.3.8 想问问有没有懂这方面的朋友,是不是我的程序中缺少什么步骤,还请麻烦指导指导,谢谢。
查看更多
小小李sunny
2021-11-02
这家伙很懒,什么也没写!
1.你要把板子的DHCP关掉,这样设置静态IP才会有效,否则板子还是通过路由器来自动分配IP。当板子和PC都是静态IP时,且设置为同一网段,这样直接用网线连接是可以的; 2.板子是自动获取IP,而PC是静态IP,板子和PC用网线直连,板子是没有IP的,因此无法连接; 3.板子和PC都启动DHCP模式,并且接入路由器,这样都由路由器来分配IP,因此可以正常连接;
4
个回答
默认排序
按发布时间排序
aozima
2021-11-02
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
- ifconfig //板了 - ipconfig //PC - PC ping 板子 - 板子 ping PC - netstat - PC防炎墙
出出啊
2021-11-02
恃人不如自恃,人之为己者不如己之自为也
1. 关掉板子上的 DHCP 。电脑上是不是dhcp影响不大。 2. 连上路由器,查看板子的网卡状态,能否开启,是否配置的静态ip。 然后就和 pc 互ping,互ping的结果贴出来
SummerLee
2022-04-12
I have seen the world;Done it all.
你这个问题解决了吗 我使用host = (struct hostent *) gethostbyname(url);对域名进行解析 用网线直连 MCU发送不了数据 用host = (struct hostent *) url;抓包发现目标IP是0.0.0.0
撰写答案
登录
注册新账号
关注者
0
被浏览
1.4k
关于作者
_dyx_越过山丘
这家伙很懒,什么也没写!
提问
7
回答
3
被采纳
0
关注TA
发私信
相关问题
1
编译stm32F407动态模块报错
2
RTT-STUDIO STM32F4 如何配置 开启FPU功能
3
STM32F405RG CAN1发送波特率设置
4
STM32F401RC 用 RT-Thread Studio 烧写不了程序
5
为什么单片机STM32F405RG只能成功烧录一次?
6
rt-thread studio生成的程序写入stm32f405rg无法运行
7
MCU探索版+RT_Thread+Webnet的疑问
8
STM32F407VG启动硬件定时器系统忙类死机
9
STM32F4的虚拟串口 的USB时钟如何配置
10
stm32客户端TCP Client连接不上pc端的TCP Server
推荐文章
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
【RT-Thread】【ci】【scons】将ci.attachconfig.yml和scons结合使用
2
Rt-thread中OTA下载后,bootloader不搬程序
3
ulog 日志 LOG_HEX 输出时间改为本地日期时间
4
在RT-Thread Studio中构建前执行python命令
5
研究一了一段时间RTT,直接标准版上手太难,想用nano,但又舍不得组件
热门标签
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
I2C_IIC
ESP8266
UART
WIZnet_W5500
ota在线升级
PWM
cubemx
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
xusiwei1236
8
个答案
2
次被采纳
踩姑娘的小蘑菇
1
个答案
2
次被采纳
用户名由3_15位
7
个答案
1
次被采纳
bernard
4
个答案
1
次被采纳
张世争
1
个答案
1
次被采纳
本月文章贡献
聚散无由
2
篇文章
15
次点赞
catcatbing
2
篇文章
5
次点赞
Wade
2
篇文章
2
次点赞
Ghost_Girls
1
篇文章
6
次点赞
YZRD
1
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部