Robofun 機器人論壇

 找回密碼
 申請會員
搜索
熱搜: 活動 交友 discuz
查看: 6876|回復: 19

如何用SD卡建立多個檔名有規律的.TXT檔案

[複製鏈接]
發表於 2016-7-13 13:01:27 | 顯示全部樓層 |閱讀模式
目前想要做多個排序名稱來命名.TXT(例如1.TXT 2.TXT 3.TXT....等)
但是用myFile = SD.open("1.txt", FILE_WRITE); 這指令
要怎麼改成可以自己新增2.TXT 3.TXT...等檔案?
發表於 2016-7-13 16:18:40 | 顯示全部樓層
方法很多
  char FileName[8] = "1.txt";
  for(FileName[0] = '1' ;FileName[0] < '5' ; FileName[0]++) {
    if (SD.open(FileName, FILE_WRITE)) {


    }
  }
 樓主| 發表於 2016-7-20 10:17:05 | 顯示全部樓層
本帖最後由 thuthu94 於 2016-7-20 10:52 編輯

回復 2# 超新手

目前又卡關了
改了資料後變成可以創新檔案但是無法寫入資料
附上檔案
void loop()
{
  char FileName[8] = "0.txt";
  for(FileName[0] = '0' ;FileName[0] < '5' ; FileName[0]++) {
    if (SD.open(FileName, FILE_WRITE)) {
      Serial.print("Writing to ");
      Serial.println(FileName);
      for (int i=0; i <= 10; i++){
        sensorValue = analogRead(analogInPin);
        myFile.println(sensorValue);   
        Serial.println(sensorValue);
        delay(300);
      }  
      myFile.close();
      Serial.println("done.");
    }
    else {
      Serial.print("error opening ");
      Serial.println(FileName);
    }
  }


}
發表於 2016-7-20 10:21:46 | 顯示全部樓層
myFile=SD.open(FileName, FILE_WRITE);
 樓主| 發表於 2016-7-20 10:53:59 | 顯示全部樓層
