pySerial write() funktioniert in Python-interpreter, aber nicht Python-Skript

In letzter Zeit bin ich versucht zu machen, eine Art "Licht-Kontrolle" auf Arduino. Ich benutze Raspberry Pi zum senden der control-Nachricht über die serielle Schnittstelle (USB-Kabel).Hier ist der Arduino-code :

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);
    }

}

Danach habe ich verwendet, pySerial von Python-interpreter zur Steuerung der pins, und alles war in Ordnung arbeiten. Hier ist ein Stück der interpreter output:

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

Alles geklappt hat und geführt hat, ein-und ausschalten, also habe ich beschlossen, schreiben Sie ein einfaches Python-Skript, das gleiche zu tun:

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

Folgenden ist die Ausführung von Befehl und Ergebnis:

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

Es erschien nur der string von Arduino, aber die led nicht einschalten überhaupt.
Wie es aussieht, sollte alles in Ordnung sein, also ich weiß nicht, was das problem sein kann. Ich Suche schon einige Artikel, und fügen Sie " - Zeit.sleep(2)" vor "ser.schreiben()", aber es konnte immer noch nicht funktioniert.Ich würde schätzen jede Hilfe, vielen Dank im Voraus!

UPDATE :
Ich habe die controller senden mir die Daten, die Sie erhielt und wie es aussieht ist es nicht empfängt nichts, wenn ich bin, der das Skript ausführt, erhält dafür aber alles, wenn ich senden Sie die Daten vom interpreter. Der code der arduino-code sieht nun wie folgt aus:

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;
        }
    }   
}
  • Was ist der Rückgabewert von ser.write('w')? Sie könnten auch versuchen, die Spülung des port mit ser.flush() nach ser.write('w').
  • Wenn ich python-interpreter, es gibt 1 zurück, aber für python-script, wird es wieder nichts.
  • Wird es wieder nichts (ich.e Keine), oder er wird nicht mehr zurückkehren (es ist gesperrt auf dem schreiben)?
  • Und warum wird der string an den Arduino ("Hallo pi") ankommen, als "helello pi"?
  • und laufen von der CLI ist es anders: "hellhello"
  • es hat nicht mehr zurückkehren wird. Weil ich arduino halten drucken "Hallo pi", der string erschien, hängt von der Zeit, die ich geschnitten und es fangen.
  • Schließlich, ich hinzufügen, dass "Zeit.sleep(2") nach "ser.schreiben()", und es ist wirklich Arbeit!!! Da bemerkte ich, dass die led blinkte sehr schnell, nachdem das Skript ausgeführt werden soll. . Ich denke, ich sollte einige Male lassen raspi um den Befehl zu senden

InformationsquelleAutor Howard Chen | 2015-01-28
Schreibe einen Kommentar