2016年10月20日 星期四

在7688環境中使用nfcpy

硬體:
Linkit Smart 7688 *1
Breakout for Linkit Smart 7688 *1
Grove NFC *1

首先
將Linkit Smart 7688接上Breakout,並將Grove NFC接到Breakout的UART 1

在openwrt環境下安裝nfcpy

pip install nfcpy


安裝完畢後進入python shell

>>> import nfc
>>> clf = nfc.ContactlessFrontend('ttyS1')

此時應該會出現errno.ENODEV, os.strerror(errno.ENODEV)之類的錯誤,這類的錯誤發生在於改變Grove NFC上的PN532 baudrate時出現問題,這時可以利用
vim /usr/lib/python2.7/site-packages/nfc/clf/pn532.py
進入編輯模式,拿掉下面的程式碼
if sys.platform.startswith("linux"):
  stty = 'stty -F %s %%d 2> /dev/null' % transport.port
  for baudrate in (921600, 460800, 230400, 115200):
    log.debug("trying to set %d baud", baudrate)
    if os.system(stty % baudrate) == 0:
      os.system(stty % 115200)
      break
if baudrate > 115200:
  set_baudrate_cmd = bytearray.fromhex("0000ff03fdd410000000")
  set_baudrate_rsp = bytearray.fromhex("0000ff02fed5111a00")
  set_baudrate_cmd[7] = 5+(230400,460800,921600).index(baudrate)
  set_baudrate_cmd[8] = 256 - sum(set_baudrate_cmd[5:8])
  transport.write(long_preamble + set_baudrate_cmd)
  if not transport.read(timeout=100) == Chipset.ACK:
    raise IOError(errno.ENODEV, os.strerror(errno.ENODEV))
  if not transport.read(timeout=100) == set_baudrate_rsp:
    raise IOError(errno.ENODEV, os.strerror(errno.ENODEV))
    transport.write(Chipset.ACK)
    transport.open(transport.port, baudrate)
    log.debug("changed uart speed to %d baud", baudrate)
    time.sleep(0.001)

這樣就不會有errno.ENODEV之類的錯誤出現。