极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 18260|回复: 7

串口有输出,SD卡无数据写入

[复制链接]
发表于 2016-8-19 15:56:20 | 显示全部楼层 |阅读模式
接收另一个单片机串口发送的数据,存入SD卡,并在串口将字符输出,程序中将接收的字符以HEX形式显示,如下

串口看到的字符和我单独使用串口软件看到的字符不一样,可能是我程序设置问题。现在SD卡中TEST01文件生成,但是0KB,即无数据记录,不知道是不是延时问题,请指点一下,或者有没有做过数据保存的,一起交流一下。《arduino程序设计基础》有一个SD保存温湿度的例子,我借鉴了作者的方法,但是我是要存串口收到的字符到SD卡,不是传感器数据。最近程序改来改去,也一直未实现。保存传感器数据可以,但是保存串口数据就不行。
发现程序中设置SD文件名小写,实际SD中文件名是大写形式。
  1. File myFile;
  2. char inByte;         // incoming serial byte

  3. void setup()
  4. {
  5.     Serial.begin(1200,SERIAL_8E2);
  6.   while (!Serial) {
  7.     ;
  8. }
  9.   pinMode(10, OUTPUT);

  10.   if (!SD.begin(4)) {
  11.         return;
  12.   }
  13. }

  14. void loop()
  15. {
  16.    myFile = SD.open("test01.txt", FILE_WRITE);
  17.    if (myFile)
  18.    {
  19.      
  20.    if (Serial.available() > 0)
  21.      {
  22.        inByte = Serial.read();
  23.        Serial.println(inByte,HEX);
  24.        myFile.println(inByte,HEX);
  25.         }
  26.    
  27.    delay(500) ;   
  28.   }
  29. }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

 楼主| 发表于 2016-8-19 16:07:16 | 显示全部楼层
收到的字符

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-19 17:41:57 | 显示全部楼层
目前SD卡可以写入串口收到的数据,但是数据不对,可能和程序这边设置有关,后续还要考虑文件定时存储和文件名文件自动创建命名问题

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2016-8-20 01:24:42 | 显示全部楼层
本帖最后由 darkorigin 于 2016-8-20 01:26 编辑

个人觉得:
1、 第19行   myFile = SD.open("test01.txt", FILE_WRITE); 可以放到14行后面做个ELSE
这样不用每个循环都重新打开文件,浪费系统资源。


  1. File myFile;
  2. char inByte;         // incoming serial byte

  3. void setup()
  4. {
  5.     Serial.begin(1200,SERIAL_8E2); // "_8E2"是个什么鬼?
  6. //  while (!Serial) {  ; }    这句话有点不知所谓,判断了不执行任何语句
  7.   pinMode(10, OUTPUT);
  8.    myFile = SD.open("test01.txt", FILE_WRITE);    //你这里不打开 后面的语句咋生效呢?
  9. // if (!SD.begin(4)) {  return;  }  其实并不需要return SETUP()函数自动终止的.
  10. }

  11. void loop()
  12. {
  13. //  myFile = SD.open("test01.txt", FILE_WRITE);
  14. //   if (myFile) //这里myfile是一个 FILE类型的值,并不是逻辑值这个判断是否有必要?
  15. //   {
  16. //     
  17.    if (Serial.available() > 0)
  18.      {
  19.        inByte = Serial.read();
  20.        Serial.println(inByte,HEX);
  21.        myFile.println(inByte,HEX);
  22.        }
  23.     delay(500) ;   
  24. // }
  25. }
复制代码


个人从代码优化的角度做的修改和备注,如果执行之后还是有错误,考虑是否硬件有问题.
过多过于复杂的判断 会影响代码的效率,本来几十步的流程弄成几百步,就显得有点啰嗦,执行起来也会容易出各种小问题.
代码尽量逻辑清晰,复杂问题简单化是编程的目的.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-20 08:37:16 | 显示全部楼层
darkorigin 发表于 2016-8-20 01:24
个人觉得:
1、 第19行   myFile = SD.open("test01.txt", FILE_WRITE); 可以放到14行后面做个ELSE
这样不 ...

你好,回复如下
Serial.begin(1200,SERIAL_8E2); // "_8E2"是个什么鬼? 这个是设置8个数据位,偶校验,2个停止位,因为我的另一个发送端的单片机数据是这种通信格式
//  while (!Serial) {  ; }    这句话有点不知所谓,判断了不执行任何语句   这个是”wait for serial port to connect. Needed for Leonardo only”,等待串口连接,适于Leonardo,可以省去
if (!SD.begin(4)) {  return;  }  其实并不需要return SETUP()函数自动终止的. 这个是IDE自带的SD例程都有的,本来有println()输出信息的,我省略了
if (myFile) //这里myfile是一个 FILE类型的值,并不是逻辑值这个判断是否有必要?  我觉得myfile这里指test01.txt文件,有的话就顺序执行,没有跳过,IDE例程中也是这么判断的
回复 支持 反对

使用道具 举报

发表于 2016-8-20 09:52:53 | 显示全部楼层
这个串口传输数据是需要时间的,相对于SPI总线来说是非常漫长的,所以我建议,如果检测到串口数据,等待1毫秒,然后判断收到的数据长度,先存入字符串或者字符数组,再进行文件存储,这样会好很多。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-20 10:15:57 | 显示全部楼层
迷你强 发表于 2016-8-20 09:52
这个串口传输数据是需要时间的,相对于SPI总线来说是非常漫长的,所以我建议,如果检测到串口数据,等待1毫 ...

好。我的数据长度是固定的,每串数据有23字节,后面准备加一个缓冲区将字符存入,再写入SD卡
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-22 11:28:46 | 显示全部楼层
darkorigin 发表于 2016-8-20 01:24
个人觉得:
1、 第19行   myFile = SD.open("test01.txt", FILE_WRITE); 可以放到14行后面做个ELSE
这样不 ...

myFile = SD.open("test01.txt", FILE_WRITE);  
按你的将这一句放到setup()里面,结果测试SD卡没有新建的test01文件
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-5-4 01:47 , Processed in 0.039318 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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