Форум программистов, компьютерный форум, киберфорум
Arduino
Войти
Регистрация
Восстановить пароль
 
2 / 2 / 1
Регистрация: 31.08.2015
Сообщений: 41
1

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

12.03.2018, 22:53. Просмотров 385. Ответов 3

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

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

Вот код из проги на ПК:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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[], имеем открытый порт, скорость низкая, даже чистим входной и выходной буферы в надежде исправить ситуацию, отправляем символ, который запустит метод на Ардуинке, ждем секунду(на всякий), ну и в цикле читаем все доступные строки и сразу выводим в консоль.
Вроде ничего криминального, но вывод выглядит так:

Из этого видно, что данные продублировались.
Не представляю что могло спровоцировать такое поведение...
Использую стандартную библиотеку SD.h.
А самое интересное, что в мониторе порта Arduino IDE вывод человеческий и не дублируется.
0
Миниатюры
Дублируются данные с SD карты  
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.03.2018, 22:53
Ответы с готовыми решениями:

Дублируются данные
Доброго времени суток, такая вот беда: Есть 2 класса MyClass, который хранит список...

Дублируются данные при запросе
Никак не могу дописать запрос, столкнулся с еще одной ошибкой ВЫБРАТЬ ВЫБОР КОГДА...

Дублируются данные в AJAX запросе
Здравствуйте, подскажите почему дублируются данные в AJAX запросе. У нас обычная форма которая...

После Preview() на печать - данные дублируются
Доброе. Подскажите решение проблемки - при вызове превью StockReport-&gt;QuickRep1-&gt;Preview(); на...

3
2 / 2 / 1
Регистрация: 31.08.2015
Сообщений: 41
12.03.2018, 23:25  [ТС] 2
Проблема решена. Проблема не в SD, а в обработке команд от ПК Ардуине.
По собственной глупости написал такое
C++
1
2
3
4
5
6
7
8
9
10
11
if(Serial.available() > 0)
  {
    if(Serial.read() == 'S')
    {
      SaveData();
    }
    else
    {
      LoadData();
    }
  }
Метод WriteLine() отправляет в конце символ переноса каретки '\r', из-за чего выполнялось оба условия Serial.available() > 0 и Serial.read() != 'S' из, за чего метод отправляющий данные выполнялся два раза. Сначала от символа 'A', а потом от символа '\r'.
0
Модератор
Эксперт по электронике
8285 / 6143 / 823
Регистрация: 14.02.2011
Сообщений: 21,356
13.03.2018, 04:42 3
Цитата Сообщение от uberfurer Посмотреть сообщение
C#
1
2
3
for (int i = 0; i < 1000; i++ )
{
  if (serial.BytesToRead > 0)
{
если данных нет в порту каковы дaльнейшие действия цикла?
не такой знаток шарпа, но по моему лучше так
C#
1
2
3
4
5
    while (serial.BytesToRead > 0)
      {
           data[i] = serial.ReadLine();
           Console.WriteLine(data[i++]);
       }
0
2 / 2 / 1
Регистрация: 31.08.2015
Сообщений: 41
14.03.2018, 11:12  [ТС] 4
Цитата Сообщение от ValeryS Посмотреть сообщение
если данных нет в порту каковы дaльнейшие действия цикла?
не такой знаток шарпа, но по моему лучше так
C#
Выделить код
1
2
3
4
5
while (serial.BytesToRead > 0)
{
data[i] = serial.ReadLine();
Console.WriteLine(data[i++]);
}
Это всё было тестовое и к действительности относиться мало.
Но по поводу самого кода, то в моем случае можно прекрасно ограничить количество чтений, а внутрь поместить цикл
C#
1
2
3
4
5
6
7
8
9
10
11
12
for(int count = 0; count < countMax; count++)
{
  while(true)
  {
     if(serial.BytesToRead > 0)
     {
        data[count] = Serial.ReadLine();
        Console.WriteLine(data[count]);
        break;
     }
  }
}
Код не лишен недостатков, но в этом случае мы никогда не выйдем из цикла пока данные 100% не придут, а в том что я написал ранее и в вашем случае как только данные закончатся цикл прекратится, но это не значит, что данные более не отправляются, они просто могут не успеть дойти в виду отсутствия задержек.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.03.2018, 11:12

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

Дублируются данные при sql запросе
Всем доброго дня. Простой sql запрос, вставляю данные в таблицу. &lt;?php require_once...

Создал новую таблицу и данные тоже дублируются
Вот код новой таблицы $t==$i++; echo &quot;&lt;table border='1' cellspacing='0' width='100%'...

Получить информацию из запроса, где данные дублируются
Привет, форумчане! Нужна Ваша помощь! Суть такова: есть запрос (для материального отчета по...

Stringgrid данные дублируются, хотя должны быть разными
Здравствуйте. Подскажите пожалуйста, как исправить такую проблему? С помощью treeview создано...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.