我知道這個問題已經被問了很多次。我遇到了一個問題,我通過serial communication
ubuntu
收到幾個hex bytes
。我寫了一個讀取所有數據並顯示它的C代碼。它工作正常,因爲我用很多字符串測試過它。我還有另一個系統運行windows和一個名爲Docklight
的軟件。該軟件給我十六進制字節,我需要在我的應用程序中接收它。 十六進制字節是象下面這樣:無法在C中打印十六進制字節
FF AA 2E 0F CC 0D
我已連接兩者經由串行通信電纜的系統。現在要打印十六進制字節,我們需要在printf語句中包含%02X
。這樣做,它給了我一個format ‘%X’ expects argument of type ‘unsigned int’, but argument 2 has type ‘unsigned char *’
的警告。我搜索了這個,並用%p
代替它。下面是代碼:
unsigned char buf[255];
res = read(fd,buf,255);
buf[res]='\0';
printf("data: %p\n",buf);
的printf語句的輸出是data: 0x603380
。我打開BUF變量,看看哪些是下面的精確值:
Name : buf
Details:"ÿª.\017Ì\n", '\0' <repeats 248 times>
Default:0x603380 <buf>
Decimal:6304640
Hex:0x603380
Binary:11000000011001110000000
Octal:030031600
現在我真的不知道爲什麼會出現隨機字符,如ÿª.\017Ì\n
中的printf的輸出是可能是因爲它結合了所有字節合併爲一個並顯示其十六進制等值。
我實際上需要將像FF
和AA
這樣的每個字節保存在一個數組中。但就目前而言,我首先想到了它。可能是什麼問題。爲什麼它不顯示十六進制字節。任何人都可以給我這方面的建議。我還需要知道,當我們通過串行傳輸十六進制字節時,接收端應該如何接收它。它應該保存爲int
或strings
。謝謝。!
你的'printf'的輸出是因爲你打印了'buf'的第一個元素的基地址作爲一個依賴於系統的格式*指針*。 [查看'%p'作爲'printf'的格式說明符。](http://en.cppreference.com/w/c/io/fprintf)。總之,它不會做你認爲它所做的事情。你需要一個*循環*。而且,你的'buf'只能從0..254索引。如果這個'read'調用完全填充255個八位字節,那麼在後續行中的不必要的終止符放置將調用*未定義的行爲*。 – WhozCraig
@WhozCraig好的。你的意思是我需要一個循環並分別轉換每個字節並將它們保存在緩衝區中。 –
'對(INT I = 0; I <水庫;我++)printf的[ 「%02X」,BUF [I]); printf(「\ n」);'順着你的緩衝區已經包含那個valkues,你不需要轉換它們。你對printf的處理是用ASCII格式將其打印出來。 – LPs