实验步骤。
1、首先利用原点的fatfs例子。先不学习移植。后面有时间再移植。
2、在SD卡中,建立1.txt文本文件;
在里面输入数据:注意格式,本次实验需要这么才能正确读写文本的数据;不然读取会部分出错。
错误的写法也写下:
文本中,写入
23.56,89.35,(回车换行)
68.23,25.00,(回车换行)
85.36,54.24,(回车换行)
在这里输入的方法里面,如若用后面的程序读,会得到数据,但是在回车换行那里,得到0.005,原来的数据68.23,85.36会出错,转换不出来。
由于时间较为紧迫。因此没有深究里面的原因。
第二次,把文本的数据格式,改为
25.36,89.35,68.23,25,85.36,54.24,
连续的数字,就能读出来。注意这个逗号必须要有,这里的数据用逗号进行分割。
3、利用f_open进行打开文件;
4、利用f_read进行读取里面的文件;放在ReadBuf内存空间中;会返回一个读取的字节的数据,得到里面的数据的字节长度;给后面的循坏使用;然后关闭文件。
5、网上查找例子,如何将文本,逗号隔开的,取出来。
然后将每个坐标放在一个字符数组里面。
j=0;mm=0;
for(iii=0;iii
delay_ms(5);
//如果是遇到的不是逗号,就一个个字符放到str99里面。
if(ReadBuf[iii]!=’,’)
{ LCD_ShowString(30,170,200,16,16,"1234");
str99[j]=ReadBuf[iii];
sprintf((char*)tbuf,"%s",str99);
LCD_ShowString(30,210,210,16,16,tbuf);
delay_ms(1000);
LCD_Clear(WHITE);
j++;
}
//如果遇到一个逗号,说明一个数结束,将该数转换成double.然后放到doublexy中。将str99清空,给下一个小数空出地方。
else if(ReadBuf[iii]==',')//读取到一个字符数组;放到里面。把字符数组,变为浮点数
{
LCD_ShowString(30,170,200,16,16,"ef0f");
doublexy[mm]=StrToDouble(str99);
mm++;
memset(str99,0,sizeof(str99));
j=0;
}
}
6、转换成double之后,将奇数放到xx坐标的数组,偶数放到yy坐标的数组。
ttt=0;ggg=0;
for(iii=0;iii
if(iii%2==0)//偶数,放到x坐标
{xx[ttt]=doublexy[iii];ttt++; }
else
{ yy[ggg]=doublexy[iii];ggg++;}
}
7、可以循环打印,看下读取的数据是不是成功;
for(iii=0;iii
sprintf((char*)tbuf,“xx:%.2f”,xx[iii]);
LCD_ShowString(30,210,210,16,16,tbuf);
delay_ms(1000);
LCD_Clear(WHITE);
}
for(iii=0;iii
8、这个字符串转换成浮点数的程序,是在网上找的,在devc++中实验,可以用。后移植到stm32本程序中,具体原理后面再琢磨。
//字符串转double
double StrToDouble(char *s)
{
int i = 0;
int k = 0;
double j;
int flag =1;
double result = 0.0;
if (s == NULL)
{
// printf(“输入字符串为空”);
// exit(-1);
return 0;
}
while (s[i] == ' ')
{
i++;
}
if (s[i] == '+')
{
i++;
}
if (s[i] == '-')
{
i++;
flag = -1;
}
while (s[i] != '\0' && s[i] != '.')
{
if (s[i] < '0' || s[i] > '9')
{
// printf("字串含有非数字字符,无法转换!\n");
return 0;
// exit(-1);
}
j = (s[i] - '0')*1.0;
result = result * 10 + j;
if((result>0x7fffffff))
{
return 0;
}
i++;
}
if (s[i] == '.')
{
i++;
while (s[i] != '\0')
{
if (s[i] < '0' || s[i] > '9')
{
//printf("字串含有非数字字符,无法转换!\n");
return 0;
}
k++;
j = s[i] - '0';
result = result + (1.0 * j) / pow(10.0, k); //编译时候此处有警告
i++;
}
}
result = flag * result;
return result;
}