Pagina 1 di 1

Invio dati da PC a Arduino

MessaggioInviato: 6 apr 2023, 14:08
da wimatech
Buongiorno a tutti,
Sto cercando di mettere in moto un proiettore laser, per capirci quelli coi due galvanometri.
La parte PC è pronta in VB.net, carico il DXF trasformo tutti gli archi e i cerchi il polilinee e le metto in sequenza per creare il percorso più breve.
La parte arduino al momento già funziona ma vorrei ottimizzare le velocità e il ciclo.
Al momento da PC spedisco delle stringhe composte in questo modo:
Id;Laser;X;Y
dove:
Id è un intero = progressivo n° comando
Laser è un intero = 1/0 Comando accensione laser
X è un intero = Quota target X
Y è un intero = Quota target Y
Arduino esegue in sequenza una serie di "Serial.parseInt" per ricavare i valori, a questo punto faccio la classica interpolazione XY lineare.
Se mandassi i dati in formato byte evitando di spedire i dati in formato stringa e convertirli sarebbe più veloce? se si mi potete dare una dritta su come fare? io ci ho provato ma non arrivano correttamente ad Arduino.

Re: Invio dati da PC a Arduino

MessaggioInviato: 8 apr 2023, 20:16
da WALTERmwp
Ciao @wimatech,
wimatech ha scritto:(...) Se mandassi i dati in formato byte evitando di spedire i dati in formato stringa e convertirli sarebbe più veloce? se si mi potete dare una dritta su come fare? io ci ho provato ma non arrivano correttamente ad Arduino.
riporta la parte di codice di ricezione su Arduino(che hai scritto e non ti funziona).
Cosa significa che ad Arduino non arrivano correttamente?
Significa che quel che hai spedito da PC non arriva ad Arduino o tu non interpreti correttamente il messaggio che arriva?
Hai fatto una Serial.print() per verificare il contenuto del buffer?

Saluti

Re: Invio dati da PC a Arduino

MessaggioInviato: 8 apr 2023, 20:53
da wimatech
questo è il codice

Codice: Seleziona tutto
char DataX[4];
char DataY[4];
int i,X,Y;
char movimento;
String messaggio;
unsigned long Tempo;

void setup() {
  Serial.begin(115200);
}

void loop() {
  if(Serial.available() > 0) {
    movimento = Serial.read();
    DataX[0] = Serial.read();
    DataX[1] = Serial.read();
    DataX[2] = Serial.read();
    DataX[3] = Serial.read();
    DataY[0] = Serial.read();
    DataY[1] = Serial.read();
    DataY[2] = Serial.read();
    DataY[3] = Serial.read();
    Reply();
  }

}

void Reply(){
  //messaggio="Movement:";messaggio.concat(movimento);Serial.println(messaggio);
  //messaggio="Asse X:";messaggio.concat(X);Serial.println(messaggio);

  Serial.println(movimento);
  X=atoi(DataX);Serial.println(X);
  Y=atoi(DataY);Serial.println(Y);

}


Col Serial.println mi aspettavo di ricevere in formato stringa il valore convertito dai byte ma arrivano solo caratteri strani tipo / o ?

Re: Invio dati da PC a Arduino

MessaggioInviato: 9 apr 2023, 2:10
da WALTERmwp
Ti ho chiesto l'esito della Serial.println del buffer ma ho visto che l'hai fatta dopo la funzione atoi() che probabilmente non ti ha dato esito(presupponendo la corretta ricezione seriale) mancando il carattere null.

Il codice che hai scritto a me sembra carente di controlli, potresti provare con questo
Codice: Seleziona tutto
    const unsigned int MESSAGEQTY = 9;

    char DataReceive[MESSAGEQTY+1];
    char DataXY[5];
    int i,X,Y;
    char movimento;
    String messaggio;
    unsigned long Tempo;
    int expectedChar;

    void setup()
    {
      Serial.begin(115200);
    }

    void loop()
    {
      expectedChar=0;

      while(Serial.available() > 0)
      {
        DataReceive[expectedChar]=Serial.read();
        expectedChar++;
      }

      if(expectedChar==MESSAGEQTY)
      {
        Reply();
      }
      else
      {
        //error 1
        ErrorRx();
      }
    }

    void Reply()
    {
      //messaggio="Movement:";messaggio.concat(movimento);Serial.println(messaggio);
      //messaggio="Asse X:";messaggio.concat(X);Serial.println(messaggio);

      movimento=DataReceive[0];
      Serial.println(movimento);

      DataXY[0]=DataReceive[1];
      DataXY[1]=DataReceive[2];
      DataXY[2]=DataReceive[3];
      DataXY[3]=DataReceive[4];
      DataXY[4]='\0';
      X=atoi(DataXY);
      Serial.println(X);

      DataXY[0]=DataReceive[5];
      DataXY[1]=DataReceive[6];
      DataXY[2]=DataReceive[7];
      DataXY[3]=DataReceive[8];
      DataXY[4]='\0';
      Y=atoi(DataXY);
      Serial.println(Y);
    }

    void ErrorRx()
    {
      ;
    }

Comunque ti suggerisco di verificarlo con attenzione, potrei aver riportato a mia volta qualche errore.
In ogni caso andrebbe ottimizzato e irrobustito con l'interpretazione dei caratteri ricevuti ed un timeout di ricezione rispetto alla quantità attesa.

Saluti

Re: Invio dati da PC a Arduino

MessaggioInviato: 9 apr 2023, 11:11
da wimatech
Grazie mille Foto UtenteWALTERmwp appena possibile farò un test.

Re: Invio dati da PC a Arduino

MessaggioInviato: 9 apr 2023, 15:09
da WALTERmwp
Prego.
Prova, però verifica la quantità di caratteri(byte) effettivamente inviati da PC, in base al tuo codice parrebbero 9, nell'ordine e nella quantità che si deduce.
Se ad esempio completi l'ìinvio(da PC) coi caratteri CR e LF, allora ne devi considerare due in più e la costante
Codice: Seleziona tutto
const unsigned int MESSAGEQTY = 9;
andrebbe modificata da 9 a 11.
E' un particolare del quale potresti non essertene accorto utilizzando la Serial.parseInt().

Saluti

Re: Invio dati da PC a Arduino

MessaggioInviato: 9 apr 2023, 18:54
da standardoil
Sul forum di arduino.cc si trovano più casi simili, a svariati esempi al riguardo
consiglio allo OP di andare a cercare la, il suo problema è di semplice soluzione, e io stesso, quando frequentavo quel forum, ho lasciato esempi ben documentati