新手入门
- 积分
- 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);
以上语句我经过对比,应该不会导致目前的结果,不过我还是要贴出来,万一是这些地方的原因呢!
|
|