MQX 读写U盘

网友投稿 851 2022-05-28

MQX操作系统具有完整的USB协议栈和MFS文件系统。其本身带有操作U盘的例子。

以FRDM_K64F+Freescale_MQX_4_1_FRDMK64F为例

在C:\Freescale\Freescale_MQX_4_1_FRDMK64F\mfs\examples\mfs_usb目录里有例子。这个例子里用到了shell,有的客户不希望使用shell,而单独能够在u盘中建立文件(fat32格式)、读写文件。那么该如何操作呢?

在usb_task.c 文件的USB_task()函数中,我增加了一个函数Udisk_Demo_Test()用来单独实现直接对U盘进行读写操作。

case USB_INTF_EVENT: /* Installs USB device. If no partitions found, installs MFS over whole device. */ dev_data = (MSD_DEV_DATA_PTR)msg.ccs_ptr; usb_msd_install(dev_data, &fs_mountp); /* Unlock the USB_Stick = signal to the application as available */ // added by wenxue 20151009 Udisk_Demo_Test(); _lwsem_post(&USB_Stick); break;

1

2

3

4

5

6

7

8

9

10

/*FUNCTION*---------------------------------------------------------------- * * Function Name : Udisk_Demo_Test * Returned Value : * Comments : Test U disk * *END*--------------------------------------------------------------------*/ int Udisk_Demo_Test(void) { MQX_FILE_PTR fd = NULL; _mqx_int c; _mqx_int bi; char buffer[100] = "This a test file!"; char buffer2[100]; char buffer3[100]; // 读U盘里现成的文件wenxue.txt,读取内容并打印输出 fd = fopen("a:wenxue.txt", "r"); if (fd == NULL) { printf("Error opening the MFS device driver!"); _mqx_exit(1); } if (fd ) { do { c = fgetc(fd); if (c!= IO_EOF) { fputc((char)c, stdout); } } while (c!=IO_EOF); } fclose(fd); //读取test1.txt,由于原先不存在该文件,会创建它,并写入数据,然后读出来 fd = fopen("a:test1.txt", "a+"); if (fd == NULL) { printf("Error opening the MFS file!"); _mqx_exit(1); } write(fd, buffer, strlen(buffer)); fseek(fd, 0, IO_SEEK_SET); read(fd, buffer2, strlen(buffer)); printf("\r\n"); for(bi=0;bi

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

MQX 读写U盘

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

需要注意的是:

1)fopen的第二个参数如下:

2)调用write函数之后,如果通过read函数读取文件中的数据,需要调用fseek函数,fseek的第三个参数如下

/* * Seek parameters */ #define IO_SEEK_SET (1) /* Seek from start */ #define IO_SEEK_CUR (2) /* Seek from current location */ #define IO_SEEK_END (3) /* Seek from end */

1

2

3

4

5

6

它用来改变位置指针,注意第一个参数文件指针的区别。

fseek

原型:int fseek(FILE *stream, long offset, int fromwhere);

功能:重定位流(数据流/文件)上的文件内部位置指针

注意:不是定位文件指针(文件指针是 FILE * fp 这样的),文件指针指向文件/流。位置指针指向文件内部的字节位置,随着文件的读取会移动,文件指针如果不重新赋值将不会改变指向别的文件。

第一个参数stream为文件指针

第二个参数offset为偏移量,正数表示正向偏移,负数表示负向偏移

第三个参数origin设定从文件的哪里开始偏移

在网上看到一篇关于C语言文件的blog,写的很好:

http://www.cnblogs.com/L-hq815/archive/2012/06/30/2571066.html

同事Jicheng,写了一篇关于KL25/26读写U盘的Blog:

http://blog.chinaaet.com/jihceng0622/p/38978

C语言中各函数的解释:http://www.51testing.com/html/71/410671-818629.html

Shell

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:云硬盘
下一篇:CENTOS挂载磁盘
相关文章