suoma 发表于 2016-8-19 15:56:20

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

接收另一个单片机串口发送的数据,存入SD卡,并在串口将字符输出,程序中将接收的字符以HEX形式显示,如下

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

void setup()
{
    Serial.begin(1200,SERIAL_8E2);
while (!Serial) {
    ;
}
pinMode(10, OUTPUT);

if (!SD.begin(4)) {
      return;
}
}

void loop()
{
   myFile = SD.open("test01.txt", FILE_WRITE);
   if (myFile)
   {
   
   if (Serial.available() > 0)
   {
       inByte = Serial.read();
       Serial.println(inByte,HEX);
       myFile.println(inByte,HEX);
      }
   
   delay(500) ;   
}
}

suoma 发表于 2016-8-19 16:07:16

收到的字符

suoma 发表于 2016-8-19 17:41:57

目前SD卡可以写入串口收到的数据,但是数据不对,可能和程序这边设置有关,后续还要考虑文件定时存储和文件名文件自动创建命名问题

darkorigin 发表于 2016-8-20 01:24:42

本帖最后由 darkorigin 于 2016-8-20 01:26 编辑

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


File myFile;
char inByte;         // incoming serial byte

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

void loop()
{
//myFile = SD.open("test01.txt", FILE_WRITE);
//   if (myFile) //这里myfile是一个 FILE类型的值,并不是逻辑值这个判断是否有必要?
//   {
//   
   if (Serial.available() > 0)
   {
       inByte = Serial.read();
       Serial.println(inByte,HEX);
       myFile.println(inByte,HEX);
       }
    delay(500) ;   
// }
}


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

suoma 发表于 2016-8-20 08:37:16

darkorigin 发表于 2016-8-20 01:24 static/image/common/back.gif
个人觉得:
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毫秒,然后判断收到的数据长度,先存入字符串或者字符数组,再进行文件存储,这样会好很多。

suoma 发表于 2016-8-20 10:15:57

迷你强 发表于 2016-8-20 09:52 static/image/common/back.gif
这个串口传输数据是需要时间的,相对于SPI总线来说是非常漫长的,所以我建议,如果检测到串口数据,等待1毫 ...

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

suoma 发表于 2016-8-22 11:28:46

darkorigin 发表于 2016-8-20 01:24 static/image/common/back.gif
个人觉得:
1、 第19行   myFile = SD.open("test01.txt", FILE_WRITE); 可以放到14行后面做个ELSE
这样不 ...

myFile = SD.open("test01.txt", FILE_WRITE);
按你的将这一句放到setup()里面,结果测试SD卡没有新建的test01文件
页: [1]
查看完整版本: 串口有输出,SD卡无数据写入