硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1977|回复: 20
收起左侧

[LwIP] [求助]RTOS+lwip协议生成FTP服务器,文件上传错误但下载正确的问题

[复制链接]

2

主题

12

回帖

18

积分

新手上路

积分
18
发表于 2024-11-5 00:45:43 | 显示全部楼层 |阅读模式
       本人在项目开发时需要使用FTP服务器远程上传BIN文件到SD卡,再使用BIN文件进行在线升级,目前的情况是,在将bin文件通过fileZilla或者FlashXP5以二进制上传到SD卡后,无论是直接下载还是用读卡器,发现文件的开始总是被写入00 00,2字节的空字符,而FTP服务器为了大小一致,又将我bin文件的某个部分删除了2字节。导致我在读bin文件时预先处理两字节也无法升级(因为此时bin文件内部已经被修改)。SD卡格式化为fat32,写入文件也没有问题。请问各位大牛,这种情况该怎么解决???
附:本人使用STM32F429IGTx,lwip是基于cube生成,从FTP中连续下载256MB数据文件4个均无损坏问题。本人使用的ftpd代码是基于CSDN【在STM32单片机上用1700行代码实现基于LwIP 2.1.2协议栈raw API和FatFs文件系统的FTP服务器】【程序】在STM32单片机上用1700行代码实现基于LwIP 2.1.2协议栈raw API和FatFs文件系统的FTP服务器(20200703版)_lwip ftp-CSDN博客
下面是我的上传文件和源文件对比

图1

图2
上传下载的文件大小一致,甚至字节数都一致
目前我觉得问题可能出现在:
1.ftpd的堆栈大小,因为上传下载一个小于512字节的bin文件不会出现这种情况
2.ftpd.c源代码293行函数中f_write的问题,但暂时不知道那里有问题
回复

使用道具 举报

2

主题

12

回帖

18

积分

新手上路

积分
18
 楼主| 发表于 2024-11-5 00:47:59 | 显示全部楼层
附上我的文件上传下载对比图,左边是上传前的,右边是上传后的
1.png
2.png
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2024-11-5 09:48:13 | 显示全部楼层
帮顶,lwip的ftp没用过,tcpnet的ftp和tftp比较简单,都做例子了,可以参考。

https://forum.anfulai.cn/forum.p ... &extra=page%3D1
回复

使用道具 举报

2

主题

12

回帖

18

积分

新手上路

积分
18
 楼主| 发表于 2024-11-5 19:24:47 来自手机 | 显示全部楼层
eric2013 发表于 2024-11-5 09:48
帮顶,lwip的ftp没用过,tcpnet的ftp和tftp比较简单,都做例子了,可以参考。

https://forum.anfulai.cn/fo ...

好的,谢谢
回复

使用道具 举报

2

主题

12

回帖

18

积分

新手上路

积分
18
 楼主| 发表于 2024-11-8 13:46:09 | 显示全部楼层
eric2013 发表于 2024-11-5 09:48
帮顶,lwip的ftp没用过,tcpnet的ftp和tftp比较简单,都做例子了,可以参考。

https://forum.anfulai.cn/fo ...

目前觉得问题出在接收数据的时候,具体函数是 tcp_recved(tpcb, p->tot_len);可能第一次收到的数据是空字符,也把他写进去了,被删掉的数据位于SD卡信息之后,传输前后的文件长度不变
回复

使用道具 举报

2

主题

12

回帖

18

积分

新手上路

积分
18
 楼主| 发表于 2024-11-8 13:47:07 | 显示全部楼层
