pySerial write()在Python解释器中工作正常,但不适用于Python脚本

How*_*hen 5 python serial-port arduino pyserial raspberry-pi

最近,我试图对Arduino进行"轻控制".我使用Raspberry Pi通过串口(USB线)发送控制消息.这是Arduino代码:

int redled = 12;
int whiteled = 48;

void setup()
{
    Serial.begin(9600);
    pinMode(redled,OUTPUT);
    pinMode(whiteled,OUTPUT);
}

void loop()
{
    if(Serial.available())
    {
        char cmd = Serial.read();
        switch(cmd)
        {
            case'r':
            digitalWrite(redled,HIGH);
            delay(2000);
            digitalWrite(redled,LOW);
            break;

            case'w':
            digitalWrite(whiteled,HIGH);
            delay(2000);
            digitalWrite(whiteled,LOW);
            break;
        }
    }
    else
    {
        Serial.println("hello pi");
        delay(1000);
    }

}
Run Code Online (Sandbox Code Playgroud)

之后,我使用Python解释器的pySerial来控制引脚,一切都运行正常.这是一个解释器输出:

Python 2.7.3 (default, Mar 18 2014, 05:13:23)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import serial
>>> ser = serial.Serial('/dev/ttyACM0',9600)
>>> x = ser.read(10)
>>> print 'x = ',x
x =  hellhello
>>> ser.write('w') #white led turn on and off
1
>>> ser.close()
>>>
Run Code Online (Sandbox Code Playgroud)

一切正常,导致确实打开和关闭,所以我决定写一个简单的Python脚本来做同样的事情:

import serial
import time
ser = serial.Serial('/dev/ttyACM0',9600)
x = ser.read(10)
print 'x = ',x

time.sleep(2)
ser.write('w')

ser.close()
Run Code Online (Sandbox Code Playgroud)

以下是执行命令和结果:

pi@raspberrypi ~ $ python serialtest.py
x =  helello pi
Run Code Online (Sandbox Code Playgroud)

它只出现在Arduino的字符串中,但根本没有指示灯打开.看起来一切都应该没问题,所以我不知道问题是什么.我已经搜索了一些文章并在"ser.write()"之前添加了"time.sleep(2)",但它仍然无法正常工作.我会感激任何帮助,非常感谢提前!

更新:我让控制器将我收到的数据发回给我,看起来它在我运行脚本时没有收到任何东西,但是当我从解释器发送数据时收到了所有内容.arduino代码的代码现在看起来像这样:

int redled = 12;
int whiteled = 48;

void setup()
{
    Serial.begin(9600);
    pinMode(redled,OUTPUT);
    pinMode(whiteled,OUTPUT);
}

void loop()
{
    if(Serial.available())
    {
        char cmd = Serial.read();
        switch(cmd)
        {
            case'r':
            digitalWrite(redled,HIGH);
            delay(2000);
            digitalWrite(redled,LOW);
            Serial.println("Cmd received");
            break;

            case'w':
            digitalWrite(whiteled,HIGH);
            delay(2000);
            digitalWrite(whiteled,LOW);
            Serial.println("Cmd received");
            break;
        }
    }   
}
Run Code Online (Sandbox Code Playgroud)

小智 2

问题是启动端口需要一些时间。在 ser = serial.Serial() 之后立即添加 5 秒的睡眠

time.sleep(5)
Run Code Online (Sandbox Code Playgroud)