我在与Arduino通信时使用PySerial有问题

时间:2014-11-26 02:22:48

标签: arduino pyserial

所以我试图为我的电脑制作一个照明系统,我想在Python中编写GUI和诸如此类的东西来处理灯光和Arduino的所有控制。经过一些研究,PySerial似乎是最容易使用和理解自己成为初学者。老实说,我不知道我在这里做了什么,而且我得到的错误是我无法诊断出来的,谷歌也没有任何帮助。

这是我现在在python中运行的代码:

import serial

ser = serial.Serial('COM8', 9600) # Establish the connection on a specific port

while True:
    numIn = str(input("Enter a Color value: "))
    ser.write(numIn)
    print (ser.readline())

在Arduino方面,我有:

void setup ()
{
    Serial.begin (9600);
    Serial.println ("Ready\n\n");
}

void loop ()
{
    int intensity = 0;
    while (Serial.available() == 0)

    while (Serial.available() > 0)
    {
        char byteIn = Serial.read();
        intensity += int(byteIn) - '0';
        Serial.print(byteIn);
   }
}

通过Python我将发送一个0到255之间的值,该数字应保存为字符串,然后发送到Arduino,然后逐个字符地创建一个整数。出于调试原因,我想将字符串回显给Python,但我还没有让我的代码运行到目前为止。我尝试将数据从Python发送到Arduino的方式有些什么,这是我得到的Trace:

Enter a Color value: 25
Traceback (most recent call last):
  File "C:\Users\Squirrelzar\Documents\Python Proj\Arduino Serial Testing.py", line 10, in <module>
    ser.write(numIn)
  File "C:\Python34\lib\site-packages\serial\serialwin32.py", line 283, in write
    data = to_bytes(data)
  File "C:\Python34\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

我使用Python 3.4和PySerial 2.7

任何帮助都会非常感激。我很失落..

1 个答案:

答案 0 :(得分:1)

您可以从python发送整数值作为字符串,并使用Serial.parseInt()将其直接在Arduino中作为整数读取。下一个代码适用于我(linux,python 2.7):

的Python:

import serial

ser = serial.Serial('/dev/ttyACM1', 9600)
print (ser.readline())

while True:
    numIn = raw_input("Enter a Color value: ")  # Returns the value as string
    ser.write(numIn)
    msg = ser.readline()
    print (msg)

Arduino的:

void setup ()
{
    Serial.begin (9600);
    Serial.print ("Ready\n");
}
void loop ()
{
   while(Serial.available())
   {
     int inNumber = Serial.parseInt(); # retunrs the first valid long integer buffered 
     Serial.print(inNumber);
     Serial.print('\n');
  }
}

评论,如果你发送Serial.println ("Ready\n\n");,你必须在阅读其他数据之前阅读所有新行字符