嵌入式技术william hill官网
直播中

lee_st

12年用户 45163经验值
擅长:可编程逻辑 嵌入式技术 处理器/DSP RF/无线
私信 关注
[经验]

第39章 RL-TCPnet之TFTP服务器

转帖
本章节为大家讲解RL-TCPnet的TFTP服务器应用,学习本章节前,务必要优先学习第38章的TFTP基础知识。有了这些基础知识之后,再搞本章节会有事半功倍的效果。
      本章教程含STM32F407开发板和STM32F429开发板。
39.1  初学者重要提示
39.2  TFTP函数
39.3  TFTP配置说明(Net_Config.c)
39.4  TFTP调试说明(Net_Debug.c)
39.5  TFTP客户端软件和板子的操作步骤
39.6实验例程说明(RTX)
39.7  总结

回帖(77)

lee_st

2017-12-28 08:26:56
39.1  初学者重要提示


1、学习本章节前,务必保证已经学习了第38章的基础知识。
2、本章配套的例子是将开发板作为TFTP服务器,使用开发板上面的SD卡作为服务器的存储介质。所以测试本章节的例子,务必要准备一个SD卡。
3、由于配套例子的文件系统是采用的RL-FlashFS,此文件系统的文件名仅支持ASCII字符,不支持中文,特别注意!
4、具体TFTP服务器的访问方法在本章的39.5小节有详细说明,操作例子前必看!
举报

lee_st

2017-12-28 08:27:14

39.2  TFTP函数
      使用如下11个函数可以实现RL-TCPnet的TFTP:
(1)tftp_accept_host
(2)tftp_fclose
(3)tftp_fopen
(4)tftp_fread
(5)tftp_fwrite
(6)tftpc_fclose
(7)tftpc_fopen
(8)tftpc_fread
(9)tftpc_fwrite
(10)tftpc_get
(11)tftpc_put
举报

lee_st

2017-12-28 08:27:34
关于这11个函数的讲解及其使用方法可以看教程第 3 章 3.4 小节里面说的参考资料 rlarm.chm 文件:

举报

lee_st

2017-12-28 08:27:54
这里我们重点的说以下6个函数,因为本章节配套的例子使用的是这6个函数:
(1)tftp_accept_host
(2)tftp_fclose
(3)tftp_fopen
(4)tftp_fread
(5)tftp_fwrite
(6)tftpc_fclose
关于这些函数注意以下三点:
1、TFTP的所有函数都不支持重入,也就是不支持多任务调用。
2、以tftp_开头的函数是用于TFTP服务器的
3、以tftpc_开头的函数是用于TFTP客户端的。
举报

lee_st

2017-12-28 08:28:09
39.2.1    函数tftp_fopen
函数原型:
void* tftp_fopen (
    U8* fname,     /* 文件名地址 */
    U8* mode );    /* 操作模式 */
举报

lee_st

2017-12-28 08:29:27
函数描述:
函数tftp_fopen用于打开文件。此函数在MDK安装目录中的TFTP_uif.c文件里面,属于底层接口函数,用户要在此函数里面添加具体的操作。
1、第1个参数是文件名地址。
2、第2个参数是操作模式,可以是读操作或者写操作,具体支持的形参类型如下:



3、返回值,打开文件成功的话,返回指向此文件的指针变量,否则返回NULL。

举报

lee_st

2017-12-28 08:30:10
使用举例:
void *tftp_fopen (U8 *fname, U8 *mode) {
  /* 打开文件 */
  return (fopen((char *)fname, (char *)mode));
}
举报

lee_st

2017-12-28 08:30:31
39.2.2   函数tftp_fclose
函数原型:
void tftp_fclose (
FILE* file);  /* 文件句柄地址 */
举报

lee_st

2017-12-28 08:30:46
函数描述:
函数tftp_fclose用于关闭文件。此函数在MDK安装目录中的TFTP_uif.c文件里面,属于底层接口函数,用户要在此函数里面添加具体的操作。
1、第1个参数是要关闭的文件句柄地址。
举报

lee_st

