MQX 读写U盘

举报
TopSemic嵌入式 发表于 2021/10/19 00:50:58 2021/10/19
【摘要】 MQX操作系统具有完整的USB协议栈和MFS文件系统。其本身带有操作U盘的例子。 以FRDM_K64F+Freescale_MQX_4_1_FRDMK64F为例 在C:\Freescale\Frees...

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<strlen(buffer);bi++)
       printf("%c",buffer2[bi]);
    fclose(fd);


    // 再次打开test1.txt 并向其中写数据,然后读出
    fd = fopen("a:test1.txt", "a+");
    if (fd == NULL) 
    {
        printf("Error opening the MFS file!");
   _mqx_exit(1);
  }
    write(fd, "Bejing", 6);

    fseek(fd, 0, IO_SEEK_SET); 
    read(fd, buffer3, strlen(buffer)+6);

    printf("\r\n");
    for(bi=0;bi<(strlen(buffer)+6);bi++)
       printf("%c",buffer3[bi]);
    fclose(fd); 
}
  
 
  • 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
  • 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

文章来源: blog.csdn.net,作者:TopSemic嵌入式,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/wangwenxue1989/article/details/49006527

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。