Ich hätte da ein kleines Problem das vermutlich keines für einen „C“ kundigen ist.
Ein Programm sendet z.B. 1234,5,10 (wobei die Länge der Zahlen variabel ist.) seriell an den Arduino.
Nun soll 1234,5,10 mit Serial.read() so in ein Array (mit maximal 66 Elemente Array[66]) eingelesen werden das ich 3 Int Elemente in dem Array habe. Der Trenner soll das Komma sein.
Array[0] = 1234
Array[1] = 5
Array[2] = 10
Diese 3 Elemente werden dann einer Funktion übergeben
z.B. funktion(Array[0], Array[1], Array[2]);
Also:
String 1234,5,10 in Array einlesen wobei nach jedem Komma der Index um eine Stelle hochgezählt wird und somit 3 Elemente im Array[0..2] entstehen.
Die String Elemente in Int Werte umwandeln um diese der funktion(Array[0], Array[1], Array[2]); zu übergeben.
Ich habe keinen Schimmer wie ich das machen soll, bin noch totaler C Anfänger
bin für jeden Hinweis dankbar.
Gruß
vobie
Sollen die Werte in
Array[0] = 1234
Array[1] = 5
Array[2] = 10
schon Integer sein, oder noch Strings?
Am einfachsten und vermutlich am RAM-schonensten wäre es, die Werte schon beim Einlesen umzuwandeln
char buffer[10];
int data[3];
int bindex,dindex=0;
void setup() {
Serial.begin(9600);
}
void loop() {
while(Serial.available() >0) {
//aktuelles Zeichen einlesen
buffer[bindex] = Serial.read();
//Trenner oder Zeilenende gefunden
if(buffer[bindex] == ',' || buffer[bindex] == '\n') {
//Null-Terminierung
buffer[bindex] = 0;
//Umwandeln in eine Zahl
data[dindex] = atoi(buffer);
//Ausgabe der Daten (DEBUG)
Serial.print("data at index ");
Serial.print(dindex);
Serial.print(" = ");
Serial.println(data[dindex]);
//Datenindex rotieren
dindex = ++dindex % 3;
//Buffer Index zurücksetzen
bindex = 0;
} else {
bindex++;
}
}
}
Vermutlich weil das Zeilenende nicht korrekt erkannt wird.
Als Workaround müßte ein zusätzliches "," am Ende der 3 Zahlen erstmal helfen.
Der Code war aus der Hüfte geschossen, ohne das ich ihn testen konnte. Damit bin ich froh, das es überhaupt compiliert
also wenn ich den Serial Monitor auf Neue Zeile(NL) einstelle funktioniert das mit if(buffer[bindex] == ',' || buffer[bindex] == '\n'{ Wenn ich jetzt in der shell (Linux) echo "4660,1,17\n" > /dev/ttyUSB0 absetze funktioniert das auch
Nun aber habe ich ein neues Problem, meine testfunktion wird 3 mal ausgeführt,
immer wenn dem Array ein neues Element zugewiesen wird.
Eingabe: 4660,1,17
Ausgabe: 4660
0
0
4660
1
0
4660
1
17
Die Funktion darf aber nur einmal innerhalb einer Eingabe ausgeführt werden. Also Funktion erst ausführen wenn das Array die Werte 4660
1
17
komplett hat. Danach Array für die nächste Eingabe wieder auf 0 setzen.
char buffer[10];
int data[3];
int bindex,dindex=0;
void test(int wert0, int wert1, int wert2) {
Serial.println(wert0);
Serial.println(wert1);
Serial.println(wert2);
}
void setup() {
Serial.begin(9600);
}
void loop() {
while(Serial.available() >0) {
//aktuelles Zeichen einlesen
buffer[bindex] = Serial.read();
//Trenner oder Zeilenende gefunden
if(buffer[bindex] == ',' || buffer[bindex] == '\n') {
//Null-Terminierung
buffer[bindex] = 0;
//Umwandeln in eine Zahl
data[dindex] = atoi(buffer);
test(data[0], data[1], data[2]); // testfunktion
//Datenindex rotieren
dindex = ++dindex % 3;
//Buffer Index zurücksetzen
bindex = 0;
} else {
bindex++;
}
}
}
Wo muss die Funktion "test" hin, damit sie nur einmal ausgeführt wird ?
//Datenindex rotieren
dindex = ++dindex % 3;
//wenn index wieder auf 0 gesetzt wird, dann wurden 3 werte eingelesen
if(dindex==0) test(data[0], data[1], data[2]); // testfunktion
EDIT: da war eine Zeile aus den CODE-Tags gerutscht.