Как правильно заполнить буфер? - PullRequest
0 голосов
/ 30 января 2019

Я общаюсь с беспилотником-попугаем (прыжками сумо) с питоном, и мне нужно отправлять ему буфер каждые 25 мс для поддержания соединения.Проблема, я не знаю, как это сделать ^^

Вдохновленный этим кодом, написанным на javascript: https://github.com/forgeByAcision/node-sumo/blob/master/lib/sumo.js Я пытался перевести это:

var buf = new Buffer(7);

buf.writeUInt8(constants.ARCOMMANDS_ID_PROJECT_JUMPINGSUMO, 0);
buf.writeUInt8(constants.ARCOMMANDS_ID_JUMPINGSUMO_CLASS_PILOTING, 1);
buf.writeUInt16LE(constants.ARCOMMANDS_ID_JUMPINGSUMO_PILOTING_CMD_PCMD, 2);
buf.writeUInt8(this._pcmd.flag || 1, 4);
buf.writeInt8(this._pcmd.speed || 0, 5);
buf.writeInt8(this._pcmd.turn || 0, 6);

Iслышал про struct library, но я застрял.Как писать такие типы, как изменить порядок байтов только для переменной?

PS: я не застрял с сокетами (ну, я думаю)

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Наконец, я использовал struct module для упаковки моих данных в буфер следующим образом: (при условии, что второй аргумент нужно отформатировать как little-endian)

import struct

buf = struct.pack("BBHBbb", constant1, 255 - constant2, constant3, constant4 ....)
0 голосов
/ 30 января 2019

Вы можете использовать struct, чтобы упаковать ваши данные в буфер.Что-то вроде:

from struct import *
buf = ['\0'] * 7

pack_into('BBHBbb', buf, 0, constants.ARCOMMANDS_ID_PROJECT_JUMPINGSUMO, constants.ARCOMMANDS_ID_JUMPINGSUMO_CLASS_PILOTING, constants.ARCOMMANDS_ID_JUMPINGSUMO_PILOTING_CMD_PCMD,...)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...