python 3.5 中pyserial串口通信如何向串口發送十六進位通信指令?

python3.5,串口編程時用serial.write()向串口發送十六進位指令會報錯,比如serial.write(0xaa0902630000bb):

"""convert a sequence to a bytes type"""

MemoryError

如果轉換為二進位再發,serial.write(?10101010000000010000000110100001000000000000000010111011?),繼續報錯:

"""convert a sequence to a bytes type"""

OverflowError: cannot fit "int" into an index-sized integer

請問這是什麼原因?是十六進位轉化的方法有問題嗎?應該直接轉二進位數還是通過ASCII對照錶轉換成二進位數?還是十六進位數表達方式不對?

PS:通過串口調試助手發送十六進位通信指令aa0902630000bb 時,串口通信正常。


已解決。

發送十六進位指令先將十六進位數轉化為十進位值,然後通過ser.write()發送。在python中,只有bytes類型能通過串口收發,轉化的實質是將十六進位代碼逐位元組轉化為bytes類型,就是位元組流。

舉個例子:

ser=serial.Serial("com1",921600) #初始化串口

begin=bytes([170,9,2,161,0,0,187]) #定義開始指令,差分連續單通道模式(aa 09 02 a1 00 00 bb)

stop=bytes([170,0,0,0,0,0,187]) #定義結束指令(aa 00 00 00 00 00 bb)

ser.write(begin) #開始指令發送,發送了7位元組bytes類型

x=ser.read(600) #數據接收,接收了600位元組bytes類型

ser.write(stop) #結束採集


之前正好也在找, 找到了過來答一下吧!

import array

num_55=array.array("B",[0x55]).tostring()
num_aa=array.array("B",[0xaa]).tostring()

這樣轉換一下就行了


優雅的解決方案是使用struct模塊,該模塊的主要作用就是對python基本類型值與用python字元串格式表示的C struct類型間的轉化(This module performs conversions between Python values and C structs represented as Python strings.)


想通過python給串口發送A0 01 01 A2的指令,博主能指點一下么


import binascii

def order_list():
a = "aa0902630000bb"
a_list = []
for i in a.split():
a_list.append(binascii.a2b_hex(i))
return a_list

ser = serial.Serial("/dev/ttyUSB0", 9600)
ser.writelines(order_list())


推薦閱讀:

TAG:Python | 串口通信 | 十六進位 | python35 |