Python PC到Arduino串行通信

时间:2015-01-13 13:22:19

标签: python serial-port arduino

我对Python和Arduino都很陌生。如果您需要更多信息,请告诉我。

我想做什么: 我想用arduino控制一些伺服系统。我想在PC上的GUI(后来的RPi)中更改Servos的角度,并通过串行通信将它们发送到Arduino

我的Arduino代码如下:

#include <Servo.h> 

int angle;
int pinServo1 = 5;
Servo servo1;       
int min = 0.547;    
int max = 2.47;     

void setup()
{
   Serial.begin(9600);
   pinMode(pinServo1,OUTPUT);   
   servo1.attach(pinServo1,min,max);        
}

void loop()
{
   if(Serial.available() > 0)
      {
        Serial.read();
        angle = Serial.parseInt();
        servo1.write(angle);
      }
}

到目前为止没有错误。

问题似乎是我的Python代码:

import serial
import time

arduino = serial.Serial(8,9600)

while 1:
    print ("Enter new angle:")
    string = input()
    angle = str(string)
    arduino.write(angle)
    time.sleep(2)
    print ("Transmission successful!")

我收到了这个错误:

Enter new angle:
90
Traceback (most recent call last):
  File "C:/Users/yoogibubu/Desktop/STUDIUM/BACHELORARBEIT/GUI/send.py", line 10, in <module>
    arduino.write(angle)
  File "C:\Program Files (x86)\PYTHON\lib\site-packages\serial\serialwin32.py", line 283, in write
data = to_bytes(data)
  File "C:\Program Files (x86)\PYTHON\lib\site-packages\serial\serialutil.py", line 76, in to_bytes
    b.append(item)  # this one handles int and str for our emulation and ints for Python 3.x
TypeError: an integer is required
>>>    

如果我尝试将输入解析为整数,我会收到另一个错误:

TypeError: 'int' object is not iterable

有人可以告诉我有什么问题吗?提前谢谢!

2 个答案:

答案 0 :(得分:0)

serial.write需要一个字节数组数据类型参数。对于发送字符串,必须首先将它们转换为字节数组,尤其是在Python3.x中,因为字符串是使用Unicode存储的,这使得更简单的字符数组更加精细。

尝试以下方法:

arduino.write(angle.encode())

答案 1 :(得分:0)

您应该可以直接写下loop()

void loop()
{
   if(Serial.available() > 0)
      {
        angle = Serial.read();
        servo1.write(angle);
      }
}

但问题出在servo1.attach()。对于我们中的最小和最大脉冲,您的伺服minmax应该是int值(而不是ms)。这用于映射阅读结果。

你可能想要这样的东西:

#include <Servo.h> 

int angle;
int pinServo1 = 5;
Servo servo1;       
int min = 547; //in us - BTW 1000 would be safer but servo has less range    
int max = 2470;  //in us - BTW 2000 would be safer  

void setup()
{
   Serial.begin(9600);
   pinMode(pinServo1, OUTPUT);   
   servo1.attach(pinServo1, min, max);        
}

void loop()
{
   if(Serial.available() > 0)
      {
        angle = Serial.read();
        servo1.write(angle);
      }
}