Go Down

Topic: Arrays und Serial (Read 247 times) previous topic - next topic

JZ2000

Jan 12, 2018, 05:51 pm Last Edit: Jan 12, 2018, 05:57 pm by JZ2000
Hey Leute, ich habe aus einem anderen Forum Post, welchen ich leider nicht mehr finde, eine möglichkeit gefunden Seriell kommende Bytes in ein Arrays zu Speichern, sodass ich an einzelne Werte rankomme.
Leider klapt das nicht bei mir, Könnt ihr mir helfen?

Also ich habe ein Gerät, das wenn es den Befehl ("CR0"); bekommt ein ACK-80-CR in Ascii zurückgibt.
also bekomme ich 4 bytes mit jeweils 06 56 48 15 zurück.

Code: [Select]

if (Serial1.available ()>0)
{
   for (int i =0; i > 4; i ++)
   Arrays [i] = Serial1.read();

  }
  Byte2 = Arrays[1];
 
Serial.print (Byte2);

 if (ast2 == true){
  delay (1000);
  Serial1.print ("CR0\r");
 
 }
 if (ast5 == true){
  delay(1000);
  Serial.print (Byte2);
 }
}


Damit versuche ich an die Ascii 8 dez 56 heranzukommen aber ich bekomm nichts zurück...


Tommy56

Zeige uns bitte auch den Teil, in dem Du die Variablen deklariert hast oder den ganzen Sketch. Mit dem Fragment kann man nichts anfangen.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

JZ2000

alles klar aber es ist ein relativ Großes;

Code: [Select]

// Taster 1 Stromstoß Kanal 1/ EIN
boolean lst1=false; // ls = Laststate t1 = Taster 1
boolean ast1=false; // as = Activstate t1 = Taster 1
boolean tst1=false; // ts = Togglestate t1 = Taster 1
boolean BPS=false;  // BPS = Beamer Power Status

// Taster 4 Stromstoß Kanal 2 / EIN
boolean lst4=false; // ls = Laststate t4 = Taster 4
boolean ast4=false; // as = Activstate t4 = Taster 4
boolean tst4=false; // ts = Togglestate t4 = Taster 4

// Taster 3 Stromstoß Mute
boolean lst3=false; // ls = Laststate t3 = Taster 3
boolean ast3=false; // as = Activstate t3 = Taster 3
boolean tst3=false; // ts = Togglestate t3 = Taster 3

// Taster 2 Pylone Rauf
boolean ast2=false;

// Taster 5 Pylone Runter
boolean ast5 =false;

// taster 6 AUS
boolean ast6=false;

//Rückmeldung
int CMD=0;
boolean Standby =false;
boolean Ready=false;
boolean Starting=false;
boolean Shutting=false;
boolean SKW1=false;
boolean SKW2=false;

char Arrays [4]= {0,0,0,0};
char Byte1 = 0;
char Byte2 = 0;
char Byte3 = 0;
char Byte4 = 0;




void setup() {
pinMode (22,INPUT_PULLUP); // Taster 1 Kanal 1 & ein
pinMode (23,INPUT_PULLUP); // Taster 2 Pylone Rauf
pinMode (24,INPUT_PULLUP); // Taster 3 Mute
pinMode (25,INPUT_PULLUP); // Taster 4 Kanal 2 & ein
pinMode (26,INPUT_PULLUP); // Taster 5 Pylone Runter
pinMode (27,INPUT_PULLUP); // Taster 6 AUS
pinMode (32,OUTPUT); // LED Taster 1
pinMode (33,OUTPUT); // LED Taster 2
pinMode (34,OUTPUT); // LED Taster 3
pinMode (35,OUTPUT); // LED Taster 4
pinMode (36,OUTPUT); // LED Taster 5
pinMode (37,OUTPUT); // LED Taster 6
pinMode (38,OUTPUT); // Relais 1
pinMode (39,OUTPUT); // Relais 2
pinMode (39,OUTPUT); // Lüfter
digitalWrite (32,HIGH);
digitalWrite (33,HIGH);
digitalWrite (34,HIGH);
digitalWrite (35,HIGH);
digitalWrite (36,HIGH);
digitalWrite (37,HIGH);
digitalWrite (38,HIGH);
digitalWrite (39,HIGH);
Serial.begin(9600);
Serial1.begin(19200);



}

void loop() {
ast1 = digitalRead(22);
ast2 = digitalRead(23);
ast3 = digitalRead(24);
ast4 = digitalRead(25);
ast5 = digitalRead(26);
ast6 = digitalRead(27);


if (Serial1.available ()>0)
{
   for (int i =0; i > 4; i ++)
   Arrays [i] = Serial1.read();

  }
  Byte2 = Arrays[1];
 
Serial.print (Byte2);

 if (ast2 == false){
  delay (1000);
  Serial1.print ("CR0\r");
 
 }
 if (ast5 == false){
  delay(1000);
  Serial.print (Byte2);
 }
}

gregorss

#3
Jan 12, 2018, 06:08 pm Last Edit: Jan 12, 2018, 06:08 pm by gregorss
Code: [Select]