2017-12-28 08:31:04
使用举例:
void tftp_fclose (void *file) {
  /* 关闭文件,当TFTP会话将结束的时候会调用此函数 */
  fclose (file);
}
举报

lee_st

2017-12-28 08:31:18
39.2.3   函数tftp_fread
函数原型:
U16 tftp_fread (
    FILE* file,     /* 文件句柄地址 */
    U8*   buf,      /* 数据缓冲地址 */
    U16   len );    /* 要读取的字节数 */
举报

lee_st

2017-12-28 08:31:35
函数描述:
函数tftp_fread用于从文件中读出len个字节数据。此函数在MDK安装目录中的TFTP_uif.c文件里面,属于底层接口函数,用户要在此函数里面添加具体的操作。
1、第1个参数是要读取数据的文件句柄地址。
2、第2个参数是数据缓冲地址,用于存储读取出来的数据。
3、第3个参数是要读取出来的数据大小,单位字节。
4、返回值,返回从文件中实际读出的字节数。
使用这个函数要注意以下问题:
1.     设置读取函数时,必须设置指定大小的字节数。如果实际读出的字节数小于len,将停止读取并关闭TFTP会话(打开的文件也会关闭),这种情况一般都是文件已经读取完毕。
举报

lee_st

2017-12-28 08:31:54
使用举例:
U16 tftp_fread (void *file, U8 *buf, U16 len) {
/* 读取len字节到buf中,当此函数的返回值,即实际读取的字节数小于len的时候,说明文件已经读取完毕,
文件将被关闭*/
  return (fread (buf, 1, len, file));
}
举报

lee_st

2017-12-28 08:32:17
39.2.4   函数tftp_fwrite
函数原型:
U16 tftp_fwrite (
    FILE* file,     /* 文件句柄地址 */
    U8*   buf,      /* 数据缓冲地址 */
U16   len );    /* 要写入的字节数 */
举报

lee_st

2017-12-28 08:32:31
函数描述:
函数tftp_fwrite用于往文件中写入len个字节数据。此函数在MDK安装目录中的TFTP_uif.c文件里面,属于底层接口函数,用户要在此函数里面添加具体的操作。
1、第1个参数是要写入数据的文件句柄地址。
2、第2个参数是数据缓冲地址,存储了要写入的数据。
3、第3个参数是要写入的数据大小,单位字节。
4、返回值,返回实际写入文件的字节数。
举报

lee_st

2017-12-28 08:32:47
使用举例:
U16 tftp_fwrite (FILE *file, U8 *buf, U16 len) {
  /* 将buf中的len字节写入到文件中 */
  return (fwrite (buf, 1, len, file));
}
举报

lee_st

2017-12-28 08:33:03
39.2.5   函数tftp_accept_host
函数原型:
BOOL tftp_accept_host (
    U8* rem_ip,      /* 远程设备IP地址 */
U16 rem_port );  /* 远程设备端口号 */
举报

lee_st

2017-12-28 08:33:17
函数描述:
函数tftp_accept_host用于设置是否接受远程连接,用户可以通过此函数选择允许哪些设备可以连接,哪些不可以连接。
1、第1个参数是远程设备的IP地址。
2、第2个参数是远程设备的端口号。
3、返回值,返回__TRUE表示允许此远程连接,返回__FALSE表示不允许此远程连接。
使用这个函数要注意以下问题:
1.     此函数是可选的,如果大家在工程中没有写这个函数,RL-TCPnet库会调用默认的函数,允许所有的连接请求,如果在工程中写了此函数,会执行新写的这个函数。
举报

lee_st

2017-12-28 08:33:33
使用举例:
BOOL ftp_accept_host (U8 *rem_ip, U16 rem_port) {

  if (rem_ip[0] == 192  &&
      rem_ip[1] == 168  &&
      rem_ip[2] == 1    &&
      rem_ip[3] == 1) {
    /* 接受此连接. */
    return (__TRUE);
  }
  /* 拒绝此连接 */
  return (__FALSE);
}
举报

更多回帖

发帖
×
20
完善资料,
赚取积分