Сравнивание строк из файла с входящей строкой.

Evgeny_Ry
Offline
Зарегистрирован: 04.05.2013

Здравствуйте, подскажите пожалуйста, как реализовать данный алгоритм:

Есть файл на SD-карте следующего вида:

1234567

9999999

3231321

1234123

И так далее. Т.е. набор чисел в столбик. С RFID ридера приходят данные, типа "0000000" необходимо сравнить входящее число со всеми числами из файла на флешке. Если есть совпадение, то сделать определенные действия, если нет - то другие действия.

Вся сложность сводится к тому, что не удается реализовать считывание с карты каждой строки в массив. 

С уважением, Евгений. Знающих людей прошу помощи.

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

Конкретно что не получается? код покажите Вставка программного кода в тему/комментарий

Evgeny_Ry
Offline
Зарегистрирован: 04.05.2013

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

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

Есть - сохранять каждую стоку в массив. Сообщение #1 перечитайте.

Evgeny_Ry
Offline
Зарегистрирован: 04.05.2013

maksim пишет:

Есть - сохранять каждую стоку в массив. Сообщение #1 перечитайте.

Это понятно, на уровне алгоритма - это не сложно, я ставлю вопрос реализации. Поскольку с SD-модулем раньше не работал.

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

maksim пишет:

string

Вот ты реально такой тугой, или прикидываешься?

У тебя спрашивают одно, а ты вообще на другой вопрос отвечаешь %

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

Слышь, тугой здесь ТЫ, ибо строка это и есть массив - это раз. 
Что ТЫ хочешь конкретно и что у тебя не получается понятно только тебе одному, так как ТЫ мыслишь очень плоско, а вариантов решения задачи много, а мысли здесь читать твои никто не умеет - это два.
Так что прежде чем хамить, подумай сначала, а не абстрактный ли твой вопрос - это три.

Если есть желание еще похамить, то вместо того что бы сюда писать иди дяде с улицы попробуй похами, а то почувствовал безнаказанность за свои слова, сидя за клаваиатурой.

Evgeny_Ry
Offline
Зарегистрирован: 04.05.2013

maksim пишет:

Слышь, тугой здесь ТЫ, ибо строка это и есть массив - это раз. 
Что ТЫ хочешь конкретно и что у тебя не получается понятно только тебе одному, так как ТЫ мыслишь очень плоско, а вариантов решения задачи много, а мысли здесь читать твои никто не умеет - это два.
Так что прежде чем хамить, подумай сначала, а не абстрактный ли твой вопрос - это три.

Если есть желание еще похамить, то вместо того что бы сюда писать иди дяде с улицы попробуй похами, а то почувствовал безнаказанность за свои слова, сидя за клаваиатурой.

Если до тебя не доходит вопрос, то прочитай еще раз, мошт со второго раза поймешь что к чему. Суть вопроса не в том, как объявлять переменные, а как работать с sd-библеотекой. Вопрос ставился таким образом: как запихать данные из текстового фала на флеш-карте в массив. Каждая строка - это новый элемент массива.

Так понятнее? Если уж и это до тебя не дошло, то мой вердикт один - иди собирай рюкзак, в школе научат читать.

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

Во-первых перестаньте ТЫкать, а во-вторых прочитайте сами свое первое сообшение и сравните с последним и найдите 10 отличий, после чего подумайте кому здесь в школу...

File dataFile = SD.open("datalog.txt");
char **stroki;
if (dataFile) 
{
  int st = 0, ch = 0;
  while (dataFile.available()) 
  {
    char buff = dataFile.read();
    stroki[st][ch] = buff;      
    if(buff == '\n') // разделитель строки
    {
      stroki[st][ch] = 0;
      st++;
      ch = 0;
    }
    else ch++; 
  }
  dataFile.close();
}

