2016-08-15 116 views
0

我在Raspberry Pi中使用Python,我的數據包是十六進制值,如"0x750x010x010x060x000x08"。我想UART和樹莓派之間的串行通訊,所以我寫了樹莓派使用Python程序,我檢查的終端數據,但是當我在終端選擇ASCII選項,則顯示以下輸出:Raspberry Pi - 如何打印十六進制值?

75 
01 
01 
06 
00 
08 

當我在終端中選擇的十六進制選項它沒有顯示在輸出上面。現在我想要上面的輸出,當我選擇十六進制選項,但不是ASCII選項。那麼如何獲得?如果我需要將其轉換爲十六進制或字節,或者以其他方式告訴我Python中的代碼。

回答

0
import serial 

port=serial.Serial("/dev/ttyAMA0",baudrate=115200,timeout=3.0) 

while True: 
    a="0x750x010x010x060x000x08" 
    b=a.replace("0x"," ") 
    #print b 
    alist = b.split(" ") 
    for element in alist 
     port.write("\r\n"+str(element)) 

這給所需格式的數據你想要

+0

感謝ü阿布舍克..但這會在樹莓派終端輸出...我希望通過在uart終端中選擇十六進制選項在uart終端輸出 –

+0

請解釋整個場景,以便我可以幫到你 –

+0

我附上了終端窗口輸出的快照...你可以看到在我編輯的問題..我可以看到,我已經選擇了ASCII我的選擇,但即時通訊選擇十六進制選項時,它不會給這個輸出...我希望同樣的輸出,當我選擇十六進制選項,我不想這個輸出在ASCII選項 –

0

首先你for環和if statment使用錯在這裏,他們是不需要的。該while迴路可以equivently rewriten爲:

a = "0x750x010x010x060x000x08" 
b = a.replace("0x", " ") 
while True: 
     port.write("\r\n"+b) 

你的主要misanderstanding是,你認爲Python的理解要遍歷十六進制數。但事實並非如此。在你原來的循環中,它只是逐字逐字地循環訪問a字符串。實際上,在for循環的每次迭代中,您只需將原始a字符串更改爲「75 01 01 06 00 08」並將其作爲字符串發送。

如果你需要發送字節,你應該把你的字符串分成單獨的記錄,每個字節的信息並將這些記錄轉換爲字節。 下面是在評論認爲

a = "0x750x010x010x060x000x08" 
b1 = a.split("0x") 
# b1 is ["", "75", "01", "01", "06", "00", "08"], the values are still strings 
b2 = [int(x, 16) for x in b1[1:]] 
# b2 is a list of integers, the values calculated from strings assuming they are hex (16-bit) numbers 
# use b1[1:] to cut the first blank string 
b = str(bytearray(b2)) 
#b joins values list into a bytes string (each interger transformed into one byte) 
while True: 
     port.write("\r\n" + b) 

更新問題的代碼: 如果a格式是這樣「0x750101060008」,您只需2個字母把它分解:

b1 = [a[2*i:2*i+2] for i in range(len(a)/2)] 
+0

謝謝你...但這會給出錯誤,如 b2 = [int (x,16)for x in b1] ValueError:無效文字爲int()與基地16:''...所以如何解決這個問題? –

+0

對不起,修正了。問題在於分割給第一個項目帶有空白字符串。 –

+0

非常感謝你..正是給出了我想要的輸出,當在uart終端窗口中選擇十六進制選項 –