While not EoL для ардуино

gooroong
gooroong аватар
Offline
Зарегистрирован: 08.03.2015

Здравствуйте Уважаемые.

Такое дело, я никак не могу понять, как работать с файлами (чтение). В паскале, который я знаю и использую для "всяких нужд" это решается просто while not EoL или EoF.

Я нашел описание библиотеки SD, где описывается чтение read как побайтное чтение пока файл avaiable.

Вопросы:

1. Как мне понять конец строки?

2. Есть ли методы чтения integer или float из файла. Если нет, то какие команды конвертируют string в integer. Лучвше всего, если вы кинете в меня примером чтения массива byte из файла до конца строки.

Большое спасибо за помощь!

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

1

2


gooroong
gooroong аватар
Offline
Зарегистрирован: 08.03.2015

то есть, насколько я понял, мне надо написать вот так

string STR;
int A;
while (myFile.available()) {
  STR='';
  while (myfile.peek!=CR) {//тут вместо CR надо бы вписать что-то другное или так сработает?
    if (myfile.peek!=CR) {
      STR=STR+Serial.read(myFile.read());
    } else {
      Serial.read(myfile.read());
    }
  }
  A=atoi(STR);
}

на паскале это бы прокатило, а Ваши подробные объяснения помогли ровно настолько ;-)

 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

"Перевод строки" это два символа с кодами $0A и $0D, в си это записывается 0x0A и 0x0D или '\r' и '\n' .  Стандвртных функций чтения строк у ардуино не встречал.

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

И на паскале это бы не прокатило, это что за конструкция  Serial.read(myfile.read()) ?

gooroong
gooroong аватар
Offline
Зарегистрирован: 08.03.2015

Уважаемый Максим, я допустил ошибку, надо было бы написать

STR=STR+myFile.read();

я взял эту строку из какого то примера, немного забыл подправить. Еще на паскале это бы не прокатило, так как переменые там назначаются в блоке var, вместо скобочек надо использовать (по моему) более логичные begin - end... итд. Если не затруднит, то поправьте мой пример, что бы он заработал

Большое спасибо!

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

while (myFile.available()) 
{
  char STR[20] = "";  // Обьявляем массив (строку) размером 20 символов
  byte c = 0;           // позиция текущего символа
  while(1) 
  {
    char ch = myFile.read();       // читаем символ
    if (ch != '\r' && ch != '\n')  // если не CR и не NL то
    {
      STR[c] = ch;    // записывает символ в строку
      c++;            // инкриментируем текущее положение в строке
    }
    else if(ch == '\n')   // если переход на новую строку
    {
      STR[c] = '\0';  //  вставляем символ конца строки
      break;          // выходим из цикла
    }
    
  }
  int A = atoi(STR);   // конвертируем в число
  Serial.println(A);   // выводиим число в монитор
}

 

gooroong
gooroong аватар
Offline
Зарегистрирован: 08.03.2015

Максим, огромное Вам спасибо!

Кстати, я могу вставит такое: if (ch=' ') или для пробела нужен спецсимвол? 

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

Что вам мешает это проверить?

А вообще, если будете парсить именно числа, то не мешало бы проверять так:

if(ch >= '0' && ch <= '9')

а для вещественных чисел еще и так:

if((ch >= '0' && ch <= '9') || ch == '.')

 

gooroong
gooroong аватар
Offline
Зарегистрирован: 08.03.2015

Да, парсить буду именно числа. Это чтение конфигурационного файла для управления умной (пока не очень) теплицы на дачу. Надо срочно связать ардуину и краны (в субботу воду дают). Соответственно сразу угадать, что и сколько должно поливаться я не могу, а каждый раз, для коррекции параметров, отковыривать плату управляющего устройства не хочется, поэтому решил прикрутить карту для телеметрии и конфига. 

Конфиг буду сам писать, но никто не застрахован от ошибок, поэтому спасибо за хорошие строки. Сам параллельно думаю, какой дисплей и клавиатуру купить для прикручивания их в дальнейшем к управляющему устройству, пока в замешательстве из-за обилия представленного на Ali. Хочу цифровую клавиатуру и дисплей с большим количеством строк. Желательно все это влагозащищенное. Открыл недавно список, понял, что вначале надо реализовать купленные компоненты, а затем копать с данной задачей.