stm32如何将FTP服务器建立到SD卡中

stm32 FTP如何将服务器建立到SD卡下(已挂载fat32文件系统)的问题
现在以及实现了32芯片做FTP服务器,测试读写文件也都正常,也成功挂载了FAT32文件系统,测试功能也正常,但是现在挂载服务器的目录是在根目录下(代码附在最下面),而挂载文件系统的位置我也选在了根目录下,但是为何FTP服务器却无法显示SD卡中的文件。
这是挂载文件系统时所指定的目录

res_sd = f_mount(&fs,"0:/",1);

img

void CH563NET_FTPConnect( void )
{
    u8 i = 0;

    CH563NET_FTPInitVari( );
  //i = ETH_LibInit(IPAddr,GWIPAddr,IPMask,MACAddr);
    mStopIfError(i);
    printf("CH563NET_LibInit Success\n");

    CH563NET_FTPCtlServer( );
}
void CH563NET_FTPInitVari( )
{
    FTP   *pFTP;
    u8
    i,j;

    pFTP = &ftp;
    memset((void *)pFTP,'\0',sizeof(ftp));
    ftp.SocketDatMonitor = 255;
    ftp.SocketDatConnect = 255;
    ftp.SocketCtlMonitor = 255;
    ftp.SocketCtlConnect = 255;
    memset((void *)SourIP,'\0',sizeof(SourIP));
    j = 0;
    for(i=0;i<4;i++){                                                           /* ½«Ê®½øÖƵÄIPµØÖ·×ª»»ËùÐèÒªµÄ×Ö·û¸ñʽ */
        if( IPAddr[i]/100 ){
            SourIP[j++] = IPAddr[i]/100 + '0';
            SourIP[j++] = (IPAddr[i]%100)/10 + '0' ;
            SourIP[j++] = IPAddr[i]%10 + '0';
        }
        else if( IPAddr[i]/10 ){
            SourIP[j++] = IPAddr[i]/10 + '0';
            SourIP[j++] = IPAddr[i]%10 + '0';
        }
        else SourIP[j++] = IPAddr[i]%10 + '0';
         SourIP[j++] = '.';
    }
    mInitFtpList( );
}
void  mInitFtpList( void )
{

    memset((void *)RootBuf1,'\0',sizeof(RootBuf1));
    sprintf(RootBuf1,Atest);
    memset((void *)RootBuf2,'\0',sizeof(RootBuf2));
    sprintf(RootBuf2,Btest);
    memset((void *)RootBuf3,'\0',sizeof(RootBuf3));
    memset((void *)RootBuf4,'\0',sizeof(RootBuf4));
    memset((void *)UserBuf,'\0',sizeof(UserBuf));
    sprintf(UserBuf,Ctest);
    memset((void *)ListRoot,'\0',sizeof(ListRoot));
    sprintf(ListRoot,"%s%4d A.txt\r\n%s%4d B.txt\r\n%sUSER\r\n",FileNature,
            strlen(RootBuf1),FileNature,strlen(RootBuf1),ListNature);           /* 当前目录 */
    memset((void *)ListUser,'\0',sizeof(ListUser));
    sprintf(ListUser,"%s%4d H.txt\r\n",FileNature,strlen(UserBuf));             /* 下一级目录 */
    memset((void *)NameFile,'\0',sizeof(NameFile));
    sprintf(NameFile,"USER\r\n");
    memset((void *)NameList,'\0',sizeof(NameList));
    sprintf(NameList,"A.txt#0B.txt#1");
    ftp.BufStatus |= 0x03;                                                      /* buf1和buf2不为空 */

}
void CH563NET_FTPCtlServer(void)
{
   u8 i;
   SOCK_INF TmpSocketInf;

   memset((void *)&TmpSocketInf,0,sizeof(SOCK_INF));
   TmpSocketInf.SourPort = 21;
   TmpSocketInf.ProtoType = PROTO_TYPE_TCP;
   i = WCHNET_SocketCreat(&SocketId1,&TmpSocketInf);
   mStopIfError(i);
   ftp.SocketCtlMonitor = SocketId1;
   i = WCHNET_SocketListen(SocketId1);
   mStopIfError(i);
   printf("SocketId1 ctl:%d\n",(u16)SocketId1);
   printf("FTP Connect Success\r\n");
   mStopIfError(i);


}


STM32利用FATFS文件系统给SD卡读写数据_fatfs 写文件_OnlyFamiU的博客-CSDN博客 利用FATFS文件系统如何给SD卡写入数据1. 操作步骤第一步:给SD卡注册工作区FATFS fs; //SD 卡逻辑驱动器的工作区f_mount(&fs,“0:”,1); //为SD卡逻辑驱动器注册工作区第二步:创建文件夹f_mkdir(“0:\shiyan”);//创建 (shiyan) 文件夹第三步:创建文件FIL File;f_open(&File, “0:\Shiyan\tianqi.dat”, FA_OPEN_ALWAYS | FA_WRITE);//在_fatfs 写文件 https://blog.csdn.net/USTLBer/article/details/115258265

