这篇文章为读取打印文件(后缀为gcode的文件),并添加USMART功能调试
因为TFATFS移植与USMATRT没有什么好写的,而且在下方的链接:正点原子教程已经有详细的教程了,所以跳过了TATFS与USMART。
链接为:https://pan.baidu.com/s/1_S0394ZSRZaNxgz3QIbstA
提取码:6718
那么从这里,我们完成了对TF卡的初始化及其FATFS文件系统初始化。
现在我们可以调用FATFS内的函数。
首先我们需要知道如何打开文件,并读取文件的代码
- 首先对SD卡初始化,及上一篇的文章中的SD_Initialize(void)函数。
- 随后为FATFS申请内存,使用exfuns_init(void)函数。(其实不使用这个函数也是可以的,只不过这样可以整理内存)
- 挂载TF卡,使用f_mount(fs[0],“0:”,1)函数,函数内的相关变量,(是需要设定的,再正点原子教程有指出)。
- 挂载成功后便可使用FATFS库内的函数了。
但是还是借鉴正点原子的教程,使用正点原子封装好的一些函数。
如果完成了对FTAFS文件系统的初始化后,你会发现在工程文件中有fattester.c文件。
文件内有许多函数
函数名称 | 函数功能 |
---|---|
mf_scan_files | 遍历文件 (通过串口返回目录信息) |
mf_mount | 为磁盘注册工作区 |
mf_open | 打开目录下的文件 |
mf_close | 关闭文件 |
mf_read | 读取打开文件的数据 |
mf_write | 写入数据 |
mf_opendir | 打开目录 |
mf_closedir | 关闭目录 |
mf_readdir | 打开文件夹 |
mf_showfree | 显示剩余容量 |
差不多了,大概只需要使用这些
打开这个文件,你会发现这个函数
u8 mf_read(u16 len)
{
u16 i,t;
u8 res=0;
u16 tlen=0;
printf("\r\nRead file data is:\r\n");
for(i=0;i<len/512;i++)
{
res=f_read(file,fatbuf,512,&br);
if(res)
{
printf("Read Error:%d\r\n",res);
break;
}else
{
tlen+=br;
for(t=0;t<br;t++)printf("%c",fatbuf[t]);
}
}
if(len%512)
{
res=f_read(file,fatbuf,len%512,&br);
if(res) //¶ÁÊý¾Ý³ö´íÁË
{
printf("\r\nRead Error:%d\r\n",res);
}else
{
tlen+=br;
for(t=0;t<br;t++)printf("%c",fatbuf[t]);
}
}
if(tlen)printf("\r\nReaded data len:%d\r\n",tlen);//¶Áµ½µÄÊý¾Ý³¤¶È
printf("Read data over\r\n");
return res;
}
因为我们需要一个每次读取一个字节的函数,所以还是需要自己写一个读取函数。(注意在fattester.c文件下下下这个函数,因为需要使用该文件内的文件变量)
u8 zf_read(void)
{
u16 i,t;
u8 res=0;
res=f_read(file,fatbuf,1,&br);
if(res)
printf("Read Error:%d\r\n",res);
return *fatbuf;
}
并在fattester.h头文件声明,增加
u8 zf_read(void);
到此,我们完成了每次读取打开文件的一个字节的函数
在主函数中
完成初始化后,(对USMART初始化后及TF卡、FATFS初始化后)
在串口发送mf_scan_files(“0:”),则会返回目录信息
随后发送mf_open(“0:/aa1.gcode”,1);
打开aa1.gcode文件,随后便可使用函数mf_read读取,或者使用我们写的函数zf_read读取信息。