Ciao a tutti!
Sto avendo un dubbio nel capire come mai, spostando una parte di codice da una posizione ad un'altra, succedono problemi nell'esecuzione del codice.
CIRCUITO:
Il sistema è realizzato con due Arduino Nano uno Master ed uno Slave.
Nel Master sono collegati dei pulsanti che comandano la 5v con resistenze di pulldown nei pin:
da 2 a 9 (8 pulsanti).
Nello Slave sono collegati dei leds con polo negativo in comune nei corrispettivi pin da 2 a 9 (8 leds).
Le due schedine comunicano via seriale (UART/USART).
PROTOCOLLO:
Il protocollo utilizza un sistema a codifica ASCII dove mando 4 bytes:
1.Byte = Indirizzo (contiene una matrice di caratteri da 0 a 9 da 'a' a 'z' e da 'A' a 'Z' - 62 caratteri)
2.Byte = CODE A (contiene una matrice di caratteri da 0 a 9 da 'a' a 'z' e da 'A' a 'Z' - 62 caratteri)
3.Byte = CODE B (contiene una matrice di caratteri da 0 a 9 da 'a' a 'z' e da 'A' a 'Z' - 62 caratteri)
Nel Master vengono utilizzati due caratteri: '1' se l'ingresso è a uno logico e '2' se l'ingresso e a zero logico.
4.Byte = Terminatore (il carattere di terminazione > '.' )
Il Master decodifica l'ingresso e lo manda via seriale:
1.Premo il pulsante 0 (collegato al pin 2) e in seriale viene inviato il messaggio: 001.
2.Rilascio il pulsante 0 e in seriale viene inviato il messaggio: 002.
1.Premo il pulsante 3 (collegato al pin 5) e in seriale viene inviato il messaggio: 031.
2.Rilascio il pulsante 3 e in seriale viene inviato il messaggio: 032.
Se ci sono più ingressi vengono codificati per creare messaggi anche con le lettere per esempio:
0a3. S4Z. 45J. ecc ecc
In totale posso inviare, facendo le combinazioni, 62*62 codici = 3844 variabili booleane con 2 bytes + un byte di valore e uno di terminazione.
Codice Master:
#define Num_In 8
#define Debug_Led 13
byte Pin_In[Num_In] = {2, 3, 4, 5, 6, 7, 8, 9};
bool Input[Num_In], Last_Input[Num_In];
char Char_Matrix[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};
#define Time_Cycle 500
int Counter_Cycle;
void setup() {
delay(10);
for (byte i = 0; i < Num_In; i++) {
pinMode(Pin_In[i], INPUT);
}
pinMode(Debug_Led, OUTPUT);
Serial.begin(115200);
delay(100);
}
void loop() {
delay(1);
Read_Inputs();
Serial_Process();
Cycle_Process();
}
void Cycle_Process(){
if(Counter_Cycle < Time_Cycle){
Counter_Cycle++;
}else{
digitalWrite(Debug_Led, !digitalRead(Debug_Led));
Counter_Cycle = 0;
}
}
void Read_Inputs() {
for (byte i = 0; i < Num_In; i++) {
Input[i] = digitalRead(Pin_In[i]);
}
}
void Serial_Process() {
for (byte i = 0; i < Num_In; i++) {
if (Input[i] != Last_Input[i]) {
if (Input[i] == 1) {
Serial_Message_ASCII(0, i, 1, '.');
} else {
Serial_Message_ASCII(0, i, 2, '.');
}
Last_Input[i] = Input[i];
}
}
}
void Serial_Message_ASCII(byte ADDRESS, byte CODE_A, byte CODE_B, byte TRM) {
Serial.write(Char_Matrix[ADDRESS]);
Serial.write(Char_Matrix[CODE_A]);
Serial.write(Char_Matrix[CODE_B]);
Serial.write(TRM);
}
Codice Slave:
#define Num_Out 8
#define Serial_Num_Out 64
#define Debug_Led 13
byte Pin_Out[Num_Out] = {2, 3, 4, 5, 6, 7, 8, 9};
bool Output[Num_Out], Serial_Out[Serial_Num_Out];
#define Char_Matrix_Size 62
char Char_Matrix[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};
#define Buffer_Size 8
byte Buffer[Buffer_Size];
byte Data_X, Data_Y;
#define Time_Cycle 500
int Counter_Cycle;
void setup() {
delay(10);
for (byte i = 0; i < Num_Out; i++) {
pinMode(Pin_Out[i], OUTPUT);
}
pinMode(Debug_Led, OUTPUT);
Serial.begin(115200);
delay(100);
}
void loop() {
delay(1);
Serial_Process();
Cycle_Process();
for (byte i = 0; i < Num_Out; i++) {
Output[i] = Serial_Out[i];
}
Write_Outputs();
}
void Cycle_Process() {
if (Counter_Cycle < Time_Cycle) {
Counter_Cycle++;
} else {
digitalWrite(Debug_Led, !digitalRead(Debug_Led));
Counter_Cycle = 0;
}
}
void Serial_Process() {
if (Serial.available() > 0) {
while (Serial.available() > 0) {
Serial.readBytesUntil('.', Buffer, Buffer_Size);
Serial_Decoder();
}
//Serial_Decoder();
}
//Serial_Decoder();
}
void Serial_Decoder() {
//ADDRESS
if (Buffer[0] == '0') {
for (byte i = 0; i < Char_Matrix_Size; i++) {
//CODE A
if (Buffer[1] == Char_Matrix[i]) {
if (Buffer[2] == '1') {
Serial_Out[i] = 1;
} else if (Buffer[2] == '2') {
Serial_Out[i] = 0;
}
}
}
}
}
void Write_Outputs() {
for (byte i = 0; i < Num_Out; i++) {
digitalWrite(Pin_Out[i], Output[i]);
}
}
Ora veniamo al dunque:
if (Serial.available() > 0) {
while (Serial.available() > 0) {
Serial.readBytesUntil('.', Buffer, Buffer_Size);
Serial_Decoder();
}
}
//Serial_Decoder();
Nella partizione di codice seguente il posizionamento della funzione Serial_Decoder() se posta all'interno del ciclo While funziona e vedo i led che si accedono e spengono quando premo i pulsanti collegati al Master.
Se invece la faccio eseguire all'esterno del codice che controlla se ci sono dati seriali tutto va in TILT !!! I leds si accendono e avvolte si bloccano sia in accensione o in spegnimento, non è reattiva la comunicazione come se si resetassero le variabili... e non riesco a capire il perchè ![]()
Codice della funzione Serial_Decoder() :
void Serial_Decoder() {
//ADDRESS
if (Buffer[0] == '0') {
for (byte i = 0; i < Char_Matrix_Size; i++) {
//CODE A
if (Buffer[1] == Char_Matrix[i]) {
if (Buffer[2] == '1') {
Serial_Out[i] = 1;
} else if (Buffer[2] == '2') {
Serial_Out[i] = 0;
}
}
}
}
}
Grazie a tutti dell'aiuto in anticipo !!!! ![]()