2013-12-17 3 views
0

У меня есть цикл, скажем, от 1 до 32. В этом случае десятичные числа от 1 до 32. Я должен вставить шестнадцатеричное значение от 1 до 32 в массив без знака, а затем выполнить send. Мой код выглядит следующим образомКак вставить шестнадцатеричное значение внутри массива шестнадцатеричного символа

char hex[3]; 
unsigned char hexunsigned[3]; 
int dec; 
int i=0; 
do 
{ 
    // this is the unsigned char array , i have to insert at 4th pos. 
    unsigned char writebuffer[8] ={0x01, 0x05, 0x00, 0x20, 0xFF, 0x00, 0x00, 0x00}; 

    // to place the hex value of each point on writeBuffer[3] 
    dec=i+1; 
    decimal_hex(dec,hex); //this function returns hex value of corresponding i value. 
    memcpy(hexunsigned,hex,sizeof(hexunsigned)); //converting char to unsigned char 

    writebuffer[3]= hexunsigned; //shows the error cannot convert from 'unsigned char [3]' to 'unsigned char' 

    unsigned short int crc = CRC16(writebuffer, 6); // Calculates the CRC16 of all 8 bytes 
    writebuffer[6] = ((unsigned char*) &crc)[1]; 
    writebuffer[7] = ((unsigned char*) &crc)[0]; 

    serialObj.send(writebuffer, 8); 
    //send another packet only after getting the response 
    DWORD nBytesRead = serialObj.Read(inBuffer, sizeof(inBuffer)); 
    i++; 

}while(nBytesRead!=0 && i<32); 

так, линия

writebuffer[3]= hexunsigned; 

показывает ошибку, как не может конвертировать из 'unsigned char [3]' в 'unsigned char'.
Как вставить hex unsigned в writebuffer массив.

когда

char hex[3]; 
int dec; 
dec=i+1; 
decimal_hex(dec,hex); 
memcpy(writebuffer+3, hex, sizeof(writebuffer+3)); 

используется, он переводит 01 (разл), как 31.

Я попытался ниже код также, он также перевод 01 (разл), как 31.

sprintf(hex, "%X", dec); 
memcpy(writebuffer+3, hex, sizeof(writebuffer+3)); 

Я думаю, что это лечение «1» получил в переменной шестигранным, как ASCII и отправка шестнадцатеричное значение символа «1», как 31.

Функция отправки ниже:

void serial::send(unsigned char data[], DWORD noOfByte) 
{ 
    DWORD dwBytesWrite; 
    WriteFile(serialHandle, data, noOfByte, &dwBytesWrite, NULL); 
} 
+0

Какой тип 'hexunsigned'? – kmort

+0

i обновил код – user3048644

ответ

0

Вы должны будете использовать тетср скопировать три массива символов.

1

Вы можете объединить две линии

memcpy(hexunsigned,hex,sizeof(hexunsigned)); //converting char to unsigned char 

writebuffer[3]= hexunsigned; 

в одно:

memcpy(writebuffer+3, hex, 3);</strike> 

и временный hexunsigned избыточна
------------- ------- Обновить строку --------------------
Фактически, когда мы говорим шестнадцатеричное кодирование, мы хотим использовать два байта для представления o первоначально оплащенные байты, например 0x33 30 // '3' '0' представляют 0x30
Так в вас случай 0x01~0x20 должен быть представлены в виде 0x00 01 к 0x02 00, если вы хотите использовать Sprintf для преобразования из дес в шестнадцатеричный, вы можете использовать, как это:

sprintf(hex, "%02X", dec); 
memcpy(writebuffer+3, hex, 2); 

И ваш результат будет таким: "01 05 00 30 31 00 00 00" для i = 1 без рассмотрения CRC16.

+0

, используя выше memcpy, он отправляет «01 05 00 31 00 cc 9c 50» для i = 1; он преобразует 1 как 31. и другой i = 2 преобразуется как 32. для i = 1 это должно быть 01 не 31.как сделать правильное преобразование – user3048644

+0

является «01 05 00 01 00 cc 9c 50» ожидаемый выход для i = 1? и каков ожидаемый результат для i = 12? –

+0

Да, мой ожидаемый выход «01 05 00 01 00 cc 9c 50» для i = 12, мой ожидаемый выход - 01 02 00 0C 00 CC 9C 50.. Мой код обрабатывает 12 как символ и отправляет его шестнадцатеричное значение. :( – user3048644

0

hexunsigned должен быть массивом символов без знака, а writebuffer [3] - это символ без знака.

Вы не можете назначить беззнаковый символ массиву без знака.

Если вы хотите скопировать hexunsigned для writebuffer [3], используйте memcpy.

+0

десятичное значение 01 преобразуется как 31 вместо 01. Что может быть причиной – user3048644

+0

'sprintf (hex,"% X ", 1)' будет присваивать hex = '1' (внимание, это символ '1', а не число 1), после этого, если вы используете 'printf (" % X ", hex [0])' вы увидите 31. – WKPlus

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