回復 4# 超新手


   這跟   if (SD.open(FileName, FILE_WRITE)) {

的功能不一樣嗎??
發表於 2016-7-20 11:19:31 | 顯示全部樓層
myFile=SD.open(FileName, FILE_WRITE)
if (myFile) {
      Serial.print("Writing to ");
 樓主| 發表於 2016-7-22 13:24:38 | 顯示全部樓層
回復 6# 超新手

感謝教導
另外詢問一下檔案格式問題
是只能用.TXT檔案嗎?因為想要做曲線圖表
想用Excel存取檔案
但是好像無法直接存取....
還是說有其他的檔案格式可以用?
發表於 2016-7-22 16:35:17 | 顯示全部樓層
本帖最後由 超新手 於 2016-7-22 16:36 編輯

把副檔名 .txt 改成 .xls , excel 就可以讀了
如果資料只有一行, 就直接存
123\r\n
124\r\n
如果資料有n行, 中間就要分隔符號( tab, 逗點, 空白皆可)
123,234,123\r\n
124,235,23\r\n
自己先用記事本來練習
先寫個小文件後, 把副檔名改成 XLS
然後用 EXCEL 開
當然 EXCEL 初步會看不懂, 但它會問你一大堆問題
見招拆招, 就可以成功開啟該 .XLS(.TXT)

註:\r\n只是換行, 不要照著打
 樓主| 發表於 2016-8-1 09:09:50 | 顯示全部樓層
回復 8# 超新手


   試過用以上的方法了
是可以用了但是好像無法直接用ARDUINO去直接創個
.xls對吧?
執行後會顯示錯誤
發表於 2016-8-1 09:10:49 | 顯示全部樓層
什麼錯誤?
 樓主| 發表於 2016-8-1 09:46:24 | 顯示全部樓層
回復 10# 超新手


   有了 抱歉!!
發現是自己搞烏龍
 樓主| 發表於 2016-8-2 10:56:09 | 顯示全部樓層
另外一直用不出來在EXCEL上把資料分成兩隔(左右兩邊)
目前程式
        Serial.print("value,");
        myFile.print("value,");
        Serial.println(sensorValue);
        myFile.println(sensorValue);

一個是固定要顯示的 一個是感測器測量到的值
想要分別歸類在左右兩格
但目前不管怎樣用就是會再同一格顯示value,XXX
發表於 2016-8-2 12:20:31 | 顯示全部樓層
1.jpg
出現此畫面時, 把逗點也打勾即可
另外, 要先開 EXCEL, 再使用開啟舊檔去開啟檔案
不要用DOUBLE CLICK 去開檔
 樓主| 發表於 2016-8-3 09:47:19 | 顯示全部樓層
本帖最後由 thuthu94 於 2016-8-3 09:49 編輯

問個指令問題  char FileName[8] = "1.TXT";
  for(FileName[0] = '1' ;FileName[0] < '8' ; FileName[0]++) {


請問一下紅色的那個8是什麼意思
另外綠色的部分後面最多可以寫<多少?
昨天試了好幾次 感覺不能寫太多 不然檔案會砍不掉(要從新格式化才能)
發表於 2016-8-3 10:04:37 | 顯示全部樓層
本帖最後由 超新手 於 2016-8-3 10:05 編輯

>>請問一下紅色的那個8是什麼意思
沒什麼, 亂寫的. 基本上只要大於6即可(也就是1.txt 5 個字加結束字元)
其實不用寫就可以了
char FileName[] = "1.TXT";
>>另外綠色的部分後面最多可以寫<多少?
'0'~'9', 'A'~'Z', 'a'~'z' 都可以, 只要合乎檔案命名規則即可
也可以用其他方法, 就可以無窮多
我只是用最簡單的方式
>>昨天試了好幾次 感覺不能寫太多 不然檔案會砍不掉(要從新格式化才能)
寫的過程中要看看有沒有成功,
可能是沒寫成功, 導致檔案格式錯誤
 樓主| 發表於 2016-8-3 10:11:05 | 顯示全部樓層
for(FileName[0] = '1' ;FileName[0] < '8' ; FileName[0]++) {
那如果一上面這個指令來看
檔名達到8.TXT時
我想要砍1.TXT的檔案(好為下一次紀錄檔案 就是覆蓋過去的意思)
達到1.TXT時想砍2.TXT  為3.TXT砍4.TXT......以此類推
我該怎麼搭配這指令用SD.remove("?.txt");
 樓主| 發表於 2016-8-3 10:21:29 | 顯示全部樓層
回復 16# thuthu94


   我想到可以用 switch…case來寫
但是前面判斷是寫
case '?.TXT' 來當判斷式嗎?:
發表於 2016-8-3 10:41:05 | 顯示全部樓層
>>case '?.TXT'
不行吧, CASE只能用字元, 數字

這樣就可以開 3 萬個檔了
  char FileName[32];
  for(int u = 0 ; u < 30000 ; u++) {
    sprintf(FileName, "%d.TXT", u);
  ....................
  }
發表於 2016-8-3 12:45:53 | 顯示全部樓層
>>我該怎麼搭配這指令用SD.remove("?.txt");
只要用一個變數切換, 兩個檔互切
unsigned char Toggle;
while(1) {
  if(Toggle) {
    Toggle = 0;
    SD.open("1.txt", FILE_WRITE);
    SD.close();
    SD.remove("2.txt");
  }
  else {
    Toggle = 1;
    SD.open("2.txt", FILE_WRITE);
    SD.close();
    SD.remove("1.txt");
  }
}
 樓主| 發表於 2016-8-3 14:58:31 | 顯示全部樓層
回復 19# 超新手


   感謝!!這樣就可以做些大筆的簡單數據紀錄

另外case目前解決的方法是用
在void setup()內先設定X=1
在void loop()內的書寫資料底下加入
     switch(x)           //把舊資料刪除      {
      case 1:
        Serial.println("Removing 4.TXT....");
        SD.remove("4.TXT");
        break;
      case 2:
        Serial.println("Removing 5.TXT...");
        SD.remove("5.TXT");
        break;
      case 3:
        Serial.println("Removing 6.TXT...");
        SD.remove("6.TXT");
        break;
     ......................
     ......................
      default:
        ;  
      }


      x ++;  


      if (x > 7)        \\迴圈
        {
          x = 1;
        }
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

小黑屋|手機版|Archiver|機器人論壇 from 2005.07

GMT+8, 2024-3-29 10:29 , Processed in 0.236779 second(s), 9 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表