一. 发送相关:
-
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函数.从返回的列表中取有用的数据