调试Python bus.write_byte中的IO错误

时间:2014-07-16 17:06:40

标签: python tkinter raspberry-pi

尝试通过i2C将覆盆子pi中的Mouse xy坐标发送到连接的arduino。

以下Python脚本适用于RPi

import smbus
import time
# for RPI version 1, use "bus = smbus.SMBus(0)"
bus = smbus.SMBus(1)

# This is the address we setup in the Arduino Program
address = 0x04

def writeNumber(value):
    bus.write_byte(address, value)
    # bus.write_byte_data(address, 0, value)
    return -1

def readNumber():
    number = bus.read_byte(address)
    # number = bus.read_byte_data(address, 1)
    return number

while True:
    var = input("Enter 1 - 9: ")
    if not var:
        continue

    writeNumber(var)
    print "RPI: Hi Arduino, I sent you ", var
    # sleep one second
    #time.sleep(1)

    number = readNumber()
    print "Arduino: Hey RPI, I received a digit ", number
    print

但是当我尝试将上面的代码与预先存在的Python类合并为鼠标XY坐标时,我在writeNumber方法上不断出现IO错误,特别是在以下行中

self.bus.write_byte(self.address, value)

这是完整的Python类。任何Python专家都可以建议可能出现的问题,或者我可能采取哪些故障排除步骤来解决IO错误?

try:
    # Python2
    import Tkinter as tk

    import smbus
    import time


except ImportError:
    # Python3
    import tkinter as tk

class MouseXY(object):
    def __init__(self, root):
        self._root = root
        # for RPI version 1, use "bus = smbus.SMBus(0)"
        self.bus = smbus.SMBus(1)

        # This is the address we setup in the Arduino Program
        self.address = 0x04

        self.createCanvas()
    def createCanvas(self):
        canvas = tk.Canvas(self._root, bg='white')
        canvas.grid(column=0, row=1, sticky='nwes')
        canvas.bind("<Button-1>", self.clicked)
        canvas.bind("<Enter>", self.entered)
        canvas.bind('<Motion>', self.motion)

    def clicked(self, event):
        x, y = event.x, event.y
        s = "Last point clicked at x=%s  y=%s" % (x, y)
        self._root.title(s)
        print('{}, {}'.format(x, y))
    def entered(self, event):
        x, y = event.x, event.y
        s = "Cursor at x=%s  y=%s" % (x, y)
        self._root.title(s)
    def motion(self,event):
        x, y = event.x, event.y
        print('{}, {}'.format(x, y))
        self.writeNumber(x)
        print "RPI: Hi Arduino, I sent you ", x
        print
    def writeNumber(self,value):       
        print "writeNumber  self.bus ",  self.bus       
        print "writeNumber  self.address ",  self.address
        print "writeNumber  value ",  value
        self.bus.write_byte(self.address, value)
        return -1

def createFunction():
    pass
def main():
    root = tk.Tk()
    app = MouseXY(root)

    root.mainloop()
if  __name__ == '__main__':
    main()

0 个答案:

没有答案