Mein Problem ist etwas umfangreicher und ich bin mir nicht sicher ob es wirklich an dem buffer des HC-05.
Meine Schaltung besteht aus einem Arduino/Genuino Micro, einem HC-05 Modul und 40 LEDs die als 4x10 Matrix angesteuert werden. Das HC-05 Modul ist an Serial1 (Pin TX (0), RX (0), geschwindigkeit 115200 baud) des Arduino angeschlossen.
Ich schicke per Android Java App byte weise Audiobuffer Daten zur Visualisierung von live aufgenommener Musik. Das funktioniert auch ohne probleme, wenn ich jedoch einen Befehl (signed byte -10 - -14) zu wechseln auf eine andere Anzeige (z.B. ne Herz) sende reagiert der Arduino nicht und die Bool Variable die angibt das eine Funktion aufgerufen wird wird nicht gändert.
Außerdem liest mein Arduino dauernt den zu letzt gesendeten Befehl vom HC-05, auch Serial1.flush() bewirkt nichts.
int reihe[] = {3,4,5,6}; //gnd LED-Matrix
int spalte[] = {7,8,9,10,A0,A1,A2,14,15,16}; //+5v
bool playHi, playHerz, playaudioviz, playEyes; //gibt an ob eine Funktion aktiv ist
int8_t input; // Befehl der ausgelesen wird, int8_t da Java nur mit signed bytes Arbeitet
void setup() {
//initaliesieren und HIGH setzten der GND Pins der LED-Matrix
for(int i = 0; i<4;i++){
pinMode(reihe[i], OUTPUT);
digitalWrite(reihe[i], HIGH);
}
//initaliesieren und LOW setzten der 5v Pins der LED-Matrix
for(int i = 0; i<10;i++){
pinMode(spalte[i], OUTPUT);
digitalWrite(spalte[i], LOW);
}
//selbst erklärend
Serial1.begin(115200);
Serial1.setTimeout(10);
Serial.begin(9600);
}
void loop() {
/*Auslesen des Befehls zur angabe des welche Funktion aktiviert werden soll (soll nur dann benutzt werden wenn die AudioVisualisierung nicht läuft) | wechsel zwischen den allen funktionen außer der Audiovisualisierung funktioniert */
if(playaudioviz==false && Serial1.available()>0){
input = Serial1.read();
Serial1.flush(); //soll den buffer löschen damit der Befehl nur einmal gelsen wird (die java funktion schickt sicher nur einmal)
if(input==-13){ playaudioviz=true;playHi=false;playHerz=false;playEyes=false;}
if(input==-10){ playHi=true;playHerz=false;playaudioviz=false;playEyes=false;}
if(input==-11){ playHerz=true;playHi=false;playaudioviz=false;playEyes=false;}
if(input==-12){ playEyes=true;playaudioviz=false;playHi=false;playHerz=false;}
}
//aktivieren der verschiedenen Funktionen
if(playHi){
Hi();
}else if(playHerz){
Herz();
}else if(playEyes){
Eyes();
}else if(playaudioviz){
audioVis();
}
// Test jeder einzelnen LED in der Matrix
//for(int i = 0; i<4; i++){
//for(int i2 = 0; i2 < 10;i2++){
//digitalWrite(spalte[i2], HIGH);
//digitalWrite(reihe[i], LOW);
//delay(1000);
//
//digitalWrite(spalte[i2], LOW);
//}
//digitalWrite(reihe[i], HIGH);
//}
}
//Die Audio Visualisierung funktioniert alleine problemlos
void audioVis(){
char buff2[10]; //char buffer da char signed byte entsprechen, je ein char pro LED Spalte
for(int i = 0;i<4;i++){ //4 durchgänge, bei jedem wird immer eine andere LED reihe bearbeitet (Multiplexing)
Serial1.readBytes(buff2, 10); //liest den buffer für die LEDs der 10 Spalten
Serial1.flush(); //soll den buffer leeren damit nur aktuelle Daten gelesen werden auch wenn der Arduino etwsa langsamer ist als das Handy und somit eventuell der buffer überläuft
signed char *buff = buff2; //um sicher zu gehen das char = signed char ist laut docu nicht notwendig aber sicher ist sicher
//76543210 Direktes Steuern der Ports da schneller als digitalWrite
PORTB = B00000000;
PORTD = B10010001;
PORTC = B01000000;
PORTE = B00000000;
PORTF = B00000000;
digitalWrite(reihe[i], LOW); // setzten LED reihe auf LOW die Leuchten soll
for(int i3 = 0; i3<10;i3++){
// Serial.print((int)buff[i3]); ausgeben der gelesenen Daten für jede LED
// Serial.print(" | ");
if(i3 == -13){
return playaudioviz = false; //soll die funktion verlassen und die variable zum aktivieren der funktion auf false setzten, Hier liegt warscheinlich das Problem
}
if(buff[i3]>10&&i==0){ //abfrage für jede spalte ob die lautsärke für schalten der LEDs erreicht ist
digitalWrite(spalte[i3], HIGH);
}else if(buff[i3]>50&&i==1){
digitalWrite(spalte[i3], HIGH);
}else if(buff[i3]>75&&i==2){
digitalWrite(spalte[i3], HIGH);
}else if(buff[i3]>120&&i==3){
digitalWrite(spalte[i3], HIGH);
}
}
// Serial.print("\n");
}
}
//methode zum anzeigen eines Herzes, bei dem problem bis jetzt unwichtig
void Herz(){
int i;
for(i = 0; i < 4; i++){
PORTB = B00000000;
PORTD = B10010001;
PORTC = B01000000;
PORTE = B00000000;
PORTF = B00000000;
digitalWrite(reihe[i], HIGH);
if(i == 0){
digitalWrite(spalte[5], LOW);
}else if(i == 1){
digitalWrite(spalte[4], LOW);
digitalWrite(spalte[5], LOW);
digitalWrite(spalte[6], LOW);
}else if(i == 2){
digitalWrite(spalte[3], LOW);
digitalWrite(spalte[4], LOW);
digitalWrite(spalte[5], LOW);
digitalWrite(spalte[6], LOW);
digitalWrite(spalte[7], LOW);
}else if(i == 3){
digitalWrite(spalte[4], LOW);
digitalWrite(spalte[6], LOW);
}
delay(1);
}
}
void Hi(){
int i;
for(i = 0; i < 4; i++){
PORTB = B00000000;
PORTD = B10010001;
PORTC = B01000000;
PORTE = B00000000;
PORTF = B00000000;
digitalWrite(reihe[i], LOW);
if(i == 0){
digitalWrite(spalte[1], LOW);
digitalWrite(spalte[4], LOW);
digitalWrite(spalte[6], LOW);
}else if(i == 1){
digitalWrite(spalte[1], LOW);
digitalWrite(spalte[2], LOW);
digitalWrite(spalte[3], LOW);
digitalWrite(spalte[4], LOW);
digitalWrite(spalte[6], LOW);
}else if(i == 2){
digitalWrite(spalte[1], LOW);
digitalWrite(spalte[4], LOW);
}else if(i == 3){
digitalWrite(spalte[1], LOW);
digitalWrite(spalte[4], LOW);
digitalWrite(spalte[6], LOW);
}
delay(1);
}
}
void Eyes(){
int i;
for(i = 0; i < 3; i++){
PORTB = B00000000;
PORTD = B10010001;
PORTC = B01000000;
PORTE = B00000000;
PORTF = B00000000;
digitalWrite(reihe[i], LOW);
if(i == 0){
digitalWrite(spalte[0], HIGH);
digitalWrite(spalte[4], HIGH);
digitalWrite(spalte[5], HIGH);
digitalWrite(spalte[9], HIGH);
}else if(i == 1){
digitalWrite(spalte[1], HIGH);
digitalWrite(spalte[3], HIGH);
digitalWrite(spalte[6], HIGH);
digitalWrite(spalte[8], HIGH);
}else if(i == 2){
digitalWrite(spalte[2], HIGH);
digitalWrite(spalte[7], HIGH);
}
delay(1);
}
}
Das ist mien erster eintrag hier im Forum und ich bedanke mich schonmal im voraus für eure Hilfe.