Самый быстрый способ передачи данных на ардуино?

Тема в разделе "Arduino & Shields", создана пользователем DKo, 3 апр 2015.

  1. DKo

    DKo Нерд

    Добрый вечер!

    Помогите, пожалуйста, разобраться.
    Занимаюсь самообучением работе с сервоприводами.
    Произошло какое-то событие - сервопривод по определенному закону повернулся.
    Из-за сложности и большого количества расчетов было решено перенести расчеты с ардуино на компьютер. Расчеты происходят постоянно и на выходе имеем 8 чисел, величиной не больше байта. Возникла проблема с передачей данных на ардуино, т.к. расчет происходит быстрее передачи (при этом расчеты происходят постоянно).
    Сейчас использую Serial connection (baud rate = 9600 bps).

    Будут ли "подводные камни", если я перенесу работу на baud rate = 115200 bps? (Увеличение потребляемой энергии не страшно)
    Как лучше передавать эти восемь чисел - одной строкой и потом парсить их контроллером или посылать по-байтно?
    Может есть смысл использовать ethernet connection или что-то другое?
    Какой контролер лучше использовать: Mega или Due? Пробовал на обоих, разницы не ощутил(

    Заранее Спасибо!
     
  2. Unixon

    Unixon Оракул Модератор

    А какая конкретно пропускная способность канала нужна?
     
  3. DKo

    DKo Нерд

    В теории максимум будет 1280 бит в секунду: 8 байт посылаются каждый 50 мс.
     
  4. X-Dron

    X-Dron Гик

    Подводных камней со скоростью 115200 быть не должно.
    А вот передачу данных советую оформить в каким-нибудь протоколом. Можно даже самописным.
    Например
    0x10 - заголовок пакета
    <data1> - данные 1
    <data2> - данные 2
    <data3> - данные 3
    <data4> - данные 4
    <data5> - данные 5
    <data6> - данные 6
    <data7> - данные 7
    <data8> - данные 8
    <src> - контрольная сумма
    0x16 - терминатор пакета
    Если приходит в порт 0x10, то начинаем записывать данные в буфер.
    Перестаем писать в буфер, если пришел терминатор или превышена длинна посылки.
    Если с терминатором все в порядке - промеряем контрольную сумму, как сумму значений данных.
    контрольная сумма сошлась - выкидываем значения из буфера в переменные, с которыми работают сервы
     
    DKo нравится это.
  5. Unixon

    Unixon Оракул Модератор

    Маркеры начала и конца пакета не должны встречаться внутри самого пакета. Если данные передаются в текстовом виде, традиционно можно воспользоваться управляющими кодами ASCII. Для бинарных данных одно из очевидных решений - воспользоваться к 7-битной кодировкой, где 0x00..0x7f - данные, 0x80..0xff - управляющие коды, и старший бит 0x80 определяет что есть что. При использовании типа char все данные будут положительными числами, а все управляющие коды - отрицательными.
     
    DKo нравится это.
  6. Unixon

    Unixon Оракул Модератор

    Ну тогда никаких проблем, для вас важно только время реакции. Скорость канала должна быть такой, чтобы время передачи пакета не превышало некоторую требуемую величину.
     
    DKo нравится это.
  7. X-Dron

    X-Dron Гик

    Это не обязательно, при фиксированной длине пакета. Если пришел заголовок, то через определенное количество байтов должен быть терминатор. Если его нет, то посылку отбрасываем. В МЭК-101 0x10 и 0x16 это именно коды заголовка и терминатора короткого сообщения фиксированной длинны.
    Для сообщений переменной длинны используется заголовок 0x64 <длинна сообщения в байтах> <длинна сообщения в байтах> 0x64. Дальше идут данные, потом контрольная сумма и терминатор 0x16. При этом 0x16 может встречаться в данных сколько угодно раз. <длинна сообщения в байтах> точно указывает где должен быть терминатор.
    Ограничение данных семибитной кодировкой (диапазон 0-127, если передаются байтовые значения) не правильно. А если мне нужно передать float 4-мя байтами, его тоже резать?
    Заголовок пакета можно сделать двойным, например 0x10 0xff - никто не запрещает, протокол самописный. :)
     
    DKo нравится это.
  8. DKo

    DKo Нерд

    Да, спасибо большое, изучу этот вопрос! Появится шанс разобраться с протоколами, давно хотел:)

    А в теории это повлияет на скорость передачи данных (по сравнению с посылкой строки "String"), или дело только в удобстве?

    И если не сложно: хотел бы все же узнать, от архитектуры arduino due будет какой-то выигрыш в скорости как приема данных, так и в работе некой абстрактной программы по обработке этих данных?
     
  9. Unixon

    Unixon Оракул Модератор

    Да, это вполне очевидный минус столь простого решения.
     
  10. Unixon

    Unixon Оракул Модератор

    Если при передаче передача одного пакета произойдет сбой, маркер начала следующего пакета будет воспринят как данные, а маркер конца с некоторой вероятностью не будет получен. Даже при его получении, несовпадение контрольной суммы вынудит выкинуть пакет, который при иной логике был бы успешно принят.
     
  11. X-Dron

    X-Dron Гик

    А как вы думаете?
    31250 в ASCII ("String") передается 5-ю байтами, а в целочисленном представлении только двумя. :) И чем больше число, тем больше разница.
     
    DKo нравится это.
  12. X-Dron

    X-Dron Гик

    Чтобы этого не было, в нормальных коммуникационных процессорах настраивается еще "время молчания сети". Т.е. между пакетами должна быть определенная пауза. Если коммуникационик видит, отсутствие передачи данных в течение заданного времени, то обнуляет указатель в приемном буфере.
     
  13. DKo

    DKo Нерд

    Это я понимаю)
    Спасибо большое:)