Не рекомендую использовать данную конструкцию char **stroki; в вашем случае лучше определиться с размером char stroki[100][8];.

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

  File dataFile = SD.open("datalog.txt");
  unsigned long chisla[100];
  for(int i = 0; i < 100; i++) chisla[i] = 0; // на всякий инициализируем массив нулями
  int st = 0;
  if(dataFile) 
  {
    while (dataFile.available()) 
    {
      char buff = dataFile.read();
      if(buff == '\n') st++;
      else if(buff >= 48 && buff <= 57)
      {
        chisla[st] *= 10;
        chisla[st] += buff - 48;
      }
    }
    dataFile.close();
  }

так же разделитель '\n' может "не заработать" так что можно использовать например ';' :

1234567;
9999999;
3231321;
1234123;

ну а потом просто в цикле сравниваете два числа:

  unsigned long rfid = 1234567;
  for(int i = 0; i < st; i++) 
    if(rfid == chisla[i])
    {
      //выполняем действие
    }

 

toc
Offline
Зарегистрирован: 09.02.2013

 Евгений, стоит ли зачитывать весь файл в память? Памяти может не хватить. По-моему, лучше сразу проверять каждую строку. Если искомая найдена - сразу действие1. Если весь файл прочитан - действие2.

Evgeny_Ry
Offline
Зарегистрирован: 04.05.2013

toc пишет:

 Евгений, стоит ли зачитывать весь файл в память? Памяти может не хватить. По-моему, лучше сразу проверять каждую строку. Если искомая найдена - сразу действие1. Если весь файл прочитан - действие2.

Спасибо, за замечание, полностью согласен, что возможно памяти не будет хватать, поскольку в файле белее 600 записей.

Toc, если вас не затруднит не могли бы вы предложить ваш код?

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

Evgeny_Ry пишет:

поскольку в файле белее 600 записей.

И об этом вы тоже решили умолчать. 

  File dataFile = SD.open("datalog.txt");
  unsigned long buff = 0;
  unsigned long rfid = 1234567;
  bool sovpadenie = 0;
  if(dataFile)
  {
    while (dataFile.available()) 
    {
      char ch = dataFile.read();
      if(ch == ';') 
      {
        if(buff == rfid) 
        {
          sovpadenie = 1;
          break;
        }
        buff = 0;
      }
      else if(ch >= 48 && ch <= 57)
      {
        buff *= 10;
        buff += ch - 48;
      }
    }
    dataFile.close();
  }  
  
  if(sovpadenie)
  {
    // выполняем дествие
  }

Так что делайте выводы, и не расчитывайте на помощь экстрасенсов.

Evgeny_Ry
Offline
Зарегистрирован: 04.05.2013

Спасибо maksim, прошу прощения за грубость - сроки поджимали. Хоть это меня и не оправдывает 

Evgeny_Ry
Offline
Зарегистрирован: 04.05.2013

Maksim, ваш код почему-то не работает... НУ или у меня руки кривые

 
#include <SD.h>

File myFile;

void setup()
{
  Serial.begin(9600);
  pinMode(53, OUTPUT);
  
File dataFile = SD.open("BASE.txt",FILE_READ);
unsigned long buff = 0;
unsigned long rfid = 4685789;
bool sovpadenie = 0;
if(dataFile)
{
  while (dataFile.available()) 
  {
    char ch = dataFile.read();
    if(ch == ';') 
    {
      if(buff == rfid) 
      {
        sovpadenie = 1;
        break;
      }
      buff = 0;
    }
    else if(ch >= 48 && ch <= 57)
    {
      buff *= 10;
      buff += ch - 48;
    }
  }
  dataFile.close();
}  

if(sovpadenie)
{
  Serial.println("OK");
}
  
}

void loop()
{
	// nothing happens after setup
}

В чем ошибка?

В файле BASE.txt такой текст:

4685789;

2168494;

 

 

maksim
Offline
Зарегистрирован: 12.02.2012
#include <SD.h>

