Il sito per chi ama smanettare con Arduino, Raspberry Pi & Co.
Comunicazine Serial...
 

Comunicazine Seriale Arduino-PC  

   RSS

0

Ciao,

ho implementato una comunicazione seriale  tra Arduino Mega e un PC industrilae con Windows come SO.

Nel void ricezione() ci sono alcune righe di if dove faccio la scansione delle delle stringhe inviate dalla serale del PC, e filtro i vari indirizzi che ho battezzato.

Arduino, in alre zone di programma invia anch'esso informazioni seriali al PC.

Riporto sotto un immagine delle ultime righe del void ricezione():

if (indirizzo == "A23" && stringa.substring(4) == "0" ){ // Controllo Movimento Contemporaneo di tutti i pistoni Alza gruppo Pistoni

Alza_Pist = 1; }
if (indirizzo == "A23" && stringa.substring(4) == "1" ){ // Controllo Movimento Contemporaneo di tutti i pistoni Abbassa gruppo Pistoni

Abbassa_Pist = 1; }

// if (indirizzo == "B01" && stringa.substring(4) == "1"){ // Segnale di avvenuta ricezione da parte del computer del segnale di anomalia motori

// RicAnMot = 1; }
// if (indirizzo == "B01" && stringa.substring(4) == "2"){ // Segnale di avvenuta ricezione da parte del computer del segnale di fine anomalia motori

// RicFineAnMot = 1; }

}

se le inibitisco è tutto ok, se le faccio elaborare Arduino non invia più segnali seriali.

Come è possibile?

5 Answers
0

Ad una prima occhiata l'unica cosa che potrebbe essere strana è la mancanza di qualche parentesi nei test condizionali che potrebbe far valutare in maniera non corretta le espressioni volute e dare quindi risultati inaspettati.

Se non le inibisci c'è parte dello sketch che funziona? 

In questo caso allora probabilmente l'errore dovrebbe essere cercato all'interno di quello che viene eseguito se i test hanno successo.

Inviare degli ulteriori dati con scopo di debug e test sulla seriale credo sia un buon metodo per trovare la soluzione e vedere realmente cosa succede all'interno del flusso del tuo algoritmo, sopratutto per testare i valori topici nei momenti cruciali, oppure per vedere quando questi "impazziscono" e perdono di significato non facendo eseguire quello che volevi.

Un po' di debug insomma oppure ci serve il resto del codice credo.

Spero possa esserti di aiuto, ciao

Questo post è stato modificato 4 settimane fa 2 times da Alessandro
0

allego sotto il void che si occupa della ricezione seriale:

 

