2013-12-17 206 views
0

我有一個循環讓說從1到32. 1到32在這種情況下是十進制的。我必須在unsigned char數組中插入1到32的十六進制值,然後執行發送。我的代碼看起來像這樣如何在十六進制字符數組中插入十六進制值

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'錯誤。
如何在writebuffer數組中插入hex unsigned

當使用

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

我更新了代碼 – user3048644

回答

0

您將不得不使用memcpy來複制三個字符數組。

1

您可以將兩條線路

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

writebuffer[3]= hexunsigned; 

合併成一個:

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

和臨時hexunsigned是多餘的
------------- -------更新行--------------------
其實當我們說十六進制編碼時,我們想用兩個字節來表示一個o riginal字節,例如 0x33 30 // '3' '0'代表0x30
所以在你,如果你想用sprintf從十進制轉換爲十六進制的情況下0x01~0x20應表示爲0x00 010x02 00,你可以爲這個使用方法:

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

而你的輸出將如此"01 05 00 30 31 00 00 00"對於沒有考慮CRC16的i = 1。

+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)'會分配十六進制='1'(注意,它是一個不是數字1的字符'1'),如果使用'printf(「 %X「,十六進制[0])'你會看到31。 – WKPlus