OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4214|回复: 9

传感器数据写入SD卡不能换行,跪求大佬,救救孩子!!!

[复制链接]

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2018-1-24
在线时间
15 小时
发表于 2018-12-13 20:56:14 | 显示全部楼层 |阅读模式
1金钱
写一个传感器数据保存到SD的程序,传感器数据格式是H:(数值),A:(数值)
文件系统的程序和串口的程序都是原子哥的程序,自己加了两句话是在while里面判断每次数据接收完成之后加换行符号,但是写到SD卡里面一直是如图所示的样子,丢失H:,如果不加添加换行符的这两句的话,结果又如后面的图。
跪求各位大佬救救孩子

图1.向SD卡写入数据

图1.向SD卡写入数据

图2.自定义添加换行后的结果

图2.自定义添加换行后的结果

图3.自定义在接收完成之后在数组末尾添加换行的程序

图3.自定义在接收完成之后在数组末尾添加换行的程序

图4不用自定义添加换行,直接将收到的数据写入SD卡的结果

图4不用自定义添加换行,直接将收到的数据写入SD卡的结果

最佳答案

查看完整内容[请看2#楼]

1.原子代码不清零 是因为他 使用了读取的长度 2. sizeof(USART1_TX_BUF) 改为 strlen((char *)USART1_TX_BUF) sizeof获取的是数组的长度不是你接收的长度 你可以试试printf("sizeof(USART1_TX_BUF)=%d\r\n",sizeof(USART1_TX_BUF));是不是等于你定义的USART_REC_LEN 3. 也可以像原子代码 写入长度改为USART_RX_STA&0x3fff 再加换行回车 4.或者按我平常用的,修改原子代码中断接收 把\r \n存起来 再最后多写个0 以 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2018-12-13 20:56:15 | 显示全部楼层
JerryRen 发表于 2018-12-13 22:01
老哥,你说的USART1_RX_BUf不清零,原子哥的程序就没有清零吧,还有strlen不能用于数组吧(strlen(USART ...

1.原子代码不清零 是因为他 使用了读取的长度
2.  sizeof(USART1_TX_BUF)    改为 strlen((char *)USART1_TX_BUF)  sizeof获取的是数组的长度不是你接收的长度  
你可以试试printf("sizeof(USART1_TX_BUF)=%d\r\n",sizeof(USART1_TX_BUF));是不是等于你定义的USART_REC_LEN
3. 也可以像原子代码 写入长度改为USART_RX_STA&0x3fff   再加换行回车
4.或者按我平常用的,修改原子代码中断接收  把\r \n存起来 再最后多写个0 以后就可以直接f_printf了   strlen遇到0会停止,所以最后补个0 可以不管接受的长度 也不用使用完清除USART1_TX_BUF

综上所述的意思就是,sizeof 这样假如 USART1_TX_BUF长500 就是500 所以后面一堆0
回复

使用道具 举报

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2018-1-24
在线时间
15 小时
 楼主| 发表于 2018-12-13 21:06:25 | 显示全部楼层
@正点原子 原子哥,求救
回复

使用道具 举报

12

主题

53

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
396
金钱
396
注册时间
2015-11-17
在线时间
51 小时
发表于 2018-12-13 21:12:13 | 显示全部楼层
用f_puts()试试
回复

使用道具 举报

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2018-1-24
在线时间
15 小时
 楼主| 发表于 2018-12-13 21:13:39 | 显示全部楼层

嗯嗯,我试试!就是想不明白为啥f_write不行
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2018-12-13 21:14:01 | 显示全部楼层
原子串口接收 \r\n本来就舍弃了 ,f_write你不加就不会换行,你那种补充上就可以       f_printf直接格式化输出带上\r\n也可以
回复

使用道具 举报

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2018-1-24
在线时间
15 小时
 楼主| 发表于 2018-12-13 21:15:41 | 显示全部楼层
nashui_sx 发表于 2018-12-13 21:14
原子串口接收 \r\n本来就舍弃了 ,f_write你不加就不会换行,你那种补充上就可以       f_printf直接格式化 ...

但是我加了换行符,就会覆盖数据的第一位和第二位
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2018-12-13 21:38:12 | 显示全部楼层
JerryRen 发表于 2018-12-13 21:15
但是我加了换行符,就会覆盖数据的第一位和第二位

不要用sizeof  用strlen   
还有USART1_RX_BUf 每次不清零 最好 最后一个写0
                                        USART1_RX_BUF[USART1_RX_STA&0X3FFF]='\r';
                                        USART1_RX_BUF[(USART1_RX_STA&0X3FFF)+1]='\n';
                                        USART1_RX_BUF[(USART1_RX_STA&0X3FFF)+2]=0;
                                        USART1_RX_STA=USART1_RX_STA+2;
回复

使用道具 举报

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2018-1-24
在线时间
15 小时
 楼主| 发表于 2018-12-13 22:01:12 | 显示全部楼层
nashui_sx 发表于 2018-12-13 21:38
不要用sizeof  用strlen   
还有USART1_RX_BUf 每次不清零 最好 最后一个写0
                                        USART1_RX_BUF='\r' ...

老哥,你说的USART1_RX_BUf不清零,原子哥的程序就没有清零吧,还有strlen不能用于数组吧(strlen(USART3_RX_BUF)显示: argument of type "u16 *" is incompatible with parameter of type "const char *")?不过再末尾加个0,被覆盖的数据更多了!谢谢老哥的解答
回复

使用道具 举报

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2018-1-24
在线时间
15 小时
 楼主| 发表于 2018-12-17 09:30:32 | 显示全部楼层
nashui_sx 发表于 2018-12-14 17:36
1.原子代码不清零 是因为他 使用了读取的长度
2.  sizeof(USART1_TX_BUF)    改为 strlen((char *)USART ...

谢谢您!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 04:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表