void ricezione() // subroutine di ricezione dati da seriale
{
if(index < 19) // One less than the size of the array
{
inChar = Serial.read(); // Read a character
inData[index] = inChar; // Store it
index++; // Increment where to write next
inData[index] = '\0'; // Null terminate the string
}
int inDataInt = atoi(inData);
stringa = String(inData);
String indirizzo = stringa.substring(0,3);

if (indirizzo == "A01"){ // Avvio Motore
val = 1;
}

if (indirizzo == "A02"){ // Direzione Marcia: 1 = avanti , 0 = indietro
DirA = stringa.substring(4,5).toInt();
if (DirA==0){
DirB = 1;
}
else {
DirB = 0;
}
}

if (indirizzo == "A03"){ // n° di Impulsi ovvero giri da effettuare
Nimp = stringa.substring(4,15).toInt();
}

if (indirizzo == "A04"){ // Velocità
F = stringa.substring(4,8).toInt();
}

if (indirizzo == "A05"){ // Accensione e spegnimento
Accensione = stringa.substring(4,8).toInt();
}

if (indirizzo == "A06"){ // Arresto Motore
Arr_Mot = 1;
}

if (indirizzo == "A07"){ // n° di Impulsi della posizione attuale inserita manualmente
Cont_Imp_Tot = stringa.substring(4,15).toInt();
}

if (indirizzo == "A10"){ // Pressione Pistone P1
Press_P1 = stringa.substring(4,15).toInt();
}

if (indirizzo == "A11"){ // Controllo Movimento Pistone P1
if (stringa.substring(4) == "0"){// Alza Pistone P1
Alza_P1 = 1;
}
if (stringa.substring(4) == "1"){ // Abbassa Pistone P1
Abbassa_P1 = 1; }
}

if (indirizzo == "A12"){ // Pressione Pistone P2
Press_P2 = stringa.substring(4,15).toInt();
}

if (indirizzo == "A13"){ // Controllo Movimento Pistone P2
if (stringa.substring(4) == "0"){ // Alza Pistone P2
Alza_P2 = 1; }
if (stringa.substring(4) == "1"){ // Abbassa Pistone P2
Abbassa_P2 = 1; }
}

if (indirizzo == "A14"){ // Pressione Pistone P3
Press_P3 = stringa.substring(4,15).toInt();
}

if (indirizzo == "A15"){ // Controllo Movimento Pistone P3
if (stringa.substring(4) == "0"){ // Alza Pistone P3
Alza_P3 = 1; }
if (stringa.substring(4) == "1"){ // Abbassa Pistone P3
Abbassa_P3 = 1; }
}

if (indirizzo == "A16"){ // Pressione Pistone P4
Press_P4 = stringa.substring(4,15).toInt();
}

if (indirizzo == "A17"){ // Controllo Movimento Pistone P4
if (stringa.substring(4) == "0"){ // Alza Pistone P4
Alza_P4 = 1; }
if (stringa.substring(4) == "1"){ // Abbassa Pistone P4
Abbassa_P4 = 1; }
}

if (indirizzo == "A18"){ // Pressione Pistone P5
Press_P5 = stringa.substring(4,15).toInt();
}

if (indirizzo == "A19" && stringa.substring(4) == "0"){ // Controllo Movimento Pistone P5 Alza Pistone P5
Alza_P5 = 1;
}

if (indirizzo == "A19" && stringa.substring(4) == "1"){ // Controllo Movimento Pistone P5 Abbassa Pistone P5
Abbassa_P5 = 1;
}

if (indirizzo == "A20" && stringa.substring(4) == "0"){ // Controllo Movimento Pistone P6 Alza Pistone P6
Alza_P6 = 1;
}

if (indirizzo == "A20" && stringa.substring(4) == "1"){ // Controllo Movimento Pistone P6 Abbassa Pistone P6
Abbassa_P6 = 1;
}

if (indirizzo == "A21" && stringa.substring(4) == "0"){ // Controllo Elettrovalvola EVA7 Disattiva EVA7
EVA7 = 0;
}

if (indirizzo == "A21" && stringa.substring(4) == "1"){ // Controllo Elettrovalvola EVA7 Attiva EVA7
EVA7 = 1;
}

if (indirizzo == "A22" && stringa.substring(4) == "0"){ // Controllo Movimento Gruppo Pistoni P1 e P5 Alza gruppo Pistoni
Alza_P1P5 = 1;
}

if (indirizzo == "A22" && (stringa.substring(4) == "1")){ // Controllo Movimento Gruppo Pistoni P1 e P5 Abbassa gruppo Pistoni
Abbassa_P1P5 = 1;
}

if (indirizzo == "A23" && stringa.substring(4) == "0" ){ // Controllo Movimento Contemporaneo di tutti i pistoni Alza gruppo Pistoni
Alza_Pist = 1;
}

if (indirizzo == "A23" && stringa.substring(4) == "1" ){ // Controllo Movimento Contemporaneo di tutti i pistoni Abbassa gruppo Pistoni
Abbassa_Pist = 1;
}

if (indirizzo == "A23" && stringa.substring(4) == "2"){ // Conferma ricezione del segnale di anomalia motore da parte del computer
RicAnMot = 1;
}

if (indirizzo == "A23" && stringa.substring(4) == "3" ){ // Conferma ricezione del segnale di fine anomalia motore da parte del computer
RicFineAnMot = 1;
}

}

comunque ho notato che se l'indirizzo è A23 va tutto bene, se metto A24 (o maggiore) Arduino non trasmette più segnali seriali. Come se si superasse un qualche limite di valore, ora sto usando l'UNO appena posso lo riprovero con il MEGA.

Grazie per la collaborazione

 

0

Sei vicino ai 30k come dimensioni dello sketch? Anche i 2k di ram potrebbe essere un limite. 

Ti mando un link dove al punto 9 ti danno un trucco per risparmiare ram (se questo puo' essere il tuo problema):

https://www.digikey.it/it/articles/techzone/2017/jan/10-things-to-know-before-starting-your-arduino-project

Serial.println(F("un testo a piacere"));

La macro F tra parentesi impedisce che il testo venga caricato in RAM all'avvio del programma. Quando necessario, la stringa viene letta direttamente dalla memoria flash.

0

oggi ho fatto girare il programma su Arduino Mega e non da alcun problema. Quindi penso sia un problema di demensioni della stringa da "A24" in su che uso come confronto, che nell'UNO non è supportata.

Grazie per le risposte

0

Sono contento che funzioni, ma crredo sia improbabile che la "dimensione" delle stringhe come la chiami tu sia il vero problema su cui ti sei imbattuto ... anche perchè la dimensione appunto è uguale alle altre stringhe...

Arduino mega ha 8k di RAM quindi ottimizzando il software probabilmente riuscivi a farlo girare anche su arduino Uno

Questo post è stato modificato 1 settimana fa da admin

Entra nel forum

Hai un nuovo progetto in mente ma hai dei dubbi su come realizzarlo? Vuoi condividere la tua conoscenza da maker con gli altri? Registrati nella nostra community e potrai chiedere fare la tua domanda o rispondere e condividere la tua conoscenza in internet.

  
Working

Please Login or Registrazione