Дублируются данные с SD карты

Тема в разделе "Arduino & Shields", создана пользователем sdarkgrey12, 12 мар 2018.

Метки:
  1. sdarkgrey12

    sdarkgrey12 Нерд

    Доброго времени суток уважаемые форумчане!
    Столкнулся с такой проблемой:
    Мои девайсы: Arduino Mega2560(оригинал), Arduino SD Shield v3(под большую SD, общается по SPI)
    Суть проблемы: Читаю данные с SD-карты 2ГБ из текстового документа, потом отправляю по Serial-у на комп. А на компе все данные дублируются. Данные выводятся в консоль(язык C#).

    Вот кусок кода из скетча:
    Код (C++):
    file = SD.open("dump.txt", FILE_READ);
    while(file.available())Serial.write(file.read());
    То есть всё в границах разумного. Храним в переменной файл в режиме чтения, потом в цикле читаем файл пока есть что читать и сразу отправляем по последовательному порту в таком же виде как прочли.

    Вот код из проги на ПК:

    Код (C++):

     serial = new SerialPort("COM11", 9600);
     serial.Open();
     serial.DiscardOutBuffer();
     serial.DiscardInBuffer();
     serial.WriteLine("A");
     Thread.Sleep(1000);
     for (int i = 0; i < 1000; i++ )
     {
          if (serial.BytesToRead > 0)
          {
               data[i] = serial.ReadLine();
               Console.WriteLine(data[i]);
           }
      }
     
    Опять же, всё просто, имеем массив строк data[], имеем открытый порт, скорость низкая, даже чистим входной и выходной буферы в надежде исправить ситуацию, отправляем символ, который запустит метод на Ардуинке, ждем секунду(на всякий), ну и в цикле читаем все доступные строки и сразу выводим в консоль.
    Вроде ничего криминального, но вывод выглядит так:
    [​IMG]

    Из этого видно, что данные продублировались.
    Не представляю что могло спровоцировать такое поведение...
    Использую стандартную библиотеку SD.h.
    А самое интересное, что в мониторе порта Arduino IDE вывод человеческий и не дублируется.
     

    Вложения:

    • 111222.jpg
      111222.jpg
      Размер файла:
      45,7 КБ
      Просмотров:
      221
  2. sdarkgrey12

    sdarkgrey12 Нерд

    Забавная ситуация...Оказалось, что видимо проблема не в SD, а в чём-то другом...
    Код (C++):
    Serial.println("something");
    Привело к подобному результату, вывод продублировался...
     
  3. YeS

    YeS Гик

    Я бы для начала определился поточнее, где проблема. Вместо проги на ПК подключитесь через стандартный ИДЕшный терминал и посмотрите что выплёвывает в сериал ардуина. Если будет дублировать, то, понятно что косяк надо искать в ней, а если не дублирует, значит пэкашка.
     
  4. sdarkgrey12

    sdarkgrey12 Нерд

    Причина найдена, так как в обработчике я использовал оператор условия if и оператор else в таком виде

    Код (C++):
    if(Serial.available() > 0)
      {
        if(Serial.read() == 'S')
        {
          SaveData();
        }
        else
        {
          LoadData();
        }
      }
    То символ переноса каретки '\r' видимо воспринимался как выполнение условия
    Код (C++):
    if(Serial.available() > 0)
    , а так как он никак на S не похож, то выполнялась ветвь else
     
    arkadyf нравится это.
  5. sdarkgrey12

    sdarkgrey12 Нерд

    Я писал выше, что не дублирует, а почему? А потому что когда я через терминал общаюсь я не шлю символ переноса каретки...
    Короче решил сэкономить на switch - case заменив if - else и создал сам себе проблему
     
    arkadyf нравится это.