2015-11-05 5 views
-2

Мне нужно отправить значение 115200 в качестве параметра через последовательную связь на внешнее устройство, которое требует параметра как часть массива байтов в формате: 0x00, 0x00, 0x00, 0x00, и я понятия не имею как преобразовать его в этот формат. Я делаю это в обработке, поэтому решение Processing/java было бы удобно для будущего, но ATM. Я очень доволен, если могу просто отправить сообщение с этой конкретной переменной.Как преобразовать большое целое число в байты

Здесь байтовый массив:

byte[] tx_cmd = { 0x55, -86,    // packet header (-86 == 0xAA) 
       0x01, 0x00,    // device ID 
       0x00, 0x00, 0x00, 0x00, // input parameter NEEDS TO BE 115200 
       0x04, 0x00,    // command code 
       0x00, 0x01 };   // checksum 

Параметр должен быть помещен в 5-го по 8-й позиции (байт [4] - байт [7]).

формат сообщения мало порядок байт это структура сообщения:

0 0x55 BYTE старт команды code1

1 0xAA BYTE команда пуска Кодекса2

2 Device ID WORD Device ID: по умолчанию 0x0001 , всегда фиксирована

4 параметр параметр DWORD ввода

8 Команда WORD код команды

10 Контрольная сумма WORD Контрольная сумма (байт) сложение OFFSET [0] + ... + OFFSET [9] = Контрольная сумма

Любые советы будут оценены. Благодаря

+0

ваш вопрос, как преобразовать 'int' к SizeOf (INT) размерный массив байтов? или это значение [115200] (https://www.google.ch/search?q=115200+to+hex) точно? – BeyelerStudios

+0

Возможный дубликат [Преобразование int в 4-байтовый массив символов (C)] (http://stackoverflow.com/questions/3784263/converting-an-int-into-a-4-byte-char-array-c) –

+0

Четко обозначить ожидаемый endian - делает ли наименьший или самый значительный байт из 115200 в байт [4]? (Сообщение выглядит немного endian). Вы знаете, как вычислить контрольную сумму?если нет, какой алгоритм используется и как он применяется здесь? Возможно, этот протокол/формат имеет имя? – chux

ответ

1

Вы пытаетесь пакетом ИНТА в байты, вы не упомянули, является ли это сетевой порядком или нет, поэтому давайте предположим, что (например, первый байт, tx_cmd [4], является высшими байтами числа):

unsigned int baudrate = 115200; 
tx_cmd[4] = (baudrate >> 24) & 0xff; 
tx_cmd[5] = (baudrate >> 16) & 0xff; 
tx_cmd[6] = (baudrate >> 8) & 0xff; 
tx_cmd[7] = baudrate & 0xff; 

в общем, это очень удобно иметь такие функции, как int_to_bytes и аналогичные, которые делают, что в общем виде и сделать код ль беспорядочно.

+0

Спасибо за ответ! хотя я не собираюсь работать, так как это приводит к: '[4] 0 [5] 1 [6] 194 [7] 0', так что [6] все еще является большим числом, любая идея того, что я я делаю неправильно? –

+0

194 не слишком большой - почему ты так говоришь? – pm100

+0

@HannesAndersson 0, 1, 194, 0 (десятичный) - 0x00, 0x01, 0xC2, 0x00 (hex), который равен 0x0001C200 = 115200 в десятичной системе. Понятно, что теперь он в большой форме. Кажется, я прав. –

0

вам нужно маскировать и сдвиг

int num = 115200 
int b1 = (num & 0xff000000) >> 24 
int b2 = (num & 0x00ff0000) >> 16 
int b3 = (num & 0x0000ff00) >> 8 
int b4 = (num & 0x000000ff) >> 0 
+1

Это знаковое целое и смещение может иметь странный Результаты. Лучше использовать unsigned. –

+0

http://stackoverflow.com/questions/7622/shift-operator-in-c –

+0

Спасибо за ответ, но он выдает ошибку: 'Оператор && не определен для типа (ов) аргумента int, int' any что я делаю неправильно? –

1

С байт, как ожидается, будет в прямой порядок байтов, вы должны установить их следующим образом:

uint32_t value = 115200; 
tx_cmd[4] = value & 0xff; 
tx_cmd[5] = (value >> 8) & 0xff; 
tx_cmd[6] = (value >> 16) & 0xff; 
tx_cmd[7] = (value >> 24) & 0xff; 

Важно, что значение вы работаете с беззнаковым, в противном случае вы рискуете имея 1 сместилась в если установлен самый старший бит.

0

предлагают создать функцию, чтобы упаковать все

#define byte_n(x, b) ((x >> (b*8)) & 0xFF) 

void CreatePacket(byte tx_cmd[], uint16_t device_id, uint32_t param, uint16_t command) { 
    #define HEADER 0xAA55 
    tx_cmd[0] = byte_n(HEADER, 0); 
    tx_cmd[1] = byte_n(HEADER, 1); 
    tx_cmd[2] = byte_n(device_id, 0); 
    tx_cmd[3] = byte_n(device_id, 1); 
    tx_cmd[4] = byte_n(param, 0); 
    tx_cmd[5] = byte_n(param, 1); 
    tx_cmd[6] = byte_n(param, 2); 
    tx_cmd[7] = byte_n(param, 3); 
    tx_cmd[8] = byte_n(command, 0); 
    tx_cmd[9] = byte_n(command, 1); 
    unsigned checksum = 0; 
    for (int i=0; i<10; i++) { 
    checksum += tx_cmd[i]; 
    } 
    tx_cmd[10] = byte_n(checksum, 0); 
    tx_cmd[11] = byte_n(checksum, 1); 
} 

byte tx_cmd[12]; 
device_id = 1; 
baud = 115200; 
command = 4; 
CreatePacket(tx_cmd, device_id, baud, command); 
+0

Спасибо большое! это действительно удобно! –

Смежные вопросы