uint16, uint32 я в протоколах остерегаюсь применять т.к. есть понятие big endian и little endian.
когда последний раз вы работали с big endian? я считаю что big endian мёртв, теже arm что могут работать в двух режимах работают всегда в little endian. Даже если вдруг появится необходимость в big endian скорее всего это будет на стороне хоста, так что пусть он и занимается конвертацией big endian в lettle endian.
Еще есть понятие в компиляторе: упаковка данных в стуктурах (кратность 4 байтам, к примеру на 32 рпзрядных машинах). Т.е. между первым uint8_t и вторым uint32_t реально в ОЗУ может образоваться промежуток в 3 байта...
вот это серъёзное замечание, однако давайте подумаем какие данные мы пересылаем по протоколу?
это простые типы int8_t, int16_t, int32_t , float, double , char[] - фиксированного размера.
все эти типы одинаковые на всех системах, единственное что может отличаться - поведение компилятора когда данные вперемешку.
вот тут нужно учитывать одно правило, сначала в структуре указываем самые жирные данные, float,int32_t затем более компактные и в самом конце char.
в таком случае любой компилятор будет выравнивать по самым жирным, и будет использовать одинаковые padding байты если потребуется.
Поскольку мы контролируем обе стороны, я считаю такой подход безопасным,
кроме того, в протоколе заложена проверка на размер структуры, которая определяется через sizeof() если вдруг где то произойдёт расхождение протокол будет ругаться на неверный размер.
Про упаковку структур можно почитать например тут
http://www.catb.org/esr/structure-packing/Повторю, я считаю такие выкрутасы безопасными, если придерживаться ряда правил, зато это существенно ускоряет работу протокола,
я из ардуино обмен пакетами на частоте 1кгц выжимал по последовательному порту.
при этом она ещё и складывала значения в структуре и кое чего печатала.
Кстати на стороне хоста со скоростью обработки пакетов дела обстоят даже хуже т.к. на хосте не риалтайм ОС, т.е если не жарить проц то очень быстро реагировать на приходящие пакеты не так уж и просто.
Я так заморочился с протоколом для ROS, но таже проблема и с Scratch поскольку ардуина фактически превращается в исполнителя команд, то количество команд и их частота больше зависят от протокола а нет от скорости контроллера.
Что такое частота команд? это максимальная скорость с которой может работать высокоуровневый алгоритм, такой как scratch.
Т.е. аналог скорости виртуального процессора.
Добавлено спустя 56 минут 14 секунд:по железу.
вот тут неплохая подборка деталей
http://www.ebay.com/itm/Arduino-Robot-e ... 2632857325http://www.elabpeers.com/ebot-z.htmlсписок для ориентировки
Features:
• Smart Car Robot With Chassis And Kit [Round] x 1
• eLab Peers Einsboard with USB cable x 1
• L298P 2A Motor Driver Arduino Shield x 1
• HC-SR04 Ultrasonic Sensor with Servo and Rack x 1
• 4-Channel Automatic Robot Tracking Sensor x 1
• BC417 Bluetooth to Serial [Arduino] x 1
• H206 Opto-coupler Speed Sensor x 2
• Speed Encoder x 2
• 9V Battery Box x 1
• AA x 4 Battery Box x 1
• 40pc DuPont Wires [Male to Female] x 1
• 40pc DuPont Wires [Male to Male] x 1
• 220 ohm Resistor x 2
• Electrolytic Capacitor x 1
• LED in Red x 1
• LED in Green x 1
• Small Breadboard x 1
• Swivel Caster x 2
• Switch x 1
• Tape in Black Color x 1
• Set of Metal Standoffs x 1
• Set of Screws and Nuts x 1
в жёлтых редукторах стоят моторы модели 130 Motor.
можно заменить на вот такие моторы "Mabuchi Dual Shaft Strong Magnetic Carbon Brush 130 Motor Toys DIY"
тогда энкодер можно будет прикрепить прямо к валу двигателя, это позволит более точно поддерживать скорость вращения.
что внутри
http://www.averagemanvsraspberrypi.com/ ... otors.html