Pages: [1]   Go Down
Author Topic: Board reagiert nicht immer auf incoming data  (Read 535 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 25
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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);
     
    }
  }
}

Logged

Wien
Online Online
Edison Member
*
Karma: 28
Posts: 1889
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

hi,

nimm das delay raus und probier's.

gruß stefan
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 25
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Germany S-H
Offline Offline
Faraday Member
**
Karma: 146
Posts: 3024
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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.
« Last Edit: August 02, 2013, 08:59:55 am by jurs » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 25
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-wink

Jetzt muss ich mich in das ganze erstmal reindenken, dass ich das auch verstehe, was du da gemacht hast smiley-wink


liebe Grüße
Jan
Logged

Pages: [1]   Go Up
Jump to: