Arduino och läsa av tecken från serieporten
Postat: 4 mars 2014, 20:27:10
Jag är fortfarande nybörjare på Arduino men håller på att lära mig mer och mer.
Jag har nu problem med att läsa av information som jag skicka till Arduinon via serieport.
Koden fungerar, men om jag får in något annat tecken än de som jag behöver så fungerar det inte. Jag vet att jag i koden läser av ".startsWith" och det är här som det blir fel.
Jag har inte lyckats knäcka hur jag ska lösa detta.
Det som kommer in är 1 - många tecken och det finns vissa strängar som slutar med ett unikt tecken x04 eller "Enter". I andra fall är det bara 1, 2 eller 3 tecken långt utan speciellt avslutstecken.
Här nedan kommer koden som jag har just nu.
Finns det någon som kan hjälpa mig med en kod som kan fungera?
På något vis måste bufferten nollställas om det kommer in tecken som jag inte vill ha.
// Anropas mellan varje huvudloop
// Kolla av serieporten
void serialEvent() {
while (Serial.available()) {
// Hämta nästa tecken
char inChar = (char)Serial.read();
// Kolla och det är ett säkert avslutningstecken if ((inChar == '\x04') or (inChar == '\r')){
SerialInputString += inChar;
// Hoppa till "kolla vad den innehåller"
OnSerialString();
}
// Kolla om det är A, B, C and D som kommando -// fast bara om insträngen är tom.
//Det kommer inte fler tecken efter dessa
else if (SerialInputString == "") {
if ((inChar == 'A') || (inChar == 'B') || (inChar == 'C') || (inChar == 'D')) {
SerialInputString += inChar;
// Hoppa till "kolla vad den innehåller"
OnSerialString();
}
else {
// Annars lägg till tecknet för senare användning
SerialInputString += inChar;
}
}
// Annars lägg till tecknet i buffert för senare
// användning
else {
SerialInputString += inChar;
}
// Om buffert innehåller "PS" eller "GSI", inga fler
// tecken än dessa kommer
if ((SerialInputString == "PS") || (SerialInputString == "GSI")) {
// Hoppa till "kolla vad den innehåller"
OnSerialString();
}
}
}
// Här ligger all koll av vad som ligger i bufferten för seriedatat
void OnSerialString() {
// Bort med mellanslagen
SerialInputString.trim();
Kolla om bufferten startar med "SRV"
if (SerialInputString.startsWith("SRV") == true) {
// Kommando SRV - Set klocka vid uppstart av PC-program
// Hoppa till nästa rutinen
OnSerialSetTimeStart();
}
// Kommando GSI - Hämtar bla. versionsnumret i kretsen
else if (SerialInputString.startsWith("GSI") == true) {
// Command GSI - GetSystemInfo
// Hoppa till nästa rutinen
OnSerialGetSystemInfo();
}
// Kommando PS - Stoppa klocka vid nerstängning av pc-programmet
else if (SerialInputString.startsWith("PS") == true) {
// Hoppa till nästa rutinen
OnSerialStopClock();
}
// kolla de enstaka tecknen A-D
else if (SerialInputString.startsWith("A") == true) {
// Hoppa till nästa rutinen
SendTrigger('A');
}
else if (SerialInputString.startsWith("B") == true) {
// Hoppa till nästa rutinen
SendTrigger('B');
}
else if (SerialInputString.startsWith("C") == true) {
// Hoppa till nästa rutinen
SendTrigger('C');
}
else if (SerialInputString.startsWith("D") == true) {
// Hoppa till nästa rutinen
SendTrigger('D');
}
// Nollställ bufferten
SerialInputString = "";
}
Jag har nu problem med att läsa av information som jag skicka till Arduinon via serieport.
Koden fungerar, men om jag får in något annat tecken än de som jag behöver så fungerar det inte. Jag vet att jag i koden läser av ".startsWith" och det är här som det blir fel.
Jag har inte lyckats knäcka hur jag ska lösa detta.
Det som kommer in är 1 - många tecken och det finns vissa strängar som slutar med ett unikt tecken x04 eller "Enter". I andra fall är det bara 1, 2 eller 3 tecken långt utan speciellt avslutstecken.
Här nedan kommer koden som jag har just nu.
Finns det någon som kan hjälpa mig med en kod som kan fungera?
På något vis måste bufferten nollställas om det kommer in tecken som jag inte vill ha.
// Anropas mellan varje huvudloop
// Kolla av serieporten
void serialEvent() {
while (Serial.available()) {
// Hämta nästa tecken
char inChar = (char)Serial.read();
// Kolla och det är ett säkert avslutningstecken if ((inChar == '\x04') or (inChar == '\r')){
SerialInputString += inChar;
// Hoppa till "kolla vad den innehåller"
OnSerialString();
}
// Kolla om det är A, B, C and D som kommando -// fast bara om insträngen är tom.
//Det kommer inte fler tecken efter dessa
else if (SerialInputString == "") {
if ((inChar == 'A') || (inChar == 'B') || (inChar == 'C') || (inChar == 'D')) {
SerialInputString += inChar;
// Hoppa till "kolla vad den innehåller"
OnSerialString();
}
else {
// Annars lägg till tecknet för senare användning
SerialInputString += inChar;
}
}
// Annars lägg till tecknet i buffert för senare
// användning
else {
SerialInputString += inChar;
}
// Om buffert innehåller "PS" eller "GSI", inga fler
// tecken än dessa kommer
if ((SerialInputString == "PS") || (SerialInputString == "GSI")) {
// Hoppa till "kolla vad den innehåller"
OnSerialString();
}
}
}
// Här ligger all koll av vad som ligger i bufferten för seriedatat
void OnSerialString() {
// Bort med mellanslagen
SerialInputString.trim();
Kolla om bufferten startar med "SRV"
if (SerialInputString.startsWith("SRV") == true) {
// Kommando SRV - Set klocka vid uppstart av PC-program
// Hoppa till nästa rutinen
OnSerialSetTimeStart();
}
// Kommando GSI - Hämtar bla. versionsnumret i kretsen
else if (SerialInputString.startsWith("GSI") == true) {
// Command GSI - GetSystemInfo
// Hoppa till nästa rutinen
OnSerialGetSystemInfo();
}
// Kommando PS - Stoppa klocka vid nerstängning av pc-programmet
else if (SerialInputString.startsWith("PS") == true) {
// Hoppa till nästa rutinen
OnSerialStopClock();
}
// kolla de enstaka tecknen A-D
else if (SerialInputString.startsWith("A") == true) {
// Hoppa till nästa rutinen
SendTrigger('A');
}
else if (SerialInputString.startsWith("B") == true) {
// Hoppa till nästa rutinen
SendTrigger('B');
}
else if (SerialInputString.startsWith("C") == true) {
// Hoppa till nästa rutinen
SendTrigger('C');
}
else if (SerialInputString.startsWith("D") == true) {
// Hoppa till nästa rutinen
SendTrigger('D');
}
// Nollställ bufferten
SerialInputString = "";
}