Arduino serielle Kommunikation

Gast #3049288
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
}
#3050260
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.
#3050264
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren