一. 發(fā)送相關(guān):
-
self.transport.write()
函數(shù)只能發(fā)送字符串類型的參數(shù)!!! -
RFID
只接收字節(jié)流的指令碼!!!
所以:
(1). 可直接發(fā)送字節(jié)流的字符串表示
data = '\xff\xff\xf1\x07\x06\xf1'
#類型是str,但打印出來(lái)是無(wú)法識(shí)別的字節(jié)碼
self.transport.write(data)
(2). 給參數(shù)賦值字符串指令碼(此時(shí)并不是字節(jié)流所以要進(jìn)行下一步)
dataStr ='FF FF F1 06 06 F1'
然后用bytearray.fromhex(dataStr)
將字符串轉(zhuǎn)換成字節(jié)流
byteData=bytearray.fromhex(dataStr)
最后將字節(jié)流轉(zhuǎn)換成字符串進(jìn)行發(fā)送
self.transport.write(str(bytedata))
二. 接收相關(guān)
- 從RFID接收過(guò)來(lái)的數(shù)據(jù)是字節(jié)流的字符串表示(即
字節(jié)串
,字節(jié)串其實(shí)就是字節(jié)流).類型是str
.print
出來(lái)是無(wú)法識(shí)別的字節(jié)碼同一中的(1)
- 實(shí)踐證明
datareceived
對(duì)RFID
傳過(guò)來(lái)的數(shù)據(jù)是一個(gè)字節(jié)一個(gè)字節(jié)的進(jìn)行接收的,這個(gè)函數(shù)宏觀上只執(zhí)行了一次,但是實(shí)際上有幾個(gè)字節(jié)執(zhí)行幾次,一直到接受完畢為止. - 對(duì)字節(jié)流數(shù)據(jù)進(jìn)行解析(解包)的
construct
函數(shù),只接收字節(jié)串(字節(jié)流)參數(shù)所以需要再轉(zhuǎn)換成字節(jié)串才能進(jìn)行解析
所以:
(1).先使用 binascii.b2a_hex(data)
或者hexlify(data)
.由函數(shù)意思binary to ascii.作用是返回的二進(jìn)制數(shù)據(jù)的十六進(jìn)制表示.每一個(gè)字節(jié)的數(shù)據(jù)轉(zhuǎn)換成相應(yīng)的2位十六進(jìn)制表示.因此產(chǎn)生的字串是源數(shù)據(jù)兩倍長(zhǎng)度。a2b_hex
和unhexlify
則執(zhí)行反向操作(所得仍然是字符串類型)
self.data_list += binascii.b2a_hex(data)
#累加字符串,注意,字節(jié)串是不能直接進(jìn)行加法的.
若是只進(jìn)行串口的調(diào)試其實(shí)到這一步就算通了
(2). 對(duì)(1)中轉(zhuǎn)化成的字符串再次轉(zhuǎn)化成字節(jié)流
byteData = bytearray.fromhex(self.data_list)
(3). 對(duì)字節(jié)流中的數(shù)據(jù)進(jìn)行解包處理.
pkgs, leftovers = self.rfid.parse_pkgs(byteData)
# 解析字節(jié)流轉(zhuǎn)化為可識(shí)別的指令碼存在pkgs(一個(gè)列表),剩下的存在leftovers
if len(pkgs) != 0 and len(leftovers) == 0:對(duì)數(shù)據(jù)包的正確性進(jìn)行判斷
(4). 處理數(shù)據(jù)
調(diào)用handlDatas函數(shù).從返回的列表中取有用的數(shù)據(jù)