可能是由于FTP服务器的目录列表和文件系统的目录列表不一致导致的。需要在mInitFtpList函数中设置正确的目录列表,以便FTP服务器能够识别SD卡中的文件。

【以下回答由 GPT 生成】

这个问题的解决方案是将FTP服务器连接的路径更改为SD卡的挂载路径。你可以根据SD卡的挂载路径创建一个新的路径,并将FTP服务器连接到该路径。下面是具体的步骤。

  1. CH563NET_FTPConnect函数中,在调用CH563NET_FTPCtlServer之前,添加以下代码来创建新的FTP服务器路径:

c ftp.WorkDirName[0] = '0'; ftp.WorkDirName[1] = ':'; ftp.WorkDirName[2] = '/'; ftp.WorkDirName[3] = '\0';

这将创建一个新的FTP服务器路径,指向SD卡的根目录。

  1. CH563NET_FTPConnect函数中,找到以下代码:

c memset((void *)SourIP,'\0',sizeof(SourIP)); j = 0; for(i=0;i<4;i++){ /* 将每个字段的IP地址转换为需求的字符格式 */ if( IPAddr[i]/100 ){ SourIP[j++] = IPAddr[i]/100 + '0'; SourIP[j++] = (IPAddr[i]%100)/10 + '0' ; SourIP[j++] = IPAddr[i]%10 + '0'; } else if( IPAddr[i]/10 ){ SourIP[j++] = IPAddr[i]/10 + '0'; SourIP[j++] = IPAddr[i]%10 + '0'; } else SourIP[j++] = IPAddr[i]%10 + '0'; SourIP[j++] = '.'; }

将其注释或删除。这是用于获取IP地址并转换为字符格式的代码,但在这种情况下不需要。

  1. 编译并重新烧录你的代码,然后重新测试FTP服务器的连接。现在,FTP服务器应该在SD卡的根目录中显示文件。

如果你还有其他问题,请随时提问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

参考一下, 修改你的路劲


#include "stdio.h"
#include "string.h"
#include "lwip/api.h"
#include "ff.h"

// 设置服务器的根目录为SD卡的路径
#define FTP_ROOT_DIRECTORY "/sdcard/"

// FTP服务器回调函数
err_t ftpfs_open(struct fs_file *file, const char *name) {
    char path[100];
    strcpy(path, FTP_ROOT_DIRECTORY);
    strcat(path, name);

    // 打开SD卡上的文件
    FRESULT res = f_open(&file->file, path, FA_READ);
    if (res != FR_OK) {
        return ERR_VAL;
    }

    // 其他逻辑处理...

    return ERR_OK;
}

这有一篇实例,介绍的很详细,期望对你有帮助。链接:https://www.cnblogs.com/amanlikethis/p/3757876.html

这样容易崩溃吧?

结合GPT给出回答如下请题主参考
建立FTP服务器到SD卡中的过程可以分为以下几个步骤:

  1. 配置网络连接: 首先需要配置STM32的网络连接,包括IP地址、子网掩码、网关等信息。可以使用STM32自带的ethernet库或第三方库来实现。

  2. 实现FTP服务器: 可以使用第三方FTP服务器库,如lwIP、uIP等,也可以手动实现FTP服务器。在实现FTP服务器时,需要将SD卡中的文件系统挂载到FTP服务器中,以便客户端能够访问SD卡上的文件。

  3. 实现FTP客户端: 在FTP客户端中,可以使用第三方FTP客户端库或手动实现FTP客户端。FTP客户端需要与FTP服务器建立连接,并提供用户名和密码等认证信息。客户端可以通过FTP协议访问SD卡上的文件和目录。

  4. 测试: 在完成FTP服务器和客户端的实现后,需要进行测试以确保功能正常。可以使用网络调试工具,如Wireshark,来检查FTP协议通信过程中的数据包。

需要注意的是,在实现FTP服务器时,需要注意文件和目录的访问权限,以确保SD卡上的文件不被非授权用户访问或更改。同时,为了加强安全性,可以加密FTP协议通信过程中的数据,以防止中间人攻击。

将FTP上传的文件直接到SD卡
可以参考下

1.修改vsftpd的默认根目录 /var/ftp/ 到指定目录下

默认配置下,匿名用户登录 vsftpd 服务后的根目录是 /var/ftp/;
系统用户登录 vsftpd 服务后的根目录是系统用户的根目录。
若要修改登录 vsftpd 服务后的根目录,只要修改 /etc/vsftpd/vsftpd.conf 文件即可。
假设要把 vsftpd 服务的登录根目录调整为 /var/ftp/pub,可加入如下三行:
local_root=/var/ftp/pub
chroot_local_user=YES
anon_root=/var/ftp/pub

注解:local_root 针对系统用户;anon_root 针对匿名用户。
 
