2015/03/19

LinkIt ONE:儲存媒體(內部Flash與外插Micro SD卡)

LinkIt ONE板子內部已有16MB Flash,其中系統已規劃用去6MB,這一點我不太確定,規格書寫著有10MB可供使用者儲存資料;另可外插Micro SD記憶卡,容量最大支援32GB。

下圖是Micro SD卡插入前、中、後的模樣,插槽有彈簧,應可簡單分辨是否插好。

把三個指撥開關切換到正確位置,詳細意義請見「LinkIt ONE:安裝軟體開發環境」,若把1切到SD,2切到MS,那麼連接電腦後,可看到兩台可卸除式磁碟機。這一篇應把1切到SD,代表想外插Micro SD卡,2切到UART,代表一般模式,將在程式裡進行讀寫存取。
LinkIt ONE API裡,父類別LDrive有子類別LSDClass與LFlashClass,而且已預設建立物件LSD和LFlash,分別用來存取SD卡和內部Flash,以之開啟檔案取得LFile物件,便可存取。

底下程式碼從序列埠接收資料,使用LFlash開啟檔案並寫入。

#include <LFlash.h>
#define BAUDRATE 19200
#define LED_PIN 13

void setup(){
  Serial.begin(BAUDRATE);
  Serial.setTimeout(1000);
  pinMode(LED_PIN, OUTPUT);
  if(LFlash.begin()){       // 初始化LFlash
    Serial.println("Flash ok");
    digitalWrite(LED_PIN, HIGH);
  }
  else{
    Serial.println("Flash fail");
    digitalWrite(LED_PIN, LOW);
  }
}

void loop(){
  char d[64+1+1];
  int len;
  LFile f;
  while(Serial.available()){    // 接收資料
    len = Serial.readBytesUntil('\n', d, 64);
    d[len] = '\n';
    d[len+1] = '\0';
    Serial.print(d);     // 回送到序列埠


    f = LFlash.open("data.txt", FILE_WRITE); // 開檔
    f.write(d); // 寫入
    f.close(); // 關檔
  }
}


以寫入模式FILE_WRITE開檔時,若檔案不存在會自動建立空的新檔,若檔案已存在,會開啟該檔,讀寫位置會從檔案結尾開始,所以下一次再開檔的話,寫入資料會附加在後。

開啟序列埠監控視窗,行結尾設為「New line」 ,輸入一些資料,按下Enter送出。
然後關閉板子電源,把指撥開關2切到MS,重新連接電腦,便可從檔案總管裡看到該檔。
開啟該檔,成功囉。因為行結尾設為「New line」,所以會出現如下的實心黑框。
接下來要試著印出某目錄裡的東西,先在Micro SD卡中建立子目錄mp3,並放入一些歌曲。
然後,程式碼如下:
#include
#define BAUDRATE 19200

void setup(){
  Serial.begin(BAUDRATE);
  LSD.begin();
}
void printSpace(int indent){
  int i;
  for(i = 0; i < indent; i++){
    Serial.print(' ');
  }
}
void printD(const char *path){
  LFile f = LSD.open(path, FILE_READ); // 開檔

  if(f.isDirectory()){ // 判斷是不是個目錄
    LFile subf;
    Serial.println(f.name()); // 印出目錄名

    // 呼叫openNextFile可依序得到該目錄底下的東西
    while(subf = f.openNextFile(FILE_READ)){
      printSpace(4);
      Serial.println(subf.name());
      subf.close();
    }
  }

  f.close();
}
void loop(){
  printD("/mp3"); // 想印出目錄的路徑
  Serial.println("---------------------");
 
  delay(5000);
}


輸出如下:

8 comments:

  1. 您好:
    我從您這個例子要執行"字串"寫入時,在:"f.write(d)://寫入"這行程式發生問題。
    請問:是否因為您範例的資料格式是int,而我是"字串"的原因?
    如因為字串造成問題,能否請問要如何寫入flash裡?
    謝謝!

    ReplyDelete
    Replies
    1. 發生什麼問題?

      write應可接受字串。

      Delete
  2. 我也不是很清楚,不過編譯器上的錯誤訊息顯示:no matching function for call to 'LFile::write(String&)'
    可以請問這是哪裡有問題嗎?
    謝謝您!

    ReplyDelete
    Replies
    1. write不能接受String。

      改成write(s.c_str()); 試試吧,
      其中s是String物件。

      Delete
  3. 您好:
    您說write不能接受String。
    那我如果要在寫入的txt裡看到的是一組一組的資料(由UART傳入),
    是不是要把傳入的資料先拆開,一個一個存到flash,待資料長度確定後,在換行存入?

    ReplyDelete
  4. 您好:
    後來我試了一下終於搞懂資料型態了,謝謝您的指導^^

    ReplyDelete