2016-04-20 4 views
0

Ich versuche, ein Arduino mit Python zu kommunizieren. Ich konnte es mit dem serial Modul verbinden. Dies ist der Code:Kommunizieren Sie ein Arduino mit Python

import serial 

while True: 
    print "Opening port" 
    arduinoData = serial.Serial("com7", 9600) 
    print "The port is open" 

    while (arduinoData.inWaiting()==0): #I wait for data 
    print "There is no data" 

    print "Reading data" 
    arduinoString = arduinoData.readline() 
    print arduinoString 

Es scheint, dass hängt, wenn ich die Daten lesen möchten, in der Zeile, die arduinoString = arduino.readline() sagt.

Was könnte das Problem sein?

Antwort

1

Mit der while-Schleife innerhalb der While-Schleife können Sie stattdessen eine if else-Anweisung verwenden. Um die Daten zu lesen, können Sie auch die Lesefunktion mit arduinoData.inWaiting() als Parameter verwenden: arduinoData.read(arduinoData.inWaiting()). Ich hoffe, dass dieser Code wird Ihnen helfen:

arduinoData = serial.Serial("com7", 9600) 

while True: 

    if arduinoData.inWaiting() > 0: # check if there is data available 
     print "Reading data" 
     arduinoString = arduinoData.read(arduinoData.inWaiting()) '''read and decode data''' 
     print arduinoString 

    else: 
     print "There is no data" 
+0

Vielen Dank für Ihre Antwort. Ich bekomme diesen Fehler: 'AttributeError: 'Serial' Objekt hat kein Attribut 'ser''. Aber wenn ich 'ser' lösche, wird der Port nicht geöffnet. Mache ich etwas falsch? –

+0

Sorry, wenn diese Frage doof erscheint, aber haben Sie das serielle Modul zuerst importiert? – mekoda

+0

Ja, ich habe zuerst die serielle Schnittstelle importiert. Ich habe es nur in diesem Teil des Codes nicht gepostet. –

0

Okay, Sie AttributeError: 'Serial' object has no attribute 'ser' Fehlermeldung erhalten, weil in Wirklichkeit ser nicht im arduinoData-Objekt existiert. Es ist meine Schuld, weil ich an die Klasse gedacht habe, die ich in meinem Programm erstellt habe, das ser enthält, das nur das andere serielle Objekt ist. Um dies zu beheben, ersetzen Sie einfach arduinoData.ser durch arduinoData

Um hinzuzufügen, sollten Sie wahrscheinlich arduinoData außerhalb der While-Schleife deklarieren. Sie sollten dies tun, da jedes Mal, wenn Sie ein serielles Objekt erstellen, es Zeit braucht, sich mit dem Arduino zu verbinden. Zu diesem Zweck kann Ihr Programm die Daten möglicherweise nicht lesen.

Ich hoffe, diese Antwort wird Ihnen helfen.

1

Die Struktur Ihres Codes ist seltsam. Ich hatte ein ähnliches Problem, indem ich das Serial-Objekt in einer Funktion erstellte, ohne es global zu machen. Vielleicht sollten Sie diese Zeile außerhalb der Schleife setzen:

arduinoData = serial.Serial("com7", 9600)

Auch scheint Ihre Initialisierung ein bisschen Licht. Normalerweise verwende ich mehr Parameter, aber es hängt von deiner Hardware ab.

ser = serial.Serial( 
    port = 'com4', \ 
    baudrate = 19200, \ 
    parity=serial.PARITY_NONE, \ 
    stopbits=serial.STOPBITS_ONE, \ 
    bytesize = serial.EIGHTBITS, \ 
    timeout = 0.25) 

Eine Abhilfe für Ihre Readline-() Ausgabe coud die read() Funktion statt und prüfen, ob es Daten enthält, werden.

Hoffe, es wird helfen!

+0

Entschuldigung für die späte Antwort. Ja, du hast recht. Ich muss mehr Parameter für das Beste setzen. Danke für deine Antwort und Hilfe. –