Forum: Mikrocontroller und Digitale Elektronik Arduino serielle Kommunikation


von Manuel Volk (Gast)


Lesenswert?

Hallo ich habe eine Frage bezüglich eines Programmes was ich grade 
schreibe. Es sollen vom PC Koordinaten übertragen in der weise das
für die x Position z.B. x100 steht und für die y Position y100
eingetragen ist.

Nun das Problem es funktioniert zwar aber auch wenn ich nun 200 eingebe
bewegen sich die Servos auch und ich kann den Fehler in meinem Programm 
nicht finden. Bin einfach egent wie Blind.

Programm:
1
#include <Servo.h>
2
int intFailedTries=0;
3
const int LEDport=13;
4
Servo myservo1;
5
Servo myservo2;
6
7
void setup()
8
{
9
  Serial.begin(9600);//Prepare serial port for use
10
  pinMode(LEDport, OUTPUT);
11
  myservo1.attach(9);
12
  myservo2.attach(8);
13
}
14
15
void loop(){
16
  int y=0, x=0;
17
18
  intFailedTries=0;
19
20
  //do nothing (except continue to check) until something has been sent.
21
  while (Serial.available()==0) {;
22
    };
23
24
  if((Serial.available()>0) && (Serial.read()==120)){
25
    while (((Serial.available()>0))|| (intFailedTries<1000)){
26
      x=FetchNextCharacterAndAddToAccumulator(x);
27
    };
28
  };
29
  
30
  /*if(Serial.available()>0  && Serial.read()==121){
31
    while (((Serial.available()>0))|| (intFailedTries<1000)){
32
      y=FetchNextCharacterAndAddToAccumulator(y);
33
    };
34
  };*/  
35
   
36
37
  myservo1.write(x);
38
  myservo2.write(y);
39
  analogWrite(LEDport, x);
40
  
41
42
}
43
44
int FetchNextCharacterAndAddToAccumulator(int intAccumulator){ 
45
  int intIncomingByte;
46
  intIncomingByte=intAsciiToBinary(Serial.read());
47
  if (intIncomingByte!=-1) {
48
    intAccumulator=(intAccumulator*10)+intIncomingByte;
49
  };
50
  intFailedTries++;
51
  return intAccumulator;
52
}
53
54
int intAsciiToBinary(int intIn){
55
  int intTmp=-1;
56
  if ((intIn>47) && (intIn<58)) {intTmp=intIn-48;};
57
  return intTmp;
58
}

von Manuel Volk (Gast)


Lesenswert?

Warum wird etwas geschrieben wenn garnicht in die Auswerteschleifen 
gegangen wird?

von Oliver (Gast)


Lesenswert?

"intFailedTries" gibt es zweimal, global und lokal.

Oliver

von Markus M. (mark_m)


Lesenswert?

Du verhinderst auch nirgendwo, dass der Wert 200 den Servo erreicht.

Fertige dir mal einen Programmablaufplan an. 
http://de.wikipedia.org/wiki/Ablaufplan

Grüsse

von Karl H. (kbuchegg)


Lesenswert?

Tu dir selbst einen Gefallen und lass solche "Spielereien"

  if((Serial.available()>0) && (Serial.read()==120)){

oder auch das hier

  if ((intIn>47) && (intIn<58)) {intTmp=intIn-48;};


Schreib es so, dass man die Dinge verstehen kann. Es gibt absolut keinen 
Grund, dass du selber den ASCII Code eines Zeichens anführen musst, noch 
dazu in der denkbar ungeeignetsten Art und Weise - als Dezimalzahl. Dein 
Compiler kennt die Codes für alle Zeichen, du brauchst nur die Zeichen 
hinzuschreiben.

  if((Serial.available()>0) && (Serial.read() == 'x' )){

so. Dann versteh man auch was der Sinn an dieser Stelle ist


  if ((intIn >= '0') && (intIn <= '9' )) { intTmp = intIn - '0'; };



Das ganze Ansatrz ist zum Scheitern verurteilt, weil du eine tödliche 
Annahme triffst: Nämlich die, dass du eine komplette Übertragung während 
eines einzigen Durchlaufs durch loop() abhandeln kannst. Das kann so 
sein, muss es aber nicht. Es ist besser (und auch einfacher) sich nicht 
auf diese Annahme zu verlassen und ganz einfach nach dem Event-Muster zu 
verfahren:

loop() wird betreten
ist ein Zeichen an der UART eingetroffen?
wenn ja, dann hänge es an die bisher empfangene Zeichenkette an
Ist dadurch die Zeichenkette im Sinne einer 'Message' vollständig?
Wenn ja, dann werte die Zeichenkette aus und setzt wieder alles in den 
Anfangszustand zurück.

So funktioniert das für Millionen anderer Programmierer und in Millionen 
anderer Programme. Ja, man kann das durchaus auch anders machen - aber 
es ist nicht sehr schlau, wenn man als Anfänger bewährte Konzepte über 
Bord wirft und sein eigenes Süppchen kocht.

von Karl H. (kbuchegg)


Lesenswert?

> für die x Position z.B. x100 steht und für die y Position
> y100 eingetragen ist.

Da fehlt noch eine Zutat: woher weißt du, dass eine Zahl zu Ende ist?
wodurch unterscheidet sich x10 von x100  ?
Am einfachsten ist es, hinten nach noch ein Zeichen zu senden, an dem 
der Empfänger erkennen kann: jetzt ist die Zahl vollständig. Zb ein ';', 
aber im Grunde geht jedes Zeichen solange es nicht mit irgendetwas 
anderem verwechselt werden kann (also kein x, y, eine Ziffer oder ein 
Vorzeichen).

Sieht der Empfänger
y48;
dann sagt ihm der ; dass er alle Zeichen hat. Die 48 sind vollständig 
und da kommt nicht noch eine Ziffer, weil der Sender 483 senden wollte.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.