...   for (int i =0; i > 4; i ++)

Da springt mir sofort das größer-als-Zeichen ins Auge. Die Bedingung i > 4 ist vom Start weg nicht erfüllt. Wenn ich mich nicht irre, wird der Code für dieses for nie ausgeführt.

Kann sein, dass da noch anderes schräg ist. Danach habe ich aber erstmal gar nicht geguckt - Dein Code ist sehr lese-unfreundlich.

Gruß

Gre
Wenn man keine Probleme hat, kann man sich welche machen (Häuptling „Großes Lötauge" der M3-Hopi)

JZ2000

ok stimmt. habs geändert,, danke aber geht trozdem nicht...l meeh

Tommy56

Zusätzlich zu gregorss, wenn nichts da ist (seriell ist langsam), wartet Serial1.read() nicht, sondern liefert int -1 zurück.
Die for-Schleife ist dort ungünstig oder Du fragst auf Seriel1.available() >= 4 ab.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

JZ2000

nach den änderungen reagiert der Serielle monitor nichmehr. (Port 5 busy)
Code: [Select]

if (Serial1.available ()>=4)
{
   for (int i =0; i > 4; i ++)
   
   Arrays [i] = Serial1.read();

  }
  Byte2 = Arrays[1];
 

 if (ast2 == false){
  delay (1000);
  Serial1.print ("CR0\r");
 
 }
 if (ast5 == false){
  delay(1000);
  Serial.print (Byte2);
 }
}

Tommy56

Das klingt nach einer anderen Ursache.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

JZ2000

Zum vergleich ein anderes Programm mit dem es Funktioniert, nachdem ich das wieder drauf gemacht habe ging alles wieder.
Allerdings ist diese Lösung nicht gerade gut, gerade wenn sich zahlen überschneiden wie bei ascii 00
dez 48 48.....

Code: [Select]

// Taster 1 Stromstoß Kanal 1/ EIN
boolean lst1=false; // ls = Laststate t1 = Taster 1
boolean ast1=false; // as = Activstate t1 = Taster 1
boolean tst1=false; // ts = Togglestate t1 = Taster 1
boolean BPS=false;  // BPS = Beamer Power Status

// Taster 4 Stromstoß Kanal 2 / EIN
boolean lst4=false; // ls = Laststate t4 = Taster 4
boolean ast4=false; // as = Activstate t4 = Taster 4
boolean tst4=false; // ts = Togglestate t4 = Taster 4

// Taster 3 Stromstoß Mute
boolean lst3=false; // ls = Laststate t3 = Taster 3
boolean ast3=false; // as = Activstate t3 = Taster 3
boolean tst3=false; // ts = Togglestate t3 = Taster 3

// Taster 2 Pylone Rauf
boolean ast2=false;

// Taster 5 Pylone Runter
boolean ast5 =false;

// taster 6 AUS
boolean ast6=false;

//Rückmeldung
int CMD=0;
boolean Standby =false;
boolean Ready=false;
boolean Starting=false;
boolean Shutting=false;
boolean SKW1=false;
boolean SKW2=false;





void setup() {
pinMode (22,INPUT_PULLUP); // Taster 1 Kanal 1 & ein
pinMode (23,INPUT_PULLUP); // Taster 2 Pylone Rauf
pinMode (24,INPUT_PULLUP); // Taster 3 Mute
pinMode (25,INPUT_PULLUP); // Taster 4 Kanal 2 & ein
pinMode (26,INPUT_PULLUP); // Taster 5 Pylone Runter
pinMode (27,INPUT_PULLUP); // Taster 6 AUS
pinMode (32,OUTPUT); // LED Taster 1
pinMode (33,OUTPUT); // LED Taster 2
pinMode (34,OUTPUT); // LED Taster 3
pinMode (35,OUTPUT); // LED Taster 4
pinMode (36,OUTPUT); // LED Taster 5
pinMode (37,OUTPUT); // LED Taster 6
pinMode (38,OUTPUT); // Relais 1
pinMode (39,OUTPUT); // Relais 2
pinMode (39,OUTPUT); // Lüfter
digitalWrite (32,HIGH);
digitalWrite (33,HIGH);
digitalWrite (34,HIGH);
digitalWrite (35,HIGH);
digitalWrite (36,HIGH);
digitalWrite (37,HIGH);
digitalWrite (38,HIGH);
digitalWrite (39,HIGH);
Serial.begin(9600);
Serial1.begin(19200);



}

void loop() {
ast1 = digitalRead(22);
ast2 = digitalRead(23);
ast3 = digitalRead(24);
ast4 = digitalRead(25);
ast5 = digitalRead(26);
ast6 = digitalRead(27);

// Taster 2 Pylone Rauf
//--------------------------------------------------------------------------------------------------
if (ast2 == true) {       //inversive Logik wegen Pullup
  digitalWrite (33,HIGH);
  digitalWrite (38,HIGH);
  delay(50);
 
}
if (ast2 == false && ast5==true) {
  digitalWrite (33,LOW);
  digitalWrite (38,LOW);
  delay(50);
}

// Taster 5 Pylone Runter
//--------------------------------------------------------------------------------------------------
if (ast5 == true) {       //inversive Logik wegen Pullup
  delay(50);
  digitalWrite (36,HIGH);
  digitalWrite (39,HIGH);
 
}
if (ast5 == false && ast2==true) {
  digitalWrite (36,LOW);
  digitalWrite (39,LOW);
  delay(50);
}


// Taster 1 Kanal 1 & EIN
//-------------------------------------------------------------------------------------------------
if (ast1 == false && lst1 == false && tst3 == false){
  delay(50);         
tst1 =! tst1;                           
lst1 = true;
tst4 = false;
  Serial1.print("C00\r");
  delay(10);
  Serial1.print("C04\r");
  delay(100);
  digitalWrite(32,LOW);           
}
if (ast1==true){                                 
lst1=false;
}





// Taster 4 Kanal 2 EIN
//------------------------------------------------------------------------------------------------
if (ast4 == false && lst4 == false && tst3 == false){
  delay(50);         
tst4 =! tst4;                           
lst4 = true; 
tst1 = false;
  Serial1.print("C00\r");
  delay(10);
  Serial1.print("C05\r");
  delay(100);
 digitalWrite(35,LOW);                             
}
if (ast4==true){                                 
lst4=false;
}





// Taster 3 Mute
//-----------------------------------------------------------------------------------------------------
if (ast3 == false && lst3 == false){
  delay(50);         
tst3 =! tst3;                           
lst3 = true;                                         
}
if (ast3==true){                                 
lst3=false;
}


if (tst3 == true) {
  digitalWrite (34,LOW);
  Serial1.print ("C0D\r");
  SKW1=false;
}
if (tst3 == false && SKW1 == false) {
  digitalWrite (34,HIGH);
  Serial1.print ("C0E\r");
  SKW1=true;
}

// Taster 6 Aus
//--------------------------------------------------------------------------------------------------------
if ((ast6 == false)||(tst1 == false && lst1 == true) || (tst4==false && lst4 == true)) {
  tst1 = false;
  tst3 = false;
  tst4 = false;
   digitalWrite(37,LOW); 
Serial1.print("C02\r");
delay(200);
Serial1.print("C02\r");
delay(200);
Serial1.print ("C02\r");


}
//Anzeige Spielereien
//---------------------------------------------------------------------------------------------------------
if (Serial1.available () > 0){
  CMD = Serial1.read ();
  Serial.print (CMD);
}
if (CMD == 56){
Standby    = true;
Ready      = false;
Starting   = false;
Shutting   = false;

}
if (CMD ==48 && tst1==true || tst4==true){
Standby    = false;
Ready      = true;
Starting   = false;
Shutting   = false;

}
if (CMD==52){
Standby    = false;
Ready      = false;
Starting   = true;
Shutting   = false;

}
if (CMD==50){
Standby    = false;
Ready      = false;
Starting   = false;
Shutting   = true;

}

Serial1.print("CR0\r");

// Taster 1 anzeige

if ( tst1==true && Starting == true){
digitalWrite (32,LOW);
delay (500);
digitalWrite(32,HIGH);
delay (500);
}
if (tst1 == true && Ready == true){
digitalWrite (32,LOW);
}
if (tst1 == false){
digitalWrite (32,HIGH);


}
// Taster 2 anzeige

if ( tst4==true && Starting == true){
digitalWrite (35,LOW);
delay (500);
digitalWrite(35,HIGH);
delay (500);
}
if (tst4 == true && Ready == true){
digitalWrite (35,LOW);
}
if (tst4 == false){
digitalWrite (35,HIGH);

}
// Taster 6 Aus
if (Standby == true){
  digitalWrite(37,LOW);
}
if (Shutting == true){
digitalWrite (37,LOW);
delay (500);
digitalWrite(37,HIGH);
delay (500);
}
if (Ready == true || Starting==true){
  digitalWrite(37,HIGH);
}
}


Tommy56

Was soll sich da überschneiden? Du solltest evtl. mal anfangen, Dich mit den Grundlagen zu beschäftigen.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

JZ2000

das habe ich natürlich,

überschneiden tut sich folgendes

anlage aus = ascii 80 dez 56 48
anlage an = ascii 00 dez 48 48

Fazit = anlage wird immer als an angezeigt da die 48 in beiden fällen vorkommt.
ich musste deswegen weitere bedingungen mit in die if klammer der num 48 packen

Tommy56

Das ist doch normal, dass manche Zeichen in mehreren antworten vorkommen können. Wenn es mehrere signifikante Zeichen gibt, muss man halt alle auswerten.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

JZ2000

naja ich dachte da obrige wäre eine elegantere Lösung aber so gehts auch.
Dank^^^

und Tommy, deine Hilfe ist immer sehr gut, also ein großes Lob an dich :)

agmue

Mit einer vergleichbaren Fragestellung habe ich mich in einem anderen Thema beschäftigt, könnte Dir das helfen?

Wenn Du 06 56 48 13 als Muster erkennst, müßte es doch eindeutig sein, oder?

CR == 13

Go Up