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