通过pySerial通过Python控制Adruino

通过pySerial通过Python控制Adruino,python,tkinter,arduino,ascii,pyserial,Python,Tkinter,Arduino,Ascii,Pyserial,您好,提前感谢您抽出时间 我正试图通过使用pySerial和Tkinter的python脚本控制一系列连接到我的Arduino的继电器。问题是,尽管我知道我的代码正在连接到我的Arduino(我听到了我使用Arduino软件上传代码时听到的相同的继电器抖动),但我无法让继电器响应Tkinter GUI发送的命令。以下是我的python代码: ser = Serial(port=3, timeout=1, writeTimeout=1, baudrate=9600) # ensure non-b

您好,提前感谢您抽出时间

我正试图通过使用pySerial和Tkinter的python脚本控制一系列连接到我的Arduino的继电器。问题是,尽管我知道我的代码正在连接到我的Arduino(我听到了我使用Arduino软件上传代码时听到的相同的继电器抖动),但我无法让继电器响应Tkinter GUI发送的命令。以下是我的python代码:

ser = Serial(port=3, timeout=1, writeTimeout=1, baudrate=9600)  # ensure non-blocking

class Application(Frame):

    print("Arduino Dish Control Ready")

    def __init__(self, parent):  # create constructor
        Frame.__init__(self, parent)  # define parent
        self.parent = parent  # save reference of parent widget
        self.initUI()  # delegate creation of the initUI() method

    def initUI(self):
        self.parent.title("Dish Control")  # title of window

        Style().configure("TButton", padding=(0, 5, 0, 5), font='serif 10')

        self.columnconfigure(0, pad=4)
        self.columnconfigure(1, pad=4)
        self.columnconfigure(2, pad=4)
        self.columnconfigure(3, pad=4)
        self.columnconfigure(4, pad=4)

        self.rowconfigure(0, pad=3)
        self.rowconfigure(1, pad=3)
        self.rowconfigure(2, pad=3)
        self.rowconfigure(3, pad=3)

        def UP():  # define the UP command.
            ser.write(str(32))  # convert "32" to ASCII and send it via serial port (USB) to arduino.
            print ser.write(str(64))
            # sleep(0.1)
        up = Button(self, text="Up", command=UP)  # create button UP and set the command.
        up.grid(row=0, column=1)  # define position of UP button.


        self.pack()
Traceback (most recent call last):
  File "C:\Python27\lib\lib-tk\Tkinter.py", line 1536, in __call__
    return self.func(*args)
  File "C:/Users/Radio Astro 4/PycharmProjects/untitled/DishControl.py", line 46, in UP
    ser.write(32)  # convert "1" to ASCII and send it via serial port (USB) to arduino.
  File "C:\Python27\lib\site-packages\serial\serialwin32.py", line 283, in write
    data = to_bytes(data)
  File "C:\Python27\lib\site-packages\serial\serialutil.py", line 75, in to_bytes
    for item in seq:
TypeError: 'int' object is not iterable
以下是相关的Arduino代码:

void loop(){
  if(Serial.available() > 0){
    Serial.begin(9600);
    int inByte = Serial.read(); //read the incoming data
    Serial.print("I received: ");
    Serial.println(inByte, DEC);

    if(Serial.read() == 32){//If the serial reads 32...
      digitalWrite(8, LOW); //Motor Select Low
      digitalWrite(9, LOW);
      digitalWrite(10, LOW); //Motor 1 Low
      digitalWrite(11, LOW);
      digitalWrite(12, LOW); // Motor 2 Low
      digitalWrite(13, LOW);
      digitalWrite(6, HIGH); //Motor Power High
      digitalWrite(7, HIGH);
    }
  }
}
很抱歉包含这么多,但我不确定我的错误在哪里

编辑:有人要求我在python代码中简单地包含ser.write(32)而不是ser.write(str(32))时包含对给定错误的回溯:

ser = Serial(port=3, timeout=1, writeTimeout=1, baudrate=9600)  # ensure non-blocking

class Application(Frame):

    print("Arduino Dish Control Ready")

    def __init__(self, parent):  # create constructor
        Frame.__init__(self, parent)  # define parent
        self.parent = parent  # save reference of parent widget
        self.initUI()  # delegate creation of the initUI() method

    def initUI(self):
        self.parent.title("Dish Control")  # title of window

        Style().configure("TButton", padding=(0, 5, 0, 5), font='serif 10')

        self.columnconfigure(0, pad=4)
        self.columnconfigure(1, pad=4)
        self.columnconfigure(2, pad=4)
        self.columnconfigure(3, pad=4)
        self.columnconfigure(4, pad=4)

        self.rowconfigure(0, pad=3)
        self.rowconfigure(1, pad=3)
        self.rowconfigure(2, pad=3)
        self.rowconfigure(3, pad=3)

        def UP():  # define the UP command.
            ser.write(str(32))  # convert "32" to ASCII and send it via serial port (USB) to arduino.
            print ser.write(str(64))
            # sleep(0.1)
        up = Button(self, text="Up", command=UP)  # create button UP and set the command.
        up.grid(row=0, column=1)  # define position of UP button.


        self.pack()
Traceback (most recent call last):
  File "C:\Python27\lib\lib-tk\Tkinter.py", line 1536, in __call__
    return self.func(*args)
  File "C:/Users/Radio Astro 4/PycharmProjects/untitled/DishControl.py", line 46, in UP
    ser.write(32)  # convert "1" to ASCII and send it via serial port (USB) to arduino.
  File "C:\Python27\lib\site-packages\serial\serialwin32.py", line 283, in write
    data = to_bytes(data)
  File "C:\Python27\lib\site-packages\serial\serialutil.py", line 75, in to_bytes
    for item in seq:
TypeError: 'int' object is not iterable
关于
Serial.read()
命令:

退换商品 输入串行数据的第一个字节可用(如果没有可用数据,则为-1)-
int

您正在向微控制器发送字符串“32”,这实际上是发送的两个字节。当检查
if(Serial.read()==32)
时,您会检查字节值32,但字节值32(ASCII空格)永远不会被发送

更改send命令以直接传输字节值:

ser.write(32)  # without str()
编辑: 将(字节-)字符串作为参数,因此必须执行以下操作:

ser.write(bytes([32]))  # convert the list `[32]` to a bytestring

对不起,我应该提到这样做会给我一个错误:“TypeError:‘int’object is not iterable”是否还有其他解决方法可以解决这个问题?您的错误和回溯是什么?请在你的主要问题中包括这一点,回溯对于解决你的问题是不可避免的抱歉耽搁了-我周末出城了。我已经更新了问题以包含回溯。@马特:如果这解决了你的问题,请将答案勾选为“已接受”,它肯定有帮助,但没有完全解决问题。一旦我把所有的东西都整理好,我会为任何遇到这个问题的人发布一个总结,并接受你的答案!在void_loop()中,你不应该使用“ser”类实例而不是“Serial”吗?对于串口,你根本不了解,但是“Serial”不知道读/写哪个端口,等等。你应该在python代码中使用ser.begin()。我在上面代码的第一行中定义了要使用哪个端口“Serial”。将其定义为“ser”是否会使该信息无效?如果是这样,我必须每次键入整行吗?另外,我应该在哪里包括ser.begin()?在查找类似的示例时,例如:我没有看到它被使用。好的,我调查了您的第一个建议,但我仍然必须使用类似的内容:Serial.write(ser,32),只要定义了“ser”,它的工作原理与ser.write(32)相同。我不能从Serial.write(ser,32)中省略“ser”,因为这里需要输入“IronSerial”和“data”。