我正在尝试在UART上使用经过修改的MFRC522模块,但是我一直在寻找在python 3中进行串行读/写的正确格式。
python 2有一个library对我有用:
该链接上的自述文件还描述了对该模块的修改。
我在让函数.self.ser.write
和.self.ser.read
中的writeRegister
和readRegister
到在python 3中工作时遇到了麻烦。这些得到字符串输入,我现在理解的是对于python 2很好,但是对于python 3必须转换为字节。
def writeRegister(self, addr, val, size=None):
if size is None:
count = 0
while True:
self.ser.flushInput()
self.ser.write(chr(addr&0x7F))
self.ser.write(chr(val))
tmp = ord(self.ser.read(1))
if(tmp == addr):
return True
count+=1
if(count > 10):
print ("Error de escritura en: "+ hex(addr))
return False
else:
self.ser.flushInput()
for txBytes in range (0, size):
self.ser.write(chr(addr&0x7F))
tmp = ord(self.ser.read(1))
if(tmp == addr):
self.ser.write(chr(val[txBytes]))
else:
print ("Error de escritura en bloque")
return False
return True
def readRegister(self, addr):
self.ser.flushInput()
self.ser.write(chr(addr|0x80))
val = self.ser.read(1)
return ord(val)
我怀疑正确地应用.encode('utf-8')
或类似的问题,但是我找不到有效的解决方案。如果我尝试
chr(0x80).encode('utf-8')
我明白了
UnicodeDecodeError: 'ascii' codec can't decode byte 0x80 in position 0: ordinal not in range(128)
也许我走错了路。
我将尝试bytes
:
bytes(chr(0x80), 'utf-8')
在这种情况下给出2个字节(我猜是> 128):
b'\xc2\x80'
也许这越来越近了,但是我在如何读回和解码上陷入了困境。我不知道如何或是否修改ord
部分。所以我似乎无法从mfrc522得到响应。
有人有什么建议吗?
有人在python 3上成功使用了mfrc522 UART吗?
答案 0 :(得分:1)
在Python 2.x或3.x中都不需要使用char
,您只需将字节写入端口即可:
self.ser.write(bytes[addr&0x7F])
对于读取功能,只需从返回语句中删除ord()
,Python 3.x不需要。
有关更多详细信息,请参见here。
答案 1 :(得分:1)
做到了,谢谢!
以下是更正的功能:
def writeRegister(self, addr, val, size=None):
if size is None:
count = 0
while True:
self.ser.flushInput()
self.ser.write(bytes([addr&0x7F]))
self.ser.write(bytes([val]))
tmp = int.from_bytes(self.ser.read(1), "big")
if(tmp == addr):
return True
count+=1
if(count > 10):
print ("Write error at: "+ hex(addr))
return False
else:
self.ser.flushInput()
if(tmp == addr):
self.ser.write(bytes([val]))
else:
print ("Block write error")
return False
return True
def readRegister(self, addr):
self.ser.flushInput()
self.ser.write(bytes([addr|0x80]))
val = self.ser.read(1)
return int.from_bytes(val, "big")