/* 数据连接收到数据 */
static err_t ftpd_data_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
{
  struct ftpd_state *state = arg;
  struct pbuf *q;
  FRESULT fr;
  UINT bw;
  
  if (p != NULL)
  {
    if (state != NULL)
    {
      if (strcasecmp(state->cmd, "STOR") == 0)
      {
        LWIP_DEBUGF(FTPD_DEBUG, ("%s: %d bytes received\n", __FUNCTION__, p->tot_len));
        for (q = p; q != NULL; q = q->next)
        {
          fr = f_write(state->fp, q->payload, q->len, &bw);
          if (bw != q->len)
          {
            LWIP_DEBUGF(FTPD_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("%s: f_write() failed! fr=%d, q->len=%u, bw=%u\n", __FUNCTION__, fr, q->len, bw));
            pbuf_free(p);
            
            err = ftpd_free_data(state, FTPD_FREEDATA_ABORT);
            state->cmdstep = FTPD_CMDSTEP_CONNABORTED;
            ftpd_process_cmd(state);
            return err;
          }
        }
      }
    }
   
    tcp_recved(tpcb, p->tot_len);
    pbuf_free(p);
  }
  else
  {
    if (state != NULL)
    {
      LWIP_DEBUGF(FTPD_DEBUG, ("FTPD data connection [%s]:%d is shutdown by the client!\n", ipaddr_ntoa(&tpcb->remote_ip), tpcb->remote_port));
      ftpd_free_data(state, FTPD_FREEDATA_CLOSE);
      // 通知命令处理函数, 数据连接已被客户端关闭
      state->cmdstep |= FTPD_CMDSTEP_CONNSHUTDOWN;
      ftpd_process_cmd(state);
    }
    else
      LWIP_DEBUGF(FTPD_DEBUG, ("FTPD data connection [%s]:%d is closed by the client!\n", ipaddr_ntoa(&tpcb->remote_ip), tpcb->remote_port));
  }
  return ERR_OK;
}
贴出我认为有问题的接收函数
回复

使用道具 举报

2

主题

12

回帖

18

积分

新手上路

积分
18
 楼主| 发表于 2024-11-9 14:29:36 | 显示全部楼层
今天试了试,打印了服务器返回的数据,发现没有出现00,现在感觉是因为f_write的频率过快,或者一次写入1024字节大于512字节的问题,或者是f_write的参数不对,求各位解答
44612c90621e9d32eebfe628025606c.png
回复

使用道具 举报

2

主题

12

回帖

18

积分

新手上路

积分
18
 楼主| 发表于 2024-11-9 22:41:22 | 显示全部楼层
今天学长用同一个代码上传成功了,问题不出在ftpd.c里面,那就奇怪了
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2024-11-10 10:38:56 | 显示全部楼层
yz86 发表于 2024-11-9 22:41
今天学长用同一个代码上传成功了,问题不出在ftpd.c里面,那就奇怪了

测试下,f_write每次写入小于512字节试试。大于512的分批写入,如果正常,说明是的SDIO DMA的4字节对齐没有做好。
回复

使用道具 举报

2

主题

12

回帖

18

积分

新手上路

积分
18
 楼主| 发表于 2024-11-10 15:06:01 | 显示全部楼层
eric2013 发表于 2024-11-10 10:38
测试下,f_write每次写入小于512字节试试。大于512的分批写入,如果正常,说明是的SDIO DMA的4字节对齐没 ...

我上传了一个小于512字节的文件,发现确实没有再多写入的问题了!
回复

使用道具 举报

2

主题

12

回帖

18

积分

新手上路

积分
18
 楼主| 发表于 2024-11-10 16:20:46 | 显示全部楼层
问题已经解决,多谢硬汉哥,实际问题确实是SDIO DMA的字节对齐问题,在参考了https://forum.anfulai.cn/forum.p ... 4%C6%EB%CE%CA%CC%E2这篇帖子后,将DMA的目的地址设置为字节对齐后,上传文件不会再出现问题了
回复

使用道具 举报

2

主题

12

回帖

18

积分

新手上路

积分
18
 楼主| 发表于 2024-11-12 10:43:31 | 显示全部楼层
eric2013 发表于 2024-11-10 10:38
测试下,f_write每次写入小于512字节试试。大于512的分批写入,如果正常,说明是的SDIO DMA的4字节对齐没 ...

现在又有个问题,我的DMA设置字节对齐后,原先的TF卡每次写入65536字节出了问题,只能写入512字节,之后文件大小一直停留在512字节,但是换回WORD对齐之后就没这个问题了
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2024-11-13 10:23:48 | 显示全部楼层
yz86 发表于 2024-11-12 10:43
现在又有个问题,我的DMA设置字节对齐后,原先的TF卡每次写入65536字节出了问题,只能写入512字节,之后 ...

标准库还是HAL,标准库的话,使用我这个驱动试试

继续提升STM32F4的4线SDIO DMA方式的读写稳定性,发布新版案例(2020-06-30)
https://forum.anfulai.cn/forum.p ... 8560&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

2

主题

12

回帖

18

积分

新手上路

积分
18
 楼主| 发表于 2024-11-13 16:02:12 | 显示全部楼层
eric2013 发表于 2024-11-13 10:23
标准库还是HAL,标准库的话,使用我这个驱动试试

继续提升STM32F4的4线SDIO DMA方式的读写稳定性,发 ...

是HAL库,我有空参考下,现在每次写入的是512字节,烤机测试中,如果没有丢数现象就直接用512字节写入了
回复

使用道具 举报

2

主题

12

回帖

18

积分

新手上路

积分
18
 楼主| 发表于 2024-11-13 22:42:11 | 显示全部楼层
eric2013 发表于 2024-11-13 10:23
标准库还是HAL,标准库的话,使用我这个驱动试试

继续提升STM32F4的4线SDIO DMA方式的读写稳定性,发 ...

还是会有一些丢数问题....现在的问题是,如果改BYTE对齐,上传文件没有问题,但是ADC写入TF卡的文件大小只有512字节,对于ADC数据写入,我是存够一定大小,比如65536个字节,再一次性写入TF卡,如果对齐方式改成WORD,写入没问题,但是上传就又出现问题了,我目前想改下TCP recv函数,让他每次接收512字节,来测试上传文件是否成功,但是TCP_MSS最小只能到536,太奇怪了,我修改的是opt.h中的默认值
回复

使用道具 举报

2

主题

12

回帖

18

积分

新手上路

积分
18
 楼主| 发表于 2024-11-13 22:44:28 | 显示全部楼层
eric2013 发表于 2024-11-13 10:23
标准库还是HAL,标准库的话,使用我这个驱动试试

继续提升STM32F4的4线SDIO DMA方式的读写稳定性,发 ...

有没有可能是SD卡格式化的问题,我格式化使用的是DiskGenius
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2024-11-14 09:56:15 | 显示全部楼层
yz86 发表于 2024-11-13 16:02
是HAL库,我有空参考下,现在每次写入的是512字节,烤机测试中,如果没有丢数现象就直接用512字节写入了

这个是HAL版的,驱动做了对齐处理

V6-024-FatFS文件系统例子(SD卡 V1.1).7z (4.92MB)
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2024-11-14 09:56:44 | 显示全部楼层
yz86 发表于 2024-11-13 22:44
有没有可能是SD卡格式化的问题,我格式化使用的是DiskGenius

可以使用SD卡联盟的格式化小软件试试。
回复

使用道具 举报

2

主题

12

回帖

18

积分

新手上路

积分
18
 楼主| 发表于 2024-11-14 13:09:34 | 显示全部楼层
eric2013 发表于 2024-11-14 09:56
可以使用SD卡联盟的格式化小软件试试。

我今天将TCP接收的数据强行限制为256字节大小,现在上传无异常了
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2024-11-15 09:46:35 | 显示全部楼层
yz86 发表于 2024-11-14 13:09
我今天将TCP接收的数据强行限制为256字节大小,现在上传无异常了

也行,可以屏蔽字节对齐问题。
回复

使用道具 举报

2

主题

18

回帖

24

积分

新手上路

积分
24
发表于 2025-2-5 14:43:47 | 显示全部楼层
mark mark mark
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-12 00:44 , Processed in 0.068913 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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