Почему идентификатор CAN BUS Frame обратно при чтении из сокета?

Итак, у меня есть Raspberry Pi, считывающий данные CAN с автомобиля. Если я использую candump Программа включена в canutils Я получаю кучу данных, пример выглядит так:

can0 1C4 [8]  03 F3 26 08 00 00 7F 70

Затем я написал простое приложение на C ++, чтобы открыть сокет для can0 шина и читать некоторые данные в буфер символов. Если я перебираю каждый символ буфера после чтения и преобразовываю каждый символ в целое число в шестнадцатеричном формате (и помещаю канал между каждым символом), я получаю следующее:

c4|1|0|0|8|0|0|0|3|f3|26|8|0|0|7f|70|

Мой вопрос: почему байт ID меняется на обратный, когда я читаю данные, используя сокет и буфер символов? Такое поведение согласуется со всеми CAN ID. Код длины данных и данные имеют правильный формат / порядок, но идентификатор в обратном направлении.

Спасибо,
Адам

1

Решение

Поздравление, вы только что обнаружили порядок байт.

Порядковый номер относится к последовательному порядку, в котором байты располагаются в большие числовые значения, когда хранятся в памяти компьютера или вторичном хранилище или когда передаются по цифровым каналам связи. Порядковый номер представляет интерес в информатике, потому что обычно используются два конфликтующих и несовместимых формата: слова могут быть представлены в формате с прямым порядком байтов или с прямым порядком байтов, в зависимости от того, упорядочены ли биты, байты или другие компоненты с большого конца (наиболее значимый) немного) или маленький конец (наименее значимый бит).

Как правило, данные сети (включая шину) имеют прямой порядок байтов. Архитектура вашего ПК, вероятно, имеет порядок байтов.

Чтобы это исправить, передайте свои данные ntoh*() функции для обратного порядка байтов (при необходимости) из сети (n) принимать гостей (h) порядковый номер

2

Другие решения

Других решений пока нет …