SD卡写文件-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8646|回复: 11

SD卡写文件

[复制链接]
发表于 2013-3-18 15:49 | 显示全部楼层 |阅读模式
问题:使用串口工具写的数据正常写入txt文件,而C编写的串口有时可以有时不行,付代码,求大神指点。

代码:
//============================
#include <SD.h>
File myFile;
char text[200];
int i= 0;
void setup()
{
   Serial.begin(9600);
if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
}

void loop(){

   while(!(Serial.available()> 0)){
    ;
  }
    Serial.readBytes(text,200);

   Serial.print("Initializing SD card...");
  myFile = SD.open("test.txt",FILE_WRITE);
  if(myFile){
   Serial.println(text);
    myFile.print(text);
    myFile.close();
    Serial.println("done.");
  } else {
   Serial.println("error opening test.txt");
  }
  memset(text,0,200);
  delay(1000);
}


//======================================
C程序
sprintf(outBuffer,"hello 中国!");
        PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);
        bWriteStat = WriteFile(hCom,outBuffer,len,&len,NULL);


发表于 2013-3-18 16:14 | 显示全部楼层
先检查下接收到没,到底是接收了没写入,还是就没接收到
 楼主| 发表于 2013-3-18 16:20 | 显示全部楼层
coloz 发表于 2013-3-18 16:14
先检查下接收到没,到底是接收了没写入,还是就没接收到

可是串口被占用了,有什么好方法能看到吗
发表于 2013-3-18 17:48 | 显示全部楼层
strugglehao 发表于 2013-3-18 16:20
可是串口被占用了,有什么好方法能看到吗

不一样要用串口输出来检测啊~  比如你判断下数据是否和发送来的一致,一致就点亮13脚上的LED
 楼主| 发表于 2013-3-18 19:04 | 显示全部楼层
coloz 发表于 2013-3-18 17:48
不一样要用串口输出来检测啊~  比如你判断下数据是否和发送来的一致,一致就点亮13脚上的LED ...

谢谢。检测过了,不用SD的功能C程序实现的串口可以正常传输,加上Sd卡后,IDE自带的串口发送的数据成功记录,C程序写的还是不行。。。感觉是SD卡的原因,但又不知道具体是怎么回事
 楼主| 发表于 2013-3-18 19:06 | 显示全部楼层
coloz 发表于 2013-3-18 17:48
不一样要用串口输出来检测啊~  比如你判断下数据是否和发送来的一致,一致就点亮13脚上的LED ...

把SD卡的初始化放在setup()里还是不行。。

#include <SD.h>
File myFile;
char text[200];
int readlen = 0;
//int led = 13;
void setup()
{
   Serial.begin(9600);
  // pinMode(led, OUTPUT);
  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
//

}

void loop(){
  
  while(!(Serial.available()> 0)){
   ;
  }
    //Serial.readBytes(text,200);
  if(Serial.available()){
    readlen = Serial.readBytes(text,200);
    while(readlen>0){
      readlen = Serial.readBytes(text+readlen,200);
    }
    /*if(text[0]=='Y'){
        digitalWrite(led, HIGH);
    }
     else{
        digitalWrite(led, LOW);
     }*/
     // delay(1000);
  
  
  // Serial.print("Initializing SD card...");
  myFile = SD.open("test.txt",FILE_WRITE);
  if(myFile){
   // Serial.print("Writing to test.txt...");
   //Serial.println(text);
    myFile.print(text);
    myFile.close();
    Serial.println("done.");
  } else {
   Serial.println("error opening test.txt");
  }
  memset(text,0,200);
  delay(1000);
  }
}
发表于 2013-3-19 01:54 | 显示全部楼层
不明白c编写的串口不能正常是什么意思,是读其他单片机的串口? 可以这样试试 首先将另外的那个加上延时 发送一段数据延时一会 以防止这边数据接收后写入数据操作太慢,处理不及时,看这边的情况 另外 我觉得你下边的这个代码似乎有点问题。while(readlen>0){
      readlen = Serial.readBytes(text+readlen,200);这是从串口读数据 如果有持续数据发送的话 你这读取两百个字节似乎返回值是实际读取的长度 是个随机值吧 只要不是0,就一值读数,出不来while循环,是不是会覆盖text的乃荣,而且text+lenth合法吗,不确定。 即便是 lenth确定的 你是不是以为会一次减1.那也是倒序存储的
    }   反正我是觉得这个地方有问题。而且定义200的buffer是不是有点大,buffer按照官网定义 是64个buffer也就是独到的aviable返回值最大64?也不确定 呵呵 建议将发送端的发送频率降低下 第一段代码还行吧 共同交流
 楼主| 发表于 2013-3-19 11:30 | 显示全部楼层
一嗰亾瀞瀞 发表于 2013-3-19 01:54
不明白c编写的串口不能正常是什么意思,是读其他单片机的串口? 可以这样试试 首先将另外的那个加上延时 发 ...

是 C语言写的串口程序想Arduino发数据,后者不能将数据写入SD卡。。代码的问题说的很对。谢谢
 楼主| 发表于 2013-3-19 19:03 | 显示全部楼层
一嗰亾瀞瀞 发表于 2013-3-19 01:54
不明白c编写的串口不能正常是什么意思,是读其他单片机的串口? 可以这样试试 首先将另外的那个加上延时 发 ...

补充:将Arduino断电后,C应用程序向其中写数据ok;普通的串口助手每次都可以成功将数据写入SD卡。。。是不是初始化的时候有问题,没思路,望大神指点
发表于 2013-3-19 23:53 | 显示全部楼层
strugglehao 发表于 2013-3-19 19:03
补充:将Arduino断电后,C应用程序向其中写数据ok;普通的串口助手每次都可以成功将数据写入SD卡。。。是 ...

Arduino断电??不太明白
你试试 把程序更改一下 接收到数据之后 先从串口输出 看看接收到额数据是否正确 (和你另一个的发送的数据对照) 换其他的函数 Serial.readBytesUntil(character, buffer, length) 试试 在你串口发送的那边加上校验位 使用这个试试
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-12-28 15:29 , Processed in 0.078231 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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