pySerial write () отлично работает в интерпретаторе Python, но не в скрипте Python

В последнее время пытаюсь сделать своего рода «управление светом» на 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);
    }

}

После этого я использовал pySerial из интерпретатора Python для управления контактами, и все работало нормально. Вот часть вывода интерпретатора:

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()
>>>

Все работало нормально, светодиоды включались и выключались, поэтому я решил написать простой скрипт 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

Появилась только строка от Ардуино, а светодиод вообще не загорелся. Похоже, все должно быть в порядке, поэтому я не знаю, в чем может быть проблема. Я уже искал некоторые статьи и добавлял «time.sleep (2)» перед «ser.write ()», но он все равно не работал. Буду признателен за любую помощь, заранее большое спасибо!

ОБНОВЛЕНИЕ: я заставил контроллер отправлять мне данные, которые он получал, и похоже, что он ничего не получает, когда я запускаю скрипт, но получает все, когда я отправляю данные из интерпретатора. Код кода 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;
        }
    }   
}

person Howard Chen    schedule 28.01.2015    source источник
comment
Какое значение возвращает ser.write('w')? Вы также можете попробовать очистить порт с помощью ser.flush() после ser.write('w').   -  person mhawke    schedule 28.01.2015
comment
Если я использую интерпретатор python, он вернет 1, но для сценария python он ничего не вернул.   -  person Howard Chen    schedule 28.01.2015
comment
Он ничего не вернул (например, None) или не вернулся вообще (он заблокирован при записи)?   -  person mhawke    schedule 28.01.2015
comment
И почему строка, отправленная от Arduino (hello pi), приходит как helello pi?   -  person mhawke    schedule 28.01.2015
comment
@mhawke ... и при запуске из интерфейса командной строки все по-другому: hellhello   -  person Sylvain Leroux    schedule 28.01.2015
comment
@mkawke он вообще не вернулся. Поскольку я заставил arduino продолжать печатать hello pi, появившаяся строка зависит от времени, в которое я врезался и поймал ее.   -  person Howard Chen    schedule 28.01.2015
comment
Наконец, я добавляю time.sleep (2) после ser.write (), и это действительно работает !!! Потому что я заметил, что светодиод очень быстро мигает после выполнения сценария. . Думаю, мне стоит несколько раз позволить raspi отправить команду   -  person Howard Chen    schedule 28.01.2015


Ответы (1)


Проблема в том, что для инициации порта требуется некоторое время. добавить 5 секунд сна сразу после ser = serial.Serial ()

time.sleep(5)
person Justin Mathew    schedule 21.07.2016