2009-10-24 14 views
9

Alles in Ordnung, also ich bin positiv mein Arduino Schaltung ist richtig und der Code dafür. Ich weiß das, weil, wenn ich den seriellen Monitor verwende, der in die Arduino IDE eingebaut ist und 'H' sendet, eine LED aufleuchtet, wenn ich 'L' sse, dass LED ausschaltet.Pyserial Problem mit Arduino - arbeitet mit der Python-Shell, aber nicht in einem Programm

Jetzt habe ich ein Python-Programm

import serial 
ser = serial.Serial("COM4",9600) 
ser.write("H") 

Wenn ich den Code die LED blinkt eine Sekunde lang laufen dann wieder losgeht. Wenn ich jedoch jede dieser Zeilen separat in der Shell mache, funktioniert es genau so, wie es soll.

Irgendwelche Ideen?

+0

könnte es damit zusammenhängen, dass das Serial-Objekt Müll gesammelt wurde? – Autoplectic

Antwort

5

Ich hatte das gleiche Problem und es funktioniert, wenn ich eine Verzögerung von etwa 2 Sekunden vom Öffnen der seriellen Verbindung hinzufügen, um darauf zu schreiben, 1 Sekunde war nicht genug.

+0

Eine Verzögerung von 2 Sekunden vor dem Schreiben löste dieses Problem auch für mich. – Phil

8

Wenn Sie die serielle Schnittstelle öffnen, bewirkt dies, dass der Arduino zurückgesetzt wird. Da der Arduino einige Zeit braucht, um zu booten, gehen alle Eingaben an den bitbucket (oder wahrscheinlich an den Bootloader, der weiß was damit macht). Wenn Sie einen Schlaf einlegen, warten Sie auf den Arduino, damit Ihr Seriencode auftaucht. Deshalb funktioniert es interaktiv; Sie haben die 1,5 Sekunden gewartet, bis die Software hochfährt.

Ich habe bestätigt, dass das Öffnen der seriellen Schnittstelle meine Arduino Uno zurückgesetzt; Ich blitzte ein Programm auf, das die LED von der setup() Routine blinkt - das Anrufen open("/dev/ttyACM0") genügte, um den Reset auszulösen. Dies ist IMHO eine verwirrende und undokumentierte Falte in der seriellen Unterstützung.

+0

Siehe [Arduino Playground] (http://playground.arduino.cc/Main/DisablingAutoResetOnSerialConnection) für eine Erklärung. –

1

Nur um es ein bisschen klarer zu machen, werde ich den Code ändern, so dass jeder sehen kann, was hinzugefügt werden muss!

import serial 
import time 
ser = serial.Serial("COM4",9600) 
time.sleep(3) 
ser.write("H") 

Das Hinzufügen einer Schlafanweisung hilft, die Seriennummer ohne Probleme zu öffnen!

Verwandte Themen