MQX 读写U盘
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
- 点赞
- 收藏
- 关注作者
评论(0)