如何在python3上使用RFID模块MFRC522-UART串口? (encoding/decoding 个问题)
How to use RFID module MFRC522-UART serial on python 3? (encoding/decoding issue)
我正在尝试在 UART 上使用经过修改的 MFRC522 模块,但我无法在 python 3.
中找到串行 read/write 的正确格式
python 2 有一个 library 适合我:
link 上的自述文件也描述了对模块的修改。
我无法让函数 writeRegister
和 readRegister
中的 .self.ser.write
和 .self.ser.read
在 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 吗?
在Python2.x或3.x中应该不需要使用char
,你可以只写字节到端口:
self.ser.write(bytes[addr&0x7F])
对于阅读功能,只需从 return 句子中删除 ord()
,Python 3.x.
不需要
有关详细信息,请参阅 。
搞定了,谢谢!
以下是更正后的函数:
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")
我正在尝试在 UART 上使用经过修改的 MFRC522 模块,但我无法在 python 3.
中找到串行 read/write 的正确格式python 2 有一个 library 适合我:
link 上的自述文件也描述了对模块的修改。
我无法让函数 writeRegister
和 readRegister
中的 .self.ser.write
和 .self.ser.read
在 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 吗?
在Python2.x或3.x中应该不需要使用char
,你可以只写字节到端口:
self.ser.write(bytes[addr&0x7F])
对于阅读功能,只需从 return 句子中删除 ord()
,Python 3.x.
有关详细信息,请参阅
搞定了,谢谢!
以下是更正后的函数:
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")