OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3177|回复: 8

索者stm32f407+lwip1.4.1+tftp,stm32做server,client请求下载文件,stm32无法发送出数据

[复制链接]

1

主题

6

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2019-9-26
在线时间
7 小时
发表于 2022-6-9 08:58:35 | 显示全部楼层 |阅读模式
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

592

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1458
金钱
1458
注册时间
2019-7-28
在线时间
137 小时
发表于 2022-6-9 15:46:54 | 显示全部楼层
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2019-9-26
在线时间
7 小时
 楼主| 发表于 2022-6-9 16:12:43 | 显示全部楼层
为什么我写了那么多,没有显示。哎。重新贴上来。
最近几天一直被一个问题困扰,自己能想到的办法都试了,网上也没有搜到解决办法,只得发帖求助。
1、问题概括:stm32做server,PC做client,用tftpd32请求下载文件,stm32无法发送出数据
2、硬件:探索者stm32f407+LAN8720;lwip库版本:1.4.1
3、问题详细描述:
原意为用tftpd32直接从开发板上下载文件,避免自己写上位机的麻烦。那么就需要开发板上的stm32作为服务端,PC作为客户端,用tftpd32去下载文件。
刚好手上有探索者stm32f407+lan8720开发板,看到有udp例程“网络实验3 RAW_UDP实验”,就在这个例程的基础上增加了tftp功能,增加后编写有几处错误,原因是:我使用的lwip为版本较早,而tftp_server.c版本不一致,有些宏定义有区别。经过修改,成功编写,我这里列举下修改的地方:
1)头文件:

//#include "lwip/timeouts.h"("//"后面的为原语句。下同。)
#include "lwip/timers.h"
2)close_handle函数内部语句:

//ip_addr_set_any(0, &tftp_state.addr);
    ip_addr_set_any(&tftp_state.addr);
3)send_error函数名:
//send_error(const ip_addr_t *addr, u16_t port, enum tftp_error code, const char *str)
send_error(ip_addr_t *addr, u16_t port, enum tftp_error code, const char *str)
3)recv函数名:
//recv(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr, u16_t port)
recv(void *arg, struct udp_pcb *upcb, struct pbuf *p, ip_addr_t *addr, u16_t port)
4)recv函数内部语句:
  //if (((tftp_state.port != 0) && (port != tftp_state.port)) ||
   //   (!ip_addr_isany(tftp_state.addr) && !ip_addr_cmp(&tftp_state.addr, addr)))
  if (((tftp_state.port != 0) && (port != tftp_state.port)) ||
   (!ip_addr_isany(&tftp_state.addr) && !ip_addr_cmp(&tftp_state.addr, addr)))

5)tftp_init函数内部语句:
  //struct udp_pcb *pcb = udp_new_ip_type(IPADDR_TYPE_ANY);
    struct udp_pcb *pcb = udp_new();
6)tftp_init函数内部语句:
  //ret = udp_bind(pcb, IP_ANY_TYPE, TFTP_PORT);
  ret = udp_bind(pcb, IP_ADDR_ANY, TFTP_PORT);
以上语句我经过对比,应该不会导致目前的结果,不过我还是要贴出来,万一是这些地方的原因呢!
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2019-9-26
在线时间
7 小时
 楼主| 发表于 2022-6-9 16:25:23 | 显示全部楼层
增加fatfs和sd卡功能,重新编译下载,开始测试。
设置好tftpd32的ip、端口、文件,文件名:f.txt,我在sd卡里创建同文件名,随便写了一些内容。
上电,串口初始化信息:
////////////////////////////////////
SD found
Fatfs init success
Total Size:3832MB
Free Size:3831MB


[2022-06-09 16:16:25.165]# RECV ASCII>
网卡en的MAC地址为:................2.0.0.37.0.45
静态IP地址........................192.168.1.30
子网掩码..........................255.255.255.0
默认网关..........................192.168.1.1
netif_set_default
lwip_netif:200014d4
LWIP Init Success!


[2022-06-09 16:16:26.154]# RECV ASCII>
Local IP:192.168.1.30
Remote IP:192.168.1.100
Remote Port:69
tftp init success
///////////////////////////////////////
点击tftpd32的get按钮,显示等待block #0,显示内容是已经把文件打开,并读取到数据,而且经过调试发现已运行到low-level_output-->ETH_Tx_Packet,wireshark抓包没有返回数据,串口打印信息如下,
//////////////////////////////////////
fname : f.txt?
name : 0:/f.txt
mode  : octet
write : 0
sd rd error:0
f_open ret: 0
read bytes: 512
ack count: 512
ack buf: 01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2019-9-26
在线时间
7 小时
 楼主| 发表于 2022-6-9 16:27:06 | 显示全部楼层
回帖也有字数限制,啊呀。继续。
ret: 512
payload: 01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2019-9-26
在线时间
7 小时
 楼主| 发表于 2022-6-9 16:30:05 | 显示全部楼层
但是如果开发板没有sd卡,tftd32可以接收到:servers stops the transfer error #1 unable to open requested file。wireshark可以抓包到返回信息。
这就说明硬件没有问题,可以将数据发送出去。但就是发送的文件数据没有发出去,我对比了发送数据和发送错误的函数,有差异,但是没有找到原因。
请大神们帮忙分析下。
回复

使用道具 举报

2

主题

592

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1458
金钱
1458
注册时间
2019-7-28
在线时间
137 小时
发表于 2022-6-11 18:24:31 | 显示全部楼层
帮顶               
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2019-9-26
在线时间
7 小时
 楼主| 发表于 2022-6-15 08:13:42 | 显示全部楼层
这么多天过去了,没有大神帮忙看下啊
回复

使用道具 举报

1

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
237
金钱
237
注册时间
2020-7-3
在线时间
48 小时
发表于 2022-10-27 18:59:50 | 显示全部楼层
楼主,问题解决了吗?可否发一下源码,我最近也在做类似工作
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 15:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表