Как подключить к Arduino эхолот Humminbird?

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем Bif+, 12 фев 2019.

  1. burd-ig

    burd-ig Нерд

    И еще вопрос по программированию.
    Команды strncmp, strchr и atof почему работают без подключенных библиотек?
    Это компилятор такой умный уже?
     
    Последнее редактирование: 5 апр 2020
  2. b707

    b707 Гуру

    де факто эти команды давно часть С.
    Точного ответа на ваш ответ у меня нет, могу только предположить что хидер string.h подключается средой Ардуино ИДЕ по умолчанию.
     
  3. burd-ig

    burd-ig Нерд

    Юзаю свой код. Пока получилось выводить данные вот в таком виде:
    String BUFFER[0];
    Serial.println(BUFFER[0]);
    Не могу понять, как мне проверить начало BUFFER[0] с префиксом "GNGLL", например.
    Вообщем пока не понял, как с этим типом данных работать.
     
  4. b707

    b707 Гуру

    String BUFFER[0] - ???

    Интересно. что вот эта строчка должна означать?
    ;- массив строк нулевой длины? :)
    не знаю, связаны ли ваши вопросы вчера и сегодня -но на всякий случай, имейте в виду, что тип String в ардуино не имеет ни малейшего отношения к функциям strncmp, strchr и atof, о который вы спрашивали вчера.
    Класс String и библиотека string.h - это совершенно разные типы данных
     
  5. burd-ig

    burd-ig Нерд

    Идея запарсить данные взята вот отсюда:
    http://forum.amperka.ru/threads/Запись-в-массив-из-serialport.6622/#post-55631"]Запись в массив из SerialPort
    Сумел слелать захват строчек по первому символу $
    Вывод данных работает, но как сортировать этот класс данных далее не могу найти.
    Пробовал сделать такое, не работает (BUFFER[0}=="G" && BUFFER{1} =="N")
     
    Последнее редактирование: 6 апр 2020
  6. burd-ig

    burd-ig Нерд

    Почему я остановился на идее использовать код с String? Точно не потому, что мне нужен этот класс данных.
    Пока я не могу вникнуть в сам процесс синхронизации потока по RX и программных операторов. До кода тут далеко...
    Первый эксперимент. Присваивал переменной значение c seria port (т.е. RX) и сравнивал с "$". Как только условие становилось правдой, в цикле попробовал присваивать значения с serial. Что получил? Так как на RX данные менялись медленне, чем скорость цикла, то и получал не понятно что...
    Второй эксперимент. Скорость 9600. В цикле соответственно сделал задержку 100 мкс. Данные пошли, но с ошибками, так как цикл иногда считывал два раза одно и то же значение с RX.
    Третий эксперимент. Нашел последний код. Что мне понравилось? При сравнении с "$", далее загонял в строку BUFFER оставшуюсю часть сообщения NMEA. Причем вся длина сообщения мне не нужна. Ограничился определенной длиной, где сидят данные с широтой и долготой.
    Теперь нужно понять, как обработать BUFFER.
     
  7. b707

    b707 Гуру

    у меня такое впечатление, что вы на языке Си начали программировать даже не вчера, а сегодня 10 минут назад
    Выучите для начала элементарные вещи... типы данные. операторы, циклы... например синтаксис взятия нужного элемента из массива
    У вас в процитированной строчке три типа скобок - и НИ ОДНА НЕ ПРАВИЛЬНАЯ
     
    parovoZZ нравится это.
  8. b707

    b707 Гуру

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

    .
     
  9. burd-ig

    burd-ig Нерд

    Со скобками - зрение плохое.
    Меня интересует синтаксис взятия данных из Serial. Я не понимаю, каким образом оператор в программе понимает, что на RX появилось второе событие после первого... Можно какой-нибудь пример, записать в массив первые три числа или символа с serial и быть уверенным, что записано три разных значения, а не одно и то же три раза. Спасибо!
     
    Последнее редактирование: 6 апр 2020
  10. b707

    b707 Гуру

    if (Serial.availiable()) { ....

    не подходит?
     
  11. burd-ig

    burd-ig Нерд

    Вот в своем коде (пока принципиально показывать не буду :) ) я использовал два раза if (Serial.availiable()) { причем подключая его к двум разным переменными. Меня это насторожило, нигде не видел такого, но работает. Если использую один раз, то такое ощущение, что следующий код пытается прочитать прочитанное и это ему не удается сделать. Так вот как записать три разных события? Если не цикл, то как serial дает понять, что пора меня записывать?
     
  12. burd-ig

    burd-ig Нерд

    /*Вот пример с сайта Ардуино. Понятно, что смогли считать информацию. Когда этот код вызывать для //второго события?*/
    Код (C++):
    int incomingByte = 0;   // переменная для хранения полученного байта
    void setup() {
        Serial.begin(9600); // устанавливаем последовательное соединение
    }
    void loop() {
        if (Serial.available() > 0) {  //если есть доступные данные
            // считываем байт
            incomingByte = Serial.read();
            // отсылаем то, что получили
            Serial.print("I received: ");
            Serial.println(incomingByte, DEC);
        }
    }
     
     
  13. b707

    b707 Гуру

    Serial.availiable() - ни к каким переменным не подключается. что вы имеете в виду?
    теперь уже три? "Пора меня записывать" -?

    "я когда вас слушаю, мне все время кажется. что вы бредите" (с)

    или выражайтесь яснее, или просто покажите свой код.
     
  14. b707

    b707 Гуру

    Мне кажется. я вас переоценил, когда писал на прошлой странице. что вы можете написать код лучше автора темы. Возьмите готовый код с библиотекой и не мучайтесь. судя по вопросам сами вы что-то рабочее сможете написать очень не скоро..
     
  15. burd-ig

    burd-ig Нерд

    Я стараюсь решать свои задачи глобально, но мне требуется опробовать какие-то частности. Т.е. посмотреть, как это работает. Для меня микроконтроллер - устройство с переферией и кучей входящих выходящих нулей и единичек. Порт RX я больше представляю с точки зрения осциллографа, нежели оператора Serial.available()
    И мой подход работает. Код меня интересует не с точки зрения, как он правильно пишется, а как и с чем он может и будет работать для меня.
    Главное представлять алгоритм и доступные средства.
    Мои вопросы очень логичны, на самом деле, если понимать ход моих мыслей. Задача не просто парсить данные, а сделать это быстрее остальных в моем проекте. Потому библиотека отпадает.
    Да, в данный момент я элементарно не представляю работу порта с точки зрения языка. Но при этом прекрасно понимаю, как хочу захватить события из этого потока и ускорить их фильтрацию.
    При этом в голове постоянно крутится идея, в процесс захвата данных внедрить процесс обработки, а то еще чего, если будет успевать. И даже понимаю, что после прикладного программирования можно отдать свой проект для более системной оптимизации.
     
  16. b707

    b707 Гуру

    тогда дальше без меня. Я уже пробовал общаться с людьми, которые подбирают строчки в коде не из смысла и знания языка, а исходя из формы сигнала на осциллографе. Ничего хорошего из этого не вышло.
     
  17. burd-ig

    burd-ig Нерд

    А по поводу языка, я скажу вам, что если я своему студенту напишу как на сайте:
    Serial.read()
    Cчитывает очередной доступный байт из буфера последовательного соединения.
    Я думаю, он задаст тот же самый вопрос: "А как разобраться с этой очередью? Как считать 1 очередной байт, как второй, а как третий очередной?" Я понимаю, что что-то есть по умолчанию, что оказывается процесс происходит так-то...
     
  18. burd-ig

    burd-ig Нерд

    Я такого не имел ввиду. Очень странно, я думал, программисты сначала думают об алгоритме в целом, а потом уже вспоминают язык программирования.
     
  19. b707

    b707 Гуру

    есть такой бородатый анекдот - "Советские часы "Ракета" - самые быстрые часы в мире"
    Нет никакого смысла "парсить данные быстрее остальных" - это как сделать часы. где стрелка делает оборот не за час. а за 20 минут.
    Парсить данные быстрее, чем они приходят с GPS - вы все равно не сможете. И собственно процесс "парсинга" в этом и не нуждается - среди прочих задержек парсинг и так самый быстрый, как я вам писал чуть раньше. Придумывать свой "супероптимальный" метод чтения из Сериала, когда между символами задержка в целую миллисекунду (вечность по меркам контроллера) - это просто смешно и абсолютно никому не нужно.
     
    Последнее редактирование: 6 апр 2020
  20. b707

    b707 Гуру

    мне кажется ваши студенты умнее :)
    Что вообще может быть непонятно в этой фразе?