void setup()
{
  Serial.begin(9600);
  pinMode(53, OUTPUT);
  if (!SD.begin(53)) {
    Serial.println("Card failed, or not present");
    return;
  }
  Serial.println("card initialized.");
  
  unsigned long rfid = 4685789;
  bool sovpadenie = 0;

  File dataFile = SD.open("BASE.txt",FILE_READ);
  if(dataFile)
  {
    unsigned long buff = 0;
    while (dataFile.available()) 
    {
      char ch = dataFile.read();
      if(ch == ';') 
      {
        Serial.println(buff);
        if(buff == rfid) 
        {
          sovpadenie = 1;
          break;
        }
        buff = 0;
      }
      else if(ch >= 48 && ch <= 57)
      {
        buff *= 10;
        buff += ch - 48;
      }
    }
    dataFile.close();
  } 
  else Serial.println("error opening file");

  if(sovpadenie)
  {
    Serial.println("OK");
  }

}

void loop()
{
  // nothing happens after setup
}

 

toc
Offline
Зарегистрирован: 09.02.2013

Максим, Евгений,

в текстовом файле в ascii кодировке строка 4685789 будет представлена семью байтами

0x34, 0x36, 0x38, 0x35, 0x37, 0x38, 0x39 

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

toc пишет:

Максим, Евгений,

в текстовом файле в ascii кодировке строка 4685789 будет представлена семью байтами

0x34, 0x36, 0x38, 0x35, 0x37, 0x38, 0x39 

Это вы к чему?

Evgeny_Ry
Offline
Зарегистрирован: 04.05.2013

maksim пишет:

#include <SD.h>

void setup()
{
  Serial.begin(9600);
  pinMode(53, OUTPUT);
  if (!SD.begin(53)) {
    Serial.println("Card failed, or not present");
    return;
  }
  Serial.println("card initialized.");
  
  unsigned long rfid = 4685789;
  bool sovpadenie = 0;

  File dataFile = SD.open("BASE.txt",FILE_READ);
  if(dataFile)
  {
    unsigned long buff = 0;
    while (dataFile.available()) 
    {
      char ch = dataFile.read();
      if(ch == ';') 
      {
        Serial.println(buff);
        if(buff == rfid) 
        {
          sovpadenie = 1;
          break;
        }
        buff = 0;
      }
      else if(ch >= 48 && ch <= 57)
      {
        buff *= 10;
        buff += ch - 48;
      }
    }
    dataFile.close();
  } 
  else Serial.println("error opening file");

  if(sovpadenie)
  {
    Serial.println("OK");
  }

}

void loop()
{
  // nothing happens after setup
}

 

Спасибо, всё работает

toc
Offline
Зарегистрирован: 09.02.2013

maksim пишет:

toc пишет:

Максим, Евгений,

в текстовом файле в ascii кодировке строка 4685789 будет представлена семью байтами

0x34, 0x36, 0x38, 0x35, 0x37, 0x38, 0x39 

Это вы к чему?

 

не заметил блок else

zur
Offline
Зарегистрирован: 18.04.2017

доброго времени суток...

у мения тоже самое интересуеть... помогите пожалуйста...

в тхт фаиле в ручную записанны строки пример 0123456789... нужно найдти определную строку и делат какието деиствия пример нужно искать 0123456789 и при совпадении выдат сообшения например "Ok".

для тестирования Arduino подключен теминалу и спомошю терминала ввожу 10 цифр и при совпадении выдает сообшение "Ok" при отсувствии "Error"

hard виглидить так SD Card+Arduino+Uart

я мало знаю програмировании а то не беспокоил

заранее благодаоень...

 

Sinhrofazatron
Offline
Зарегистрирован: 06.11.2017

Помогите написать похожий код.

Есть тхт с кодами

123456789

921431234

и т.д

Нужно поочереди переслать их на на радиопередатчик

код на передачу нашел в сети,а как написать что бы он брал коды с сд карты не знаю

#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();
void setup() {
Serial.begin(9600);
// Transmitter is connected to Arduino Pin #10
mySwitch.enableTransmit(10);
// Optional set pulse length.
// mySwitch.setPulseLength(320);
// Optional set protocol (default is 1, will work for most outlets)
// mySwitch.setProtocol(2);
// Optional set number of transmission repetitions.
// mySwitch.setRepeatTransmit(15);
}
void loop() {
/* Same switch as above, but using decimal code */
mySwitch.send(5625693(сюда вставлять коды с карты), 24);
delay(10);

Помогите пожалуйста.