Как использовать RFID-модуль MFRC522-UART serial на Python 3?(проблема кодирования / декодирования) - PullRequest
2 голосов
/ 23 июня 2019

Я пытаюсь использовать модифицированный модуль MFRC522 в UART, но я застрял, находя правильное форматирование для последовательного чтения / записи в python 3.

Существует библиотека для python 2, которая работает для меня:

В файле readme по этой ссылке также описана модификация модуля.

У меня проблемы с получением .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.

У кого-нибудь есть предложения?
Кто-нибудь успешно использовал этот mfrc522 UART на python 3?

Ответы [ 2 ]

1 голос
/ 24 июня 2019

Вот и все, спасибо!
Вот исправленные функции:

  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")
1 голос
/ 23 июня 2019

Нет необходимости использовать char в Python 2.x или 3.x, вы можете просто записать байты в порт: self.ser.write(bytes[addr&0x7F])

Для функции чтения просто удалите ord() из возвращаемого предложения, это не нужно для Python 3.x.

Подробнее см. здесь .

...