Присвоение значения порядку байтов структуры
Итак, у меня есть структура:
typedef struct sendPacketStruct {
byte header = headerByte;//0x55
unsigned int time;//2 байта
int height;//2 байта
};
И я делаю это:
sendPacketStruct sendPacket;
sendPacket.time = 84;//0x54
sendPacket.height = 100;//0x65
Serial.write((byte*)&sendPacket, sizeof(sendPacket));
Но когда я получаю его на другом конце, шестнадцатеричные байты:
55 54 00 64 00
Таким образом, первый байт соответствует заголовку 0x55, но значения времени и высоты 2x2 байта присутствуют, но сдвинуты.
например, это должно быть 00 54, а не 54 00
@Hayden Thring, 👍0
Обсуждение1 ответ
Лучший ответ:
Ответ заключается в том, что Arduino использует обратный порядок байтов, поэтому порядок байтов правильный. Я просто ожидал порядка с прямым порядком байтов, как я видел в некоторых других сетевых протоколах. Если это желательно вместо этого, я могу просто немного сдвинуть биты и переставить.
Порядок байтов протокола определяется протоколом. В C есть функции htons()
ntohs()
и т. д. для «Host to Network Short» и т. д., которые устанавливают правильный порядок следования байтов для протокола., @Majenko
- Как получить тип данных переменной?
- Отправить структуру через Serial
- Собственное определение типа с использованием структуры не дает имени типу
- Не выводится на serial monitor, отправляя строку на serial.print
- Как анализировать многострочные последовательные данные с неизвестным количеством строк?
- Keyboard.write записывает целочисленное значение ASCII в виде строки
- String() против char для простого управления потоком
- Создание строк с символами UTF-8 из данных
должно быть 00 54, а не 54 00
... почему? ... вызывает ли это проблему? ... байты не сдвигаются, @jsotolaПотому что, если я прочитаю 2-й и 3-й байты, чтобы получить int, я получу 0x5400, что равно 21504, а не 84 (0x54)., @Hayden Thring
см. "endiannes" в википедии. Вот почему лучше отправлять текст между системами., @Juraj
прочитайте 2-й и 3-й байты, чтобы получить целое число
... как вы делаете целое число? ... вы читаете байты отдельно?, @jsotolaЯ бы считывал последовательные данные по байтам за раз, когда они поступали в буферный массив. Когда я обнаруживаю полный пакет в буфере, я преобразовываю различные биты в данные. Это в мобильном приложении., @Hayden Thring
Итак, на самом деле это работает правильно для системы с прямым порядком байтов, о которой я не знал, я просто имею опыт работы только с сетевыми протоколами с прямым порядком байтов. Спасибо @Juraj, @Hayden Thring
Либо согласуйте порядок байтов (для передачи) между всеми системами, совместно использующими эти данные, либо включите в пакет индикатор порядка байтов, и все получатели соглашаются принять любой из них., @JRobert
Обратите внимание, что сегодня большинство процессоров, включая AVR, ARM и x86-64, имеют обратный порядок байтов., @Edgar Bonet