Доброго времени суток уважаемые форумчане! Столкнулся с такой проблемой: Мои девайсы: 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[], имеем открытый порт, скорость низкая, даже чистим входной и выходной буферы в надежде исправить ситуацию, отправляем символ, который запустит метод на Ардуинке, ждем секунду(на всякий), ну и в цикле читаем все доступные строки и сразу выводим в консоль. Вроде ничего криминального, но вывод выглядит так: Из этого видно, что данные продублировались. Не представляю что могло спровоцировать такое поведение... Использую стандартную библиотеку SD.h. А самое интересное, что в мониторе порта Arduino IDE вывод человеческий и не дублируется.
Забавная ситуация...Оказалось, что видимо проблема не в SD, а в чём-то другом... Код (C++): Serial.println("something"); Привело к подобному результату, вывод продублировался...
Я бы для начала определился поточнее, где проблема. Вместо проги на ПК подключитесь через стандартный ИДЕшный терминал и посмотрите что выплёвывает в сериал ардуина. Если будет дублировать, то, понятно что косяк надо искать в ней, а если не дублирует, значит пэкашка.
Причина найдена, так как в обработчике я использовал оператор условия if и оператор else в таком виде Код (C++): if(Serial.available() > 0) { if(Serial.read() == 'S') { SaveData(); } else { LoadData(); } } То символ переноса каретки '\r' видимо воспринимался как выполнение условия Код (C++): if(Serial.available() > 0) , а так как он никак на S не похож, то выполнялась ветвь else
Я писал выше, что не дублирует, а почему? А потому что когда я через терминал общаюсь я не шлю символ переноса каретки... Короче решил сэкономить на switch - case заменив if - else и создал сам себе проблему