如何在Python 3上使用RFID模块MFRC522-UART串行?(编码/解码问题)



我正在尝试在UART上使用修改的MFRC522模块,但是我被困在Python 3中找到正确的串行读/写入格式。

有一个适合我的python 2库:

该链接上的读数也描述了模块的修改。

我在函数writeRegisterreadRegister中获得.self.ser.write.self.ser.read在Python 3中工作时遇到了麻烦。这些获取字符串输入,我现在了解到这对于Python 2来说是可以的,但是必须将其转换为Python 3的字节3。<<<<<<<<<</p>

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'xc2x80'

也许这越来越近了,但是我会遇到如何回复和解码。我不知道如何或是否修改ord零件。因此,我似乎无法从MFRC522获得回应。

有人有任何建议吗?
有人在Python 3上成功使用了此MFRC522 UART?

不需要在python 2.x或3.x中使用 char,您只需将字节写入端口: self.ser.write(bytes[addr&0x7F])

对于读取功能,只需从返回句子中删除 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")

最新更新