Come trasformo senza available questo codice

Buongiorno a tutti.
Sapreste indicarmi come modificare il codice qui sotto senza l'avalable della seriale ?
Uso softwareserial.

void read_serial()  // FUNCTION FOR READING THE SERIAL MESSAGE
{
   Serial.println ("SOL FOUND and reading");  // THE SOL (Start of Line) found notice.
   Serial.print("READ : !\n");  //Saying that it has read "!" on the serial port
   while (inByte!= '*') // As long as EOL not found, keep reading
   if (Serial.available() > 0) // if new data is available
        { inByte = Serial.read(); // Read new byte
           Serial.print("READ : "); // Display the new byte
           string[string_len] = inByte; // Save the data in a character array
           Serial.println(string[string_len]); // Print the characters that was recieved
           string_len++;}
    else if (Serial.available() == 0)
          {Serial.println("EOL not available, data string invalid"); // If EOL not in the string
          Serial.println("$N"); //FAIL SIGNATURE
           break;
           }

 if (inByte == '*')
  {
       Serial.println ("eol FOUND, and full string was");  // Echoes Success Message
       Serial.println ("$Y"); //SUCCESS SIGNATURE
       for (i=0;i<(string_len-1);i++) Serial.print(string[i]);
       Serial.print ("\n");
   }
 }

Grazie, Alberto

usa la newsoftserial e ti togli il pensiero no :wink:

Magari !!
Quella libreria von va con arduino MEGA ]:smiley:

 if (Serial.available() > 0) // if new data is available
        { inByte = Serial.read();

diventa

inByte = Serial.read();
if (inByte != -1) // if new data is available
        {

e

if (Serial.available() == 0)

diventa

inByte = Serial.read();
if (inByte == -1)

però considera che se non è vuoto il buffer della seriale rischi di perdi il dato inByte se non cambi il codice

Grazie lesto per la gentilezza :slight_smile:
Sono tre giorni che sto sclerando per creare un protocollino di trasmissione sulla seriale tra due arduino (uno è UNO e l'altro è MEGA)
l'ultimo codice che ho messo insieme con il vostro aiuto è questo:

#include <SoftwareSerial.h>

#define rxPin 6
#define txPin 7

char string[25];
int i=0;
int string_len;
int inByte;
int last_inByte;

SoftwareSerial mySerial =  SoftwareSerial(rxPin, txPin);

void setup()  {
  // define pin modes for tx, rx, led pins:
  pinMode(rxPin, INPUT);
  pinMode(txPin, OUTPUT);
  // set the data rate for the SoftwareSerial port
  mySerial.begin(9600);
  Serial.begin(9600);
}

void loop() {
  serial_send();  
  serial_read(); 
}

void serial_read(){
  inByte = mySerial.read();
  string_len = 0;
  if (inByte == -1) return;
  if (inByte == '!')
  {
    while (inByte != '*'){    
      inByte = mySerial.read();
      if (inByte != -1){
        string[string_len] = inByte;
        //Serial.print (string[string_len]);
        string_len++;
      }
      if (inByte == 0){
        Serial.println ("FAIL");   
        mySerial.print("!FAIL*");
      }
  
      if (inByte == '*'){
        Serial.println ("OK");   
        mySerial.print("!OK*");

        for (i=0;i<(string_len-1);i++) Serial.print(string[i]);
        Serial.print ("\n");
      }
    }
  }
}

 void serial_send(){
  mySerial.print("!CIAO*");
  delay (10);
 }

L'ho messo su entrambi gli arduino ma non funziona :frowning:
Se nel loop lascio send e read non succede nulla se tolgo rea sull'altro arduino vedo iquello che mando.
Non riesco a capire come fare per mettere in ascolto e in trasmissione. allo stesso modo.

Praticamente è un casino.
Come si crea un protocollo full duplex?

Sapete se c'è qualcosa di già fatto ?
Grazie, Alberto

mi spiace ma non puoi usando questa libreria:

*Serial.read() will wait until data arrives

ciò vuol dire che la chiamata è loccante, finchè non arriva qualche info resti bloccato

*Only data received while Serial.read() is being called will be received. Data received at other times will be lost, since the chip is not "listening".

ciò vuol dire che se non sei bloccato nella read() tutti i dati che arrivano li perdi... quindi devi fare una read() ogni 3x2, e comunque c'è il riscio perdita di dati
Insomma impossibile un full duplex

inutile dire che usando gli interrupt potresti costruirti una libreria decisamente migliore (infatti la newSoftSerial usa gli interrupt, e per questo probabilmente non è compatibile col mega)
puoi modificare newSoftSerial per il mega, ma ci vuole tempo ed è alquanto inutile.
Secondo me la soluzione veloce e funzionale è usare una delle 4 seriali sul mega e newSoftSerial sull'UNO, così non solo non hai problemi di perdita dei dati, ma avrai anche un protocollo full-duplex

Ok.
Grazie ancora lesto per la tua preziosa disponibilità.

Alberto

Per conoscenza.

La trasmissione seriale, da una delle tre porte, di Arduino MEGA ed Arduino UNO che usa NewSoftSerial:

NON E' COMPATIBILE :astonished:

Funziona solamente se invio dal Mega verso la UNO e non viceversa.

mi sembra alquanto strano. la comunicazione seriale è uno standard, certo ci sono varie implementazioni e settaggi, ma quelli che usa arduino e la newsoftserial sono le stesse, altrimenti newsoftserial non riuscirebbe a comunicare col PC(salvo preventivo settaggio del PC)

controlla bene i collegamenti (tx->rx, rx->tx), newsoftserial è sicuramente compatibile con UNO (stesso chip, atmega328), invece il mega usa la seriale "di default" che è identica in tutto e per tutto con quella che usa col PC

Funziona solamente se invio dal Mega verso la UNO e non viceversa

se funziona in una direzione funziona anche nell'altra. Posta il codice con cui hai fatto i test