Seriale non pronta all'avvio

Ciao a tutti,

ho un problema con un programmino che sto eseguendo con Arduino Uno.
ho realizzato uno script che legge da seriale delle stringhe (es. 01,1), fa il parsing e in base a quanto letto attiva o disattiva dei relè di una shield relay arduino.
ho poi fatto un script in bash che scrive sulla seriale di arduino queste stringhe in maniera sequenziale e che vado a richiamare tramite cygwin o realterm.

funziona tutto ma ho un problema con la seriale all'avvio:
Se stacco l'USB di arduino e lo riconnetto, dal terminale quando vado a richiamare un script bash non attiva nessuna uscita di arduino. Solo se entro nell'IDE di arduino, apro il monitor seriale di arduino, lo chiudo e riprovo a dare il comando via cygwin allora tutto funziona.

void(* resetFunc) (void) = 0;

#include <string.h> // classe necessaria per subString

String letturaSeriale;
String pinSerial;
String statusPin;
int pinInt;
int pin[16]={2,3,4,5,6,7,8,9,10,11,12,13,A0,A1,A2,A3};
int statusPinInt;
int ch=16; // numero di relay - 2 
String reset_str="reset";



void setup()
{
    for (int i=0; i<ch; i++){
        pinMode(pin[i], OUTPUT);
        digitalWrite(pin[i], HIGH);
    } 
    Serial.setTimeout(100);
    Serial.begin(9600); 
    while (!Serial);
}

void loop() {
      if (Serial.available()){
          // lettura da seriale della stringa di dati passata da script
          letturaSeriale = Serial.readString(); 
          Serial.println(letturaSeriale); 
          if (letturaSeriale.indexOf(reset_str)!=-1){
                Serial.println(letturaSeriale);
                Serial.println("Riavvio in corso...");
                delay(50);
                resetFunc();
          }
          else{
                // lettura della sottostringa contenente il pin da manipolare
                pinSerial= letturaSeriale.substring(0,2); 
                // conversione del valore da Stringa a Int
                pinInt=pinSerial.toInt();
                Serial.println(pinInt);
                // lettura della sottostringa contenente lo stato del pin
                statusPin= letturaSeriale.substring(3,4); 
                // conversione del valore da Stringa a Int 
                statusPinInt=statusPin.toInt(); 
                // verifica dello stato della variabile "stato pin" e imposta pin
                      if (statusPinInt == 1){ 
                          digitalWrite(pin[pinInt], LOW);       //attivo basso
                          Serial.println("Command completed LED turned ON");   
                      }
                      if (statusPinInt == 0){ 
                          digitalWrite(pin[pinInt], HIGH);      //spento alto
                          Serial.println("Command completed LED turned OFF");   
                      }
                Serial.println(pin[pinInt]);  
          }
          
      }
}

Questo il codice che ho fatto. Ho provato anche con un reset iniziale ma nulla (effettivamente se la seriale non è pronta, probabilmente neanche lo riceve).
Se forzo all'avvio un reset tramite pulsante di reset lo stesso non funziona. devo per forza aprire il monitor seriale.

chi mi può dare un consiglio?

echo Avvio della prova per il dispositivo 
echo "200 201">$ARDUINO_PORT
echo reset>$ARDUINO_PORT
sleep $tSlow
#accensione dispositivo
echo 1: Accensione dispostivo
echo $pwr,$HIGH>$ARDUINO_PORT
sleep $tLong

questo uno spezzone dello script bash

Il codice lato Arduino mi sembra ok, e solitamente quando lo colleghi/resetti, la COMn viene associata.
Lato linux non posso aiutarti, mi spiace, ma io proverei ad usare un terminale seriale (ad es. CoolTerm) per verificare se effettivamente la COMn (una volta collegato Arduino) è utilizzabile, cioè se CoolTerm si collega.
Se si, e riesci ad inviare comandi (01,1), il problema sta nello script.

In definitiva vai per tentativi

Federico

Parli di cygwin, quindi sei con windows. Sia linux che windows enumerano i dispositivi plug-and-play ad ogni inserimento di un device. In sostanza la prima volta che connetti la COM sarà la 1 (esempio), la seconda volta (scollegando e ricollegando) potrebbe essere COM2, 3 ecc.

PS: non ho windows e non lo so usare.

Ciao.

Maurotec:
Parli di cygwin, quindi sei con con windows

Oops, mi sono fermato a script bash, ma la sostanza non cambia.

Federico

Maurotec:
Sia linux che windows enumerano i dispositivi plug-and-play ad ogni inserimento di un device. In sostanza la prima volta che connetti la COM sarà la 1 (esempio), la seconda volta (scollegando e ricollegando) potrebbe essere COM2, 3 ecc.

No, su Windows i miei Arduino sono sempre visti con la stessa COM, anche staccando e riattaccando.
Discorso diverso se ne collego due, ovviamente (il primo sarà ad esempio COM3 il secondo COM4) o due Arduino che usano chip USB-seriali differenti (quindi avendo driver differenti la mappatura può essere diversa).
Su Linux non so, però penso sia una discorso analogo.

Io credo che se apro un terminale seriale su una certa COM o tty virtuale, quando disconnetto Arduino questa porta virtuale sparisce dal sistema per cui il terminale risulterà disconnesso anche ricollegando Arduino (per cui dovresti comunque riaprire la porta).

Su Linux non so, però penso sia una discorso analogo.

Stesso comportamento, dipende dalla enumerazione.

Però lui da bash non configura la seriale sul PC, cosa che invece fa il serial monitor per cui se si assicura di avere sempre lo stesso device file (es ttyUSB0) da bash deve inizializzare la seriale del PC, ma ovviamente poi non può aprire il serial monitor perché il device file è già impegnato.

Ora io non mi ricordo cosa usavo per leggere e scrivere su ttyUSB0, forse screen o altro e ricordo che era possibile specifica il baudrate. A me funziona

echo a > /dev/ttyUSB0 57600

Io uso scriptcomunicator, che si può usare come terminale, ma si possono scrivere script nel linguaggio javascript (QScript) creando anche GUI.

Ciao.

Maurotec:
Però lui da bash non configura la seriale sul PC...

Avevo questo dubbio, ma ho evitato di dire sciocchezze non conoscendo lo scripting Bash :slight_smile:

... e come spesso accade, l'op chiede e poi si perde :frowning:

Federico