【问题标题】:pySerial write() works fine in Python interpreter, but not Python scriptpySerial write() 在 Python 解释器中工作正常,但不是 Python 脚本
【发布时间】:2015-01-28 12:24:50
【问题描述】:

最近,我正在尝试在 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);
    }

}

之后,我使用 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()
>>>

一切正常,led 确实打开和关闭,所以我决定编写一个简单的 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()

以下是执行命令及结果:

pi@raspberrypi ~ $ python serialtest.py
x =  helello pi

它只出现了来自Arduino的字符串,但根本没有打开led。 看起来一切都应该没问题,所以我不知道问题出在哪里。我已经搜索了一些文章并在“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;
        }
    }   
}

【问题讨论】:

  • ser.write('w') 的返回值是多少?您也可以尝试在ser.write('w') 之后使用ser.flush() 刷新端口。
  • 如果我使用python解释器,它将返回1,但对于python脚本,它什么也不返回。
  • 它什么也没返回(即None),或者它根本没有返回(它在写入时被阻塞)?
  • 为什么从 Arduino(“hello pi”)发送的字符串以“hello pi”的形式到达?
  • 最后,我在"ser.write()"后面加上"time.sleep(2"),果然有效!!!因为我注意到执行脚本后 LED 快速闪烁。 .我想我应该花一些时间让 raspi 发送命令

标签: python serial-port arduino raspberry-pi pyserial


【解决方案1】:

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

time.sleep(5)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-10
    • 2017-08-13
    • 2018-09-30
    • 1970-01-01
    • 2021-05-09
    • 2020-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多