Официальный сайт компании Arduino по адресу arduino.cc
Вывод данных из Seril порта на sd карту
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Вс, 24/02/2019 - 13:14
Всем привет! Интересует вопрос: как вывести данные из serial порта в формате NMEA на SD карту.
Код отвечающий за вывод NMEA в serial порт:
// serial-порт к которому подключён GPS-модуль #define GPS_SERIAL Serial1 void setup() { // открываем последовательный порт для мониторинга действий в программе // и передаём скорость 115200 бод Serial.begin(115200); while (!Serial) { } Serial.print("\r\nSerial init OK\r\n"); // открываем Serial-соединение с GPS-модулем // и передаём скорсть 115200 бод GPS_SERIAL.begin(115200); } void loop() { // если приходят данные из GPS-модуля - отправим их в порт компьютера if (GPS_SERIAL.available()) { Serial.write(GPS_SERIAL.read()); } // если приходят данные из компьютера - отправим их в GPS-модуль if (Serial.available()) { GPS_SERIAL.write(Serial.read()); } }
Код полностью работает, взял с сайта Амперки. Как сделать, чтоб данные выводились в файл на SD карту?
Arduino leonardo, GPS приемник от амперки.
Обьясняйте, пожалуйста, подробно):)
Уважаемый, а Вы не хотите внятно объяснить Ваши пожелания? Из какого порта (у Вас их 2) куда (в какой файл) писать? Как часто?
Ну тут-то вроде как ясно, мой кристал шар говорит, что ТС вряд ли будет слать NMEA в приёмник, стало быть, хочет логировать строчки от приёмника. Очень хочется, но программировать пока не умеет. Начать можно, например, так:
Спасибо большое за ответ, решение было на виду, но я бы не догадался, буду знать. Но теперь вопрос в другом, создаваемый файл в фомате TXT, но туда пишутся, почему-то, только цифры.
В Serial порт же пишется вот такое:
14:09:13.617 -> $GNGGA,110921.000,5541.0818,N,03741.5709,E,1,8,1.99,102.2,M,14.443
в файл TXT:
3671787171654449494851485646495752444444444448444
Нужен файл в формате NMEA, но простая замена расширения файла не помогла, он просто не создается
В файл пишутся не цифры, а байты. Попробуйте вместо datafile.print(data); использовать datafile.write(data);
Стало еще хуже((
Порт:
14:54:43.573 -> ⸮B⸮ȯ⸮⸮ 5⸮,⸮l⸮⸮⸮⸮⸮⸮ʝ⸮⸮⸮3⸮6⸮⸮⸮⸮⸮⸮d.d⸮V⸮⸮⸮"⸮⸮⸮B)Æ$R
Флешка:
섆ㄖ⋁닌䊀‸섺ァꆉ鈡р상襩䍲⠌䈺じ鈲鈇璋↦섋ሌ⠐䀆䉂ȼ模㦩쑄蒱ᄱⱋ騳恀戳⦌⪩ㄆ舂阰닌䊀怸섪
<del> - это иногда на форуме создаётся два сообщения вместо одного.
Да, печалька с кодировкой. Вообще, по-хорошему, нужно бы собирать приходящие от gps приёмника данные в строковой буфер, а уже его передавать и на компьютер, и его же записывать в виде строки в файл на карте.
Какая-то Ж настала:
Порт:
15:20:42.448 -> b$B0⸮⸮⸮,K⸮!ːCxP⸮⸮8! ⸮N⸮F`bƔpP⸮;y)⸮#t⸮43⸮⸮(@⸮8⸮(K⸮!ˀ!⸮
Флешка:
Блин, ну нет у меня gps приёмника, чтобы посмотреть, что там посылается и проставить правильно типы :) Раз уж это обычный сериал и NMEA, предполагаю, что там должна быть обычная латиница с кодами от 0 до 127, стало быть и с byte, и с char, поидее, должно бы работать.
Попробуйте в 30 строке не char, а unsigned char c = GPS_SERIAL.read(); . Я вообще, даже не уверен, что то, что я вам пишу в качестве примеров, компилируется ))
Какая-то Ж настала:
потому что не надо быть таким жадным. :) Сначала заказали работу платно - но 1000р, видимо, стало жалко - вот теперь трахайтесь сами :) На сколько, интересно, вы рассчитывали - на 200? :)
Вот еще что нужно отметить - ваш код с амперки, якобы выводящий NMEA в Сериал - для Вашей задачи не подходит. Если я правильно помню ТЗ - вы хотели писать на СД только строчки $GPRMC, причем делать это раз в 5 секунд. Ваш же код сливает в Сериал все подряд, причем спамит по 5-10 раз в секунду. Вы этим кодом очень быстро забьете карточку всяким мусором.
Сейчас попробую. То что вы пишете компилируется, я проверяю, только я исправил пин кардридера, и уменьшил скорость на всякий до 9600.
Скорость изменили везде? И у сериала гпс приёмника, и у компьютерного? И в мониторе ком-порта иде выставили такую же? И приёмник точно отсылает данные на скорости 9600?
А, це экономист, а не ребёнок :) Ну, экономным вопросам - экономные ответы :)
negavoid - писать на карту надо не каждый символ, как у вас - а только когда появился конец строки. И писать надо не символы и не байты, а строки. Тогда буквы будут буквами, а цифры - цифрами.
А, це экономист, а не ребёнок :) Ну, экономным вопросам - экономные ответы :)
в профиле возраст 28 лет. Так что не ребенок - а вполне себе взрослый жмот.
Ну я маленько в курсе (#6) :)
Но если считать байт текстового протокола NMEA и записать его в файл (что тоже делать плохо, ибо пишется карта секторами), то в файле в итоге будут совершенно правильные строки, и даже с переносом, вроде бы нмеа присылает \n-ы.
Попробуйте в 30 строке не char, а unsigned char c = GPS_SERIAL.read();
Вставил, теперь и в порте и на флешке просто цифры, тоесть байты. Сейчас еще попрубую разные методы, но если не получится, все равно большое спасибо за ваши старания.
Но если считать байт текстового протокола NMEA и записать его в файл), то в файле в итоге будут совершенно правильные строки, и даже с переносом, вроде бы нмеа присылает \n-ы.
если писать байты командой принт - не будут
И приёмник точно отсылает данные на скорости 9600?
Видел где-то, что ограничивали скорость приемника до 9600, на всякий случай, тоже решил сделать так же
Он и write попробовал, не вышел каменный цветочек.
Видел где-то, что ограничивали скорость приемника до 9600, на всякий случай, тоже решил сделать так же
В этом случае НАДО СНАЧАЛА дать команду приемнику переключится на 9600.
Он и write попробовал, не вышел каменный цветочек.
Он сам себе злобный буратино. В библиотеке TroykaGPS, которую он до того пробовал - уже есть все для приема строк с GPS. Надо только добавить пару переменных и написать метод выдачи строки в сериал Но товарищ решил пойти путем копипаста обрывков кодов в инете. Флаг в руки.
Какая-то Ж настала:
Сначала заказали работу платно - но 1000р стало жалко
Не в жадности дело, хочу разобраться реально в этом, что да куда
Он и write попробовал...
Ваш последний пример рабоатет только в таком виде, write сюда не подставить(( dataFile.print(str)
Страсти-то какие творятся :)
Значит, в SD.h нет override функции write(String).
Sasha_594 - вот вам алгоритм, как нужно решать эту задачу.
1. читаете байт с GPS - но ничего с ним не делаете, а только складываете в строку
2. проверяете, нет ли в строке последовательности "$GPRMC". Если нашли - идем на п.3, если нет - на п.1
3. Очишаем строку до $GPRMC, сдвигаем остальное в начало строки
4. продолжаем принимать символы из сериала и проверяем, не является ли символ переводом строки "\n" Если да - идем на п.5
5. Записываем всю строку , начиная с $GPRMC до "\n" - на СД карту. Переходим снова к п. 1
Спасибо
Так же заинтересовался идей gps-логгера. Собрал и прошил по рекомендациям от амперки с доработками из этой ветки.
Имею разные глюки: 1) Если СД читалка отцеплена или СД карта изьята, NMEA идет верный. Красиво пишется в окошке COM порта или крутит стрелку-показывает спутники в OziExplorer. Но при подсоединении СД NMEA на COM порт идет с пропусками и ошибками, а OziExplorer просто не видит спутников. На CД карту пишется файл из непонятного набора цифр. 2) Один из предложенных выше скетчей в итоге начал писать NMEA c приемника в СД, но с множеством ошибок и пропусков.
Куда капать, чего читать?
Запись на карту не самый быстрый процесс, а если писать еще и побайтно, то накладных расходов становится ну очень много. Направление поиска откуда идут пропуски ясно?))
Все скетчи в этой теме - условные примеры. Для нормальной работы девайса их нужно дорабатывать. Как именно дорабатывать - написано выше, считывать данные NMEA от приёмника в строковой буфер и уже его записывать на карту.