Go Down

Topic: Board reagiert nicht immer auf incoming data (Read 580 times) previous topic - next topic

lengi

Guten Tag zusammen,

ich bastel gerade an meiner Kommunikation zwischen meinem Board und C#.

Grundlegend funktioniert das ganze auch.
Ich schicke über ein C# Programm mittels eines Button(also kurzer Klick) einen String.
Es sind 2 Buttons vorhanden, mit einem kann ich "255,255,255/n" senden, mit dem anderen "150,150,150/n".
Hiermit will ich nur testen, ob ich eben mehrere Werte zuweisen kann und das eben in kurzer Zeit.
Prinzipiell tut das gar nichts zur Sache, jedoch habe ich das Problem, dass die Daten zwar am Board ankommen(Rx leuchtet kurz auf), das Board reagiert jedoch nicht immer darauf.
Ich glaube, dass es daran liegt, dass ich eben genau an dem Punkt vor der Abfrage in meinem Arduino Programm sein muss, wenn ich die Daten sende. Es ist also ein Glücksspiel, ob der einkommende String vom Board bemerkt wird.

Um zu sehen, ob die Daten ankommen sende ich den String wieder zurück und weise das ganze in C# wieder Textfeldern zu. Funktioniert auch soweit, jedoch sendet er eben nur, wenn er auch mitbekommt, dass Daten eingehen.

Wie kann ich jetzt umsetzen, dass das Board wirklich bei allen einkommenden Daten(also kurzer klick des Buttons) auch wirklich darauf reagiert? Wen ich nämlich gerade an einer anderen Position in der Loop bin und den Button betätige, tut sich nichts! Ich muss also ganz oft drücken, um irgendwann den passenden Moment zu erwischen.

Der Code sieht folgendermaßen aus:


Code: [Select]

int red;
int green;
int blue;
int first =0;

void setup() {
  Serial.begin(9600);
}

void loop(){
  if (first ==0) {
   while (Serial.available() <= 0) {
    Serial.println("0,0,0");   
    delay(500);
  }
}
     
while (Serial.available() > 0)
{
    first=1;
    int red = Serial.parseInt();
    int green = Serial.parseInt();
    int blue = Serial.parseInt();
   
     if (Serial.read() == '\n') {
      Serial.print(red);
      Serial.print(",");
      Serial.print(green);
      Serial.print(",");
      Serial.println(blue);
     
    }
  }
}



Eisebaer

hi,

nimm das delay raus und probier's.

gruß stefan

lengi

Das delay ist nur für den ersten Kontakt, speilt also keine Rolle.
Das dient dazu, dass ich nullen sende, bis ich von C# eine Verbindung aufbaue.
Wird also beim ersten Kontakt außer Kraft gesetzt.

jurs

#3
Aug 02, 2013, 03:49 pm Last Edit: Aug 02, 2013, 03:59 pm by jurs Reason: 1

Es sind 2 Buttons vorhanden, mit einem kann ich "255,255,255/n" senden, mit dem anderen "150,150,150/n".


Sendest Du nach den Zahlen echt einen Schrägstrich "/" und ein "n"?
Oder hast Du Dich etwas vertan und wolltest eigentlich ein Newline-Steuerzeichen ("\n") senden?


Wie kann ich jetzt umsetzen, dass das Board wirklich bei allen einkommenden Daten(also kurzer klick des Buttons) auch wirklich darauf reagiert?


Z.B.:

Code: [Select]

void setup(){
 Serial.begin(9600);
}

int getIntFromString (char *stringWithInt, byte num)
// input: pointer to a char array
// returns an integer number from the string (positive numbers only!)
// num=1, returns 1st number from the string
// num=2, returns 2nd number from the string, and so on
{
 char *tail;
 while (num>0)
 {
   num--;
   // skip non-digits
   while ((!isdigit (*stringWithInt))&&(*stringWithInt!=0)) stringWithInt++;
   tail=stringWithInt;
   // find digits
   while ((isdigit(*tail))&&(*tail!=0)) tail++;
   if (num>0) stringWithInt=tail; // new search string is the string after that number
 }  
 return(strtol(stringWithInt, &tail, 0));
}  

boolean serialReadRGB(byte &r, byte &g, byte &b)
{
 static char linebuf[21];
 static byte charcounter=0;
 if (Serial.available()>0)
 {
   if (charcounter==0) memset(linebuf,0,sizeof(linebuf)); // clear string
   char c=Serial.read();
   if (c>=32)
   {
     linebuf[charcounter]=c;
     if (charcounter<sizeof(linebuf)-1) charcounter++;
   }  
   if (c=='\n' || c=='/')
   {
      r=getIntFromString(linebuf,1);
      g=getIntFromString(linebuf,2);
      b=getIntFromString(linebuf,3);
      charcounter=0;
      return true;
   }
   else return false;
 }
 return false;
}

void loop()
{
 byte red, green, blue;  
 if (serialReadRGB(red,green,blue))
 {
   Serial.print(red);
    Serial.print(",");
   Serial.print(green);
    Serial.print(",");
   Serial.println(blue);
 }
}


Den Code habe ich vorsichtshalber mal so geschrieben, dass er sowohl funktioniert, wenn nach den Zahlen Schrägstrich-n ankommt als auch wenn da stattdessen ein Newline-Steuerzeichen kommt.

lengi

wow, super!
direkt mal reinkopiert und getestet, funktioniert einwandfrei!

soll natürlich ein newline sein, sonst hätte der code ja vorhin auch nicht funktioniert ;)

Jetzt muss ich mich in das ganze erstmal reindenken, dass ich das auch verstehe, was du da gemacht hast ;)


liebe Grüße
Jan

Go Up