Invio dati tramite seriale C++

di il
4 risposte

Invio dati tramite seriale C++

Salve a tutti

sto cercando di inviare dei dati via seriale, da un programma c++ ad un arduino, inizialmente avevo in mente di inviare un valore (ad esempio 50) in questo formato
A50A50Q
ma dopo aver visto quel che riceveva dall'altra parte ho pensato di semplificare la stringa a
50Q
Ma niente da fare ottengo valori che fanno paura
Pc :50Q 50Q 50Q 50Q ->Arduino: 50Q 50QQ 5QQQQ}?"½
insomma una sfilza di simboli deliranti... mi hanno consigliato di usare questo codice per il protocollo di trasmissione:
void Serialout(double v)    
{
   int fd; // File descriptor for the port 
   fd = open(PORT, O_RDWR | O_NOCTTY | O_NDELAY);
     if (fd == -1)
     {
       perror("open_port: Unable to open /dev/ttyUSB0 - ");
     }
    else
     {
      std::ostringstream oss;
      //oss <<"A"<< (int)v <<"A"<< (int)v << "Q";
      oss << (int)v << "Q";
      fcntl(fd, F_SETFL, 0);
      printf(" ho inviato %s ", oss.str().c_str() );
      //int  n = write(fd,&v,3);
      int n = write(fd,oss.str().c_str(),4);
      if (n < 0)
        fputs("write() of 9 bytes failed!\n", stderr);
     }
   struct termios options; // Get the current options for the port...   
   tcgetattr(fd, &options); // Set the baud rates to 19200...   
   cfsetispeed(&options, BAUDRATE);
   cfsetospeed(&options, BAUDRATE);  // Enable the receiver and set local mode...    
   options.c_cflag |= (CLOCAL | CREAD);  // Set the new options for the port...
   tcsetattr(fd, TCSANOW, &options);
   close(fd); 
 }
Sapreste consigliarmi un alternativa a
td::ostringstream oss;
oss << (int)v << "Q";
fcntl(fd, F_SETFL, 0);
int n = write(fd,oss.str().c_str(),4);
perché credo proprio che il problema sia qui...

4 Risposte

  • Re: Invio dati tramite seriale C++

    Prova a decrementare i baud a 9600
  • Re: Invio dati tramite seriale C++

    Nulla... gli ho detto di inviargli
    oss <<50 <<"Q";
    e riceve
    5
    50Q
    50Q0
    5
    [...]
    u050q
    u05050
    u050505
    u0505050
    u05050505
    [...]
    u05050505050505050505050550?
    u050505050505050505050505#085ç
    u050505050505050505050505É/\559
  • Re: Invio dati tramite seriale C++

    Non avendo i sorgenti della libreria che tu usi non saprei darti maggiori info,

    ma..
    fai queste prove..

    1) stacca la scheda dell arduino e spedisci i dati a un' altro pc dove hai lanciato un programma tipo ERCULES.. vedi cosa realmente stai mandando...

    2) Sempre con il pc con ERCULES, invia le stringhe al microcontrollore... e vedi che ti risponde...

    capirai subito dove sta il problema..

    Ciao -MARTINO-
  • Re: Invio dati tramite seriale C++

    Ho fatto altre prove con un programma scritto appositamente per l'invio ogni volta che premo enter, ed il risultato è perfetto, riceve quel che invio senza caratteri in surplus!
    Il problema rimane invece nel caso dell'invio consecutivo da parte del programma c++ che richiama quella funzione 30 volte al secondo = 33 ms, con un Baudrate a 19200. L'arduino legge ogni 50 ms il dato dalla seriale ma quel che succede è questo :
    (è nomale che stampi un carattere alla volta e poi vada a capo)

    Il programma invia SAAAQ sempre
    
    SA
    SAA
    SAAA
    SAAAQ
    SAAAQ
    SA
    SAA
    SAAA
    SAAAQ
    SAAAQ
    SA
    SAA
    SAAA
    SAAAQ
    SAAAQ
    SA
    SAA
    SAAA
    SAASQ
    SAASS
    SAASSS
    SAASSSS
    SAASSSSS
    SAASSSSSQ
    SA
    SSA
    SSSS
    SSSSS
    SSSSAS
    SSSSASS
    SSSSASSS
    SSSSASSSQ
    SSSSASSSSSSSS
    SSSSASSSSSSSSS
    SSSSASSSSSSSSSS
    SSSSASSSSSSSSSSS
    
Devi accedere o registrarti per scrivere nel forum
4 risposte