Ich habe die Anweisungen auf dieser Website erfolgreich befolgt:
http://www.doctormonk.com/2012/04/raspberry-pi-and-arduino.html
und ich konnte die Kommunikation zwischen dem pi und meinem Arudino Mega genau so herstellen, wie es auf der Website angegeben ist.
Anstatt jedoch eine Ganzzahl zu senden, die angibt, wie oft die LED blinkt, möchte ich ASCII-Text wie folgt senden:
"5 METER VORWÄRTS BEWEGEN", "LINKS DREHEN", "10 METER VORWÄRTS BEWEGEN" vom Pi zum Arduino.
Ich habe folgenden Code geschrieben:
char inData[64];
char inChar=-1;
void setup(){
Serial.begin(9600);
Serial.begin("Waiting for Raspberry Pi to send a signal...\n");
}
void loop(){
byte numBytesAvailable= Serial.available();
// if there is something to read
if (numBytesAvailable > 0){
// store everything into "inData"
int i;
for (i=0;i<numBytesAvailable;i++){
inChar= Serial.read();
inData[i] = inChar;
}
inData[i] = '\0';
Serial.print("Arduino Received: ");
Serial.println(inData);
}
}
Ich habe den obigen Code erfolgreich auf meinem Arduino Mega 2560 geflasht.
Ich wechselte zu meinem Python-Terminal auf dem Raspberry Pi und tippte in der Konsole Folgendes ein:
import serial
ser = serial.Serial('/dev/ttyACM1',9600)
ser.write("MOVE")
Auf dem seriellen Monitor meines Arduino wird Folgendes angezeigt:
Arduino Received: M
Arduino Received: O
Arduino Received: V
Arduino Received: E
Aber was ich will ist:
Arduino Received: MOVE
Wie ändere ich den obigen Code, um alle Zeichen in den inData-Puffer zu bekommen?
Antworten:
Das Problem ist, dass der Arduino so schnell eine Schleife
if (numBytesAvailable > 0)
durchläuft , dass er die Zeile zwischen jedem Zeichen, das über die serielle Schnittstelle ankommt, mehrmals ausführt . Sobald ein Charakter eintrifft, greift er nach ihm, durchläuft eine Schleife von null auf eins und druckt einen einzelnen Charakter aus.Sie sollten nach jedem Befehl aus Ihrem Python-Programm ein Zeilenendezeichen ('\ n') senden. Lassen Sie dann Ihren Arduino-Code jedes empfangene Zeichen puffern und auf die Nachricht erst reagieren, wenn das Zeilenendezeichen empfangen wird.
Wenn Sie also Ihren Python-Code ändern, senden Sie ein Zeilenendezeichen wie folgt:
Dann kann Ihr Arduino-Code ungefähr so aussehen:
quelle
Ihr Python - Skript vier Bytes sendet,
M
,O
,V
, undE
. Woher soll der Arduino wissen, dass das eine einzelne Saite ist? Bedenken Sie, dass der Python-Code:ist völlig identisch mit
aus der Sicht des Arduino. Serielle Ports übertragen Zeichen, keine Zeichenfolgen.
In Ihrem Code ist der Arduino schnell (im Vergleich zur Baudrate von 9600), sodass bei jedem Aufruf
Serial.available()
nur eines dieser vier Zeichen angezeigt wird. Deshalb haben Sie die Ausgabe erhalten, die Sie gemacht haben.Was Sie tun müssen, ist eine Möglichkeit zu finden, Zeichenfolgen abzugrenzen, dh sie auf irgendeine Weise aus Python zu markieren, damit der Arduino die einzelnen Zeichen , die er empfängt, an Ihr übergeordnetes Konzept einer Zeichenfolge anhängen kann .
Die Verwendung von Zeilen ist unkompliziert: Senden Sie jede Zeichenfolge, die mit einem Zeilenumbruchzeichen (
'\n'
) abgeschlossen ist. Lesen Sie auf dem Arduino Zeichen und hängen Sie sie an Ihre Zeichenfolge an. Wenn Sie a sehen'\n'
, ist die Zeichenfolge beendet und Sie können sie drucken.quelle
Der obige Code funktioniert perfekt für meine Verbindung zwischen Pi und Arduino
quelle
Verwenden Sie
.readline
anstelle von.read
Ich hatte das gleiche Problem und das hat es sofort behoben. Hoffe das hat geholfen!
quelle
So habe ich es vom ersten Beispiel an gemacht:
quelle