SD Card чтение как байт,слово

RANDREY
Offline
Зарегистрирован: 10.06.2012

Добрая ночь. Подключив наконец-то шилд, пытаюсь читать как байты (byte) и слова (word) c файла с файла. Читать числа как текст не интересно (char=) - большой текстовой файл.

Подготовил 2 файла

В первом 1(byte),2(word),3(byte),4(byte). Во втором 0(byte),255(word),0(byte),255(byte).

Тестирую их на чтение. В ини , далее открытие файла, проходит успешно

byte C;
word D;

в теле проверяю

    lcd.setCursor(0,0);  
    C=myFile.read();
    lcd.print (C); 
    
    lcd.setCursor(0,1);  
    C=myFile.read();
    lcd.print (C); 

    lcd.setCursor(0,2);  
    C=myFile.read();
    lcd.print (C); 

    lcd.setCursor(0,3);  
    C=myFile.read();
    lcd.print (C); 
 Читаю как байты, потому что думаю? что D=myFile.read(); работает не корректно.

В итоге получаю в первом случае 1,83,2,0, во втором 0,83,255,0.

Какое-то слабое подобие данных, ожидалось вроде 1,0,2,0 (или 1,2,0,3) и 0,0,255,0 (или 0,255,0,255) в зависимости какая очередность lowbyte/hightbyte

maksim
Offline
Зарегистрирован: 12.02.2012

Как вы подтовили файл, а точнее как вы в файл записали не символы?

И покажите весь код программы, потому как неизвестно что вы там читаете на самом деле.

RANDREY
Offline
Зарегистрирован: 10.06.2012

я умею на делфи - там и подготовил, там же проверил файл на чтение, результаты чтения в ListBox. Все совпадает.

выдрал относящее к чтению, сверху меню выбора, далее джам на блок чтения

#include <SD.h>

File myFile;
byte C;
word D;

loop>>>>
lcd.begin(20, 4); // указываем размерность экрана и начинаем работать 
pinMode(53, OUTPUT); // INI SD CARD
...
sdd:  //читаем карточку  
   if (!SD.begin(53)) {
     lcd.setCursor(0, 1);
     lcd.print ("ini SD fail");
     delay(5000);  
     return;
                      }
    lcd.setCursor(0, 0);
    lcd.print ("SD Card: SD up");
    myFile = SD.open("1.pat", FILE_READ);
// если файл нормально открылся, то читаем его:
  if (myFile) {
    lcd.setCursor(0, 1);
    lcd.print ("read SD");
    lcd.clear();
   lcd.setCursor(0,0);  

C=myFile.read();
lcd.print (C);   
cd.setCursor(0,1);  
C=myFile.read();
 lcd.print (C); 
 lcd.setCursor(0,2);  
C=myFile.read();
lcd.print (C); 
 lcd.setCursor(0,3);  
C=myFile.read();
lcd.print (C); 

 

maksim
Offline
Зарегистрирован: 12.02.2012

Вы выводите на дисплей кашу, а точнее только первые младшие разряды от байтов, так как все стальные затираются последующими прочитанными байтами.

RANDREY
Offline
Зарегистрирован: 10.06.2012

нашел ошибку, она не в скретче, в моей проге для подготовки данных, проверил на запись чисел 255,655535 в файл.

Вместо 3 байт в файле был не текст "яяя" было "яSяя", т.е 4 байта. "S" - это char(83)?!

проверил просто, вставив строку

var
p:^TRes
pp:TRes;
...// открытие файла,запись данных
showmessage(intToStr(sizeof(pp))); //  оказалось =4!
for a:=0 to LIST.Count-1 do begin
p:=List.Items[a];
pp:=p^;
T.WriteBuffer(p,sizeof(pp));
                            end;



type // хотя объявлено как 3 байта
TRes = record 
ccs:byte;
doc:word; 
end;
Вывод переделывать свою прогу на свежую голову...

 

maksim
Offline
Зарегистрирован: 12.02.2012

Тем не мение на дисплей будет выводиться только первый разряд байта.

RANDREY
Offline
Зарегистрирован: 10.06.2012

там обработка чисел, вывод только результатов. А выше заглушка для теста чтения, реальные ли числа читаются.

Уже на другом форуме подсказали при указании типов указывать "packed record" тогда запись типа будет в 3 байта, и при сохранении в файл занимать 3 байта, без левых байт, которые и читала Ардуина 1, 83, 2, 0

RANDREY
Offline
Зарегистрирован: 10.06.2012

приделываю выбор файлов

myFile = SD.open(inttostr(nomerfile)+".txt", FILE_WRITE);

есть аналог int/byte/word в string массив в среде ?

leshak
Offline
Зарегистрирован: 29.09.2011

>>есть аналог int/byte/word в string массив в среде ?

Есть. sprintf

Только - не нужно и тяжеловестно.

LCD.print сам умеет прекрасно выводить цифру. Главное - научитесь из отдельных байтов собирать число.
Примерно так:

int val= (hiByte<<8) | loByte

Или через указатели, аналогично тому как вы у себя в дельфи делаете. Поищите, не раз тема поднималась/обсуждалась. И при работе с SD, и при работе с EEProm, и ветках вида "как передать число в Serial". Вообщем везде где "нужно передать/прочитать" тип из нескольких байтов, а доступны только write/read/readBytes
 

leshak
Offline
Зарегистрирован: 29.09.2011

Кстати, если будете работать "через указатели", то можете читать/собирать не отдельные числа, а сразу структуру struct (C programming language) - Wikipedia, the free encyclopedia

Это аналог вашего дельфийского record. Так что код будет более "идеологически идентичным" с обих сторон SD-карты :)

RANDREY
Offline
Зарегистрирован: 10.06.2012

спасибо, пока обошелся sprintf, позже если будет время прикручу нормальный выбор файлов из каталога или печатать имя файла