stm32F103原点战舰开发板,SD卡读取txt里面的坐标数据笔记

实验步骤。
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<br0;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<br0;iii++)
{
if(iii%2==0)//偶数,放到x坐标
{xx[ttt]=doublexy[iii];ttt++; }
else
{ yy[ggg]=doublexy[iii];ggg++;}

				}

7、可以循环打印,看下读取的数据是不是成功;
for(iii=0;iii<br0/12;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<br0/12;iii++)
			    {
						sprintf((char*)tbuf,"yy:%.2f",yy[iii]); 
						LCD_ShowString(30,210,210,16,16,tbuf);
						delay_ms(1000);
						LCD_Clear(WHITE);
					}

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;

}

猜你喜欢

转载自blog.csdn.net/lmf666/article/details/106179061