编辑 vsftpd.conf 文件后,保存退出,参照如下指令重新启动服务: service vsftpd restart

之后 ftp 客户端登陆 vsftpd 服务后,其根目录是 /var/ftp/pub。

2.修改/etc/init.d/rcS文件,添加以下内容

;挂载SD卡到FTP默认目录

mount /dev/mmcblk0p1 /var/ftp/pub/

 

如果SD卡未被注册到内核中,请添加以下命令:

mknod /dev/mmcblk0p1 b 179 1

注:

主设备号是通过

#cat /proc/partitions 查看

然后再执行mount命令即可将SD卡挂载到FTP目录下。

2013-07-17 修改  如果挂载后SD卡变成只读的文件系统,可以使用以下方法进行测试。

在/etc/init.d/rcS中添加一句

mount -o remount,rw /dev/mmcblk0p4

如果不行的话,也可以尝试一下将FAT格式变成EXT2格式


https://blog.csdn.net/shouwangyunkai666/article/details/89408361

首先,STM32开发板上已经连接了一个SD卡插槽,在STM32上运行一个支持FTP服务器的软件

题主,这个问题我来替你解决(参考结合AI智能、文心一言),若有帮助,还望采纳,点击回答右侧采纳即可。


可能是因为您在创建FTP服务器时没有指定服务器的根目录。在 FTP 服务器中,根目录是服务器的默认目录,所有从客户端发出的相对路径都是相对于此目录来计算的。

为了将服务器根目录指向 SD 卡下的文件夹,您需要使用相应的文件路径来指定根目录。例如,如果您想将根目录设置为 SD 卡下的名为“my_ftp”文件夹,则可以使用以下代码:

FRESULT res;
FILINFO fno;
char buffer[256];
strcpy(buffer, "0:/my_ftp");

/* 检查根目录是否存在 */
res = f_stat(buffer, &fno);
if (res != FR_OK || !(fno.fattrib & AM_DIR)) {
    /* 如果不存在则创建 */
    res = f_mkdir(buffer);
    if (res != FR_OK) {
        printf("Failed to create root directory!\n");
        return 1;
    }
}

/* 设置 FTP 服务器的根目录 */
ftp_set_path(&server, buffer, sizeof(buffer));

在上面的代码中,首先使用字符串“0:/my_ftp”设置了 SD 卡中的根目录路径,然后检查该目录是否存在,如果不存在就创建。然后,使用“ftp_set_path”函数将 FTP 服务器的根目录设置为“0:/my_ftp”。

请注意,这只是一个示例,并且如果您的 SD 卡挂载的位置不是“0”,则需要相应地更改路径。

希望这可以帮助您解决问题!

请确保FTP服务器正在监视正确的目录。如果在FTP服务器代码中将目录指定为根目录(即"/"),那么它将监视整个文件系统的根目录,而不仅仅是SD卡的根目录。因此,需要将FTP服务器代码中的目录指定为SD卡的实际目录(即"0:/"。

参考gpt
要在STM32上建立FTP服务器并将其连接到SD卡中,您需要按照以下步骤进行操作:

  1. 确保已正确挂载FAT32文件系统到SD卡。您提到已经成功挂载了文件系统,确保挂载的目录是正确的。

  2. 确保您的FTP服务器代码能够正确读取SD卡上的文件。您可以使用文件系统的API来访问SD卡上的文件,并在FTP服务器代码中使用这些API来读取文件数据。

  3. 在FTP服务器代码中,设置服务器的根目录为SD卡上的目录。您可以在服务器代码中找到设置服务器根目录的部分,并将其设置为SD卡上的目录。

  4. 确保FTP服务器代码中的文件路径是正确的。在访问文件时,确保使用正确的文件路径,包括文件所在的目录和文件名。

  5. 检查FTP服务器的权限设置。确保FTP服务器具有足够的权限来读取SD卡上的文件。您可能需要在服务器代码中设置适当的权限。

以下是一个简单的示例代码,演示如何在STM32上建立FTP服务器并将其连接到SD卡中:

#include "ftp_server.h"
#include "ff.h"

// 设置FTP服务器的根目录为SD卡上的目录
#define FTP_SERVER_ROOT_DIR "0:/"

int main() {
    // 挂载FAT32文件系统到SD卡
    FATFS fs;
    FRESULT res_sd = f_mount(&fs, "0:/", 1);
    if (res_sd != FR_OK) {
        // 挂载失败,处理错误
        // ...
    }

    // 设置FTP服务器的根目录
    ftp_server_set_rootdir(FTP_SERVER_ROOT_DIR);

    // 启动FTP服务器
    ftp_server_init();

    while (1) {
        // 服务器运行中,可以执行其他任务
        // ...
    }

    return 0;
}

在STM32中将FTP服务器建立到SD卡中需要使用相应的TCP/IP协议栈并实现FTP服务器功能,同时利用FatFS库对SD卡进行文件操作。