Robofun 機器人論壇

標題: 我想知道有無方法只讀取SD卡內任何一檔案裡面的最後一筆... [打印本頁]

作者: kenko    時間: 2018-6-4 16:26
標題: 我想知道有無方法只讀取SD卡內任何一檔案裡面的最後一筆...
我想知道有無方法只讀取SD卡內任何一檔案裡面的最後一筆...
作者: 超新手    時間: 2018-6-4 16:57
本帖最後由 超新手 於 2018-6-4 17:26 編輯

先用 size() 取得檔案的總長度,
然後用此長度減去一筆資料的長度
然後用 seek(x) 去設檔案指標
然後再讀即可
例如
File file;
file = SD.open("test.txt", FILE_READ);
unsigned long l = file.size();
// 假設你所謂的"一筆資料"是 4 BYTES
if(l >= 4) {
file.seek(l-4);
unsigned char buf[4];
file.read(buf, 4);
}
一筆資料的長度只有你知道, 不一定是我寫的 4
可別照抄


作者: kenko    時間: 2018-6-6 16:12
感謝~~我試試!再麻煩妳喔~~
作者: kenko    時間: 2018-6-6 16:30
請問資料是存哪裡?
Serial.println(file);
OR
Serial.println(buf);
作者: 超新手    時間: 2018-6-6 16:51
Serial.println(buf[0]);
Serial.println(buf[1]);
Serial.println(buf[2]);
Serial.println(buf[3]);
你會問這個問題.....表示你還不太了解
基本上, 你要取代以下的程式
unsigned char buf[4];
file.read(buf, 4);
變成為你自己的程式, 而不是照抄
因為只有你才知道一筆資料佔多少個bytes
作者: kenko    時間: 2018-6-11 10:09
感謝~~

作者: kenko    時間: 2018-6-12 14:33
SORRY ~~我這邊測出來file.size()結果L是請問?我還須修正甚麼嗎?不好意思新手~~所以問題較多!!
作者: kenko    時間: 2018-6-12 14:39
SORRY ~~我這邊測出來file.size()結果L是0   請問?我還須修正甚麼嗎?不好意思新手~~所以問題較多!!
作者: 超新手    時間: 2018-6-12 14:41
看不懂你說什麼?
我這邊測出來file.size()結果L是請問?
作者: kenko    時間: 2018-6-12 16:06
file.size()已經對了~~但是內容(數字)不對~~
Serial.println(buf[0]);
Serial.println(buf[1]);
Serial.println(buf[2]);
Serial.println(buf[3]);
作者: 超新手    時間: 2018-6-12 16:27
1) 正確的值是多少? 印出來的值又是什麼?
2) 一筆資料是多少個 BYTES

不過....叫你改掉的這部份
你還是照抄
錯也是正常的





作者: kenko    時間: 2018-6-13 14:01
1) 正確的值是多少? 169 印出來的值又是什麼? 49,54,57,13,10
2) 一筆資料是多少個 BYTES ? 100000 最多;ˊ6個BYTES
作者: 超新手    時間: 2018-6-13 15:15
本帖最後由 超新手 於 2018-6-13 15:56 編輯

從資料來看,  其實是沒錯的
49,54,57,13,10  就是 "169\r\n"
也就是
1 的 asdii code是 49
6 的 asdii code是 54
9 的 asdii code是 57
\r 的 asdii code是 13
\n 的 asdii code是 10

所以你只要改個方式列印出來即可
把 println 改成 write
  Serial.write(buf[0]);
  Serial.write(buf[1]);
  Serial.write(buf[2]);
  Serial.write(buf[3]);
  Serial.write(buf[4]);


作者: kenko    時間: 2018-6-14 08:21
請問,我能把它變成INT 或LONG 拿進ARDUINO 繼續使用嗎 ?

作者: kenko    時間: 2018-6-14 08:30
只剩下這一部即可完成 ,我想要的~~~感恩!!
作者: 超新手    時間: 2018-6-14 08:32
本帖最後由 超新手 於 2018-6-14 10:13 編輯

int x = atoi(buf);
就可以把字串變整數
但要注意的是,
buf 必須是合法的字串(廢話?)
你提的這個例子, 剛好是字串, 所以才能用

作者: kenko    時間: 2018-6-14 14:14
謝謝您~~已經完成我想要的了!!
感恩您~~
作者: kenko    時間: 2018-6-19 08:37
抱歉~~再提問一下!! 由於 char 的極限 為32767 如果 我要用 LONG的話如何修正?
作者: 超新手    時間: 2018-6-19 09:55
本帖最後由 超新手 於 2018-6-19 12:57 編輯

不是 char, 而是 int, int 範圍 32767 ~ - 32768
改用
long x = atol(buf);
注意!
原本是用 atoi
要改成 atol  ,
作者: kenko    時間: 2018-6-19 14:19
也就是說: 也就是說我的數字會大於10萬就是32768以上~~因此要用LONG可以嗎?

作者: kenko    時間: 2018-6-19 14:36
我指的是讀取的部分用char

unsigned char buf[4]; 可以改為 long 嗎?
作者: 超新手    時間: 2018-6-19 14:51
本帖最後由 超新手 於 2018-6-19 15:12 編輯

不行!
因為你存檔時, 就是用字串 (char) 去存檔
所以讀檔時, 只能先讀字串, 再轉成數字

除非存檔時用數字存(二進位檔), 讀檔才能用數字(如long)去讀
存檔, 讀檔兩邊要一致才可以


作者: kenko    時間: 2018-6-19 15:02
了解~~~感謝您!!!
該程式已完成~~

謝謝您~幫我一個大忙!!





歡迎光臨 Robofun 機器人論壇 (https://www.robofun.net/forum/) Powered by Discuz! X3.2