Problema seriale caratteri strani.

Grazie intanto, posso anche abbassare alla fine.

Però è sorto un altro problema. Scrive male anche in TX, cioè sul raspy se do:

Cat /dev/ttyS0

Mi lista lo stream della seriale, e si vede che i caratteri a volte vengono scritti bene, altre volte troncati e altre ancora viene giù roba incomprensibile...

Cosa può essere ?

Ma le masse le hai messe in comune? Hai abbassato la velocità della SoftwareSerial?

Guglielmo

Le masse sono in comune certamente, e uso la seriale hardware. Non uso più la software.

In sostanza alla pressione di un pulsante scrivo al raspberry facendo il login e dicendogli di spegnersi. Ovviamente così funziona una volta su 10.

E poi ci saranno 10cm di filo mica metri.

Controlla che entrambe le seriali abbiano i parametri identici. Come test riduci la velocità fino a che non ottieni caratteri puliti.

Ok, ho abbassato la velocita a 9600 e va molto meglio. Strano però.

Ora ho messo un contatore che printa a partire da zero in sù.

In sostanza faccio

Serial.print (i);
Serial.print ("\r\n");
i++

E funziona però se dò cat sulla seriale dal raspy mi printa si i numeri incolonnandoli uno sotto laltro, però occasionalmente ne perde uno, diciamo uno ogni 20-30...

In più a volte i numeri sono attaccati uno sotto l'altro, a volte invece cè una riga di spazio.

E cosa ancora più strana, dopo un pò mi butta fuori dal cat e torna alla console, sul raspy intendo. Premetto che raggiungo il raspy tramite SSH. Ma se redireziono lo stream verso un file di log fa lo stesso, cioè dopo un pò smette di loggare.

Che può essere ?

La raspberry è un micro computer che gira un OS che ... ha i suoi tempi e le sue "latenze", Arduino è un microcontrollore, senza alcun OS che spara dati a raffica ...

Se vuoi fare una cosa veramente affidabile, anche ad alte velocità, devi mettere in piedi un piccolo "protocollo" che, per ogni invio, indichi ad Arduino che ha avuto buon fine e che può effettuare il prossimo.

Guglielmo

dukeluca86:
Le masse sono in comune certamente, e uso la seriale hardware. Non uso più la software.

In sostanza alla pressione di un pulsante scrivo al raspberry facendo il login e dicendogli di spegnersi. Ovviamente così funziona una volta su 10.

E poi ci saranno 10cm di filo mica metri.

Dipende in che "ambiente" stai lavorando, che disturbi elettromagnetici ci sono (alimentatori switching, inverter nei paraggi, ecc...)

Prova solo a togliere i 10 cm di filo e vedi di collegarli con un ponticello oppure, in qualche modo, con UN centimetro di filo.

Io ho provato solo una volta a testare la seriale hardware di un RasPy (ma era ancora una delle prime versioni) e non permetteva neppure il full duplex (semplice ricezione in loop di quanto trasmesso). Si perdevano un sacco di byte. Credo che il consiglio di ridurre drasticamente il flusso (che non vuol dire la velocità) sia fondamentale. Quindi NO trasmissione continua da Arduino, almeno intervallare ogni trasmissione con una pausa.

Hm... Non ho mai usato il RPi però in generale per una connessione seriale bisogna controllare i parametri esatti utilizzati/richiesti (oltre alla velocità da impostare identica, ricorda per dirne una che Arduino non ha alcun handshake né software -XON XOFF- né hardware), poi i cablaggi hardware, poi i livelli dei segnali (Arduino va a 5V ossia da 0 a 5V, sicuro che la seriale del RPi esca a 3.3V, e che siano asimmetrici ossia tra 0 e 3.3V e non da -3.3 a +3.3?). Inoltre verifica se RPi si aspetta un certo tipo di terminale, devi avere un tty "base" ossia niente codici di controllo o altro.

Se queste cose le hai già verificate, che a 9600 abbia problemi mi pare molto strano, e neanche i 10cm di filo dovrebbero influenzare i risultati.

Se usi la UART nativa e non più la SoftwareSerial, non puoi più vedere nulla per capire cosa "vede" Arduino, per cui torna alla SoftwareSerial (a 9600) e posta il nuovo listato, insieme a cosa ottieni dal serial monitor quando apri la porta e vediamo.

EDIT: domanda, ma hai necessità di collegarli proprio via seriale? Perché è anche possibile far parlare Arduino e RPi via USB ossia con la seriale "virtuale", vedi QUI...

Aggiungo la mia, sono più di 12 mesi ininterrotti che comunico da/a Arduino con un Raspberry via seriale, traslatore di livelli CD4050 e libreria PJON, baudrate 9600 mai un problema. Non ho dovuto impstare nulla di particolare sia sulla raspberry sia lato Arduino. Penso che il problema fondamentale sia quello sollevato da Guglielmo, ovvero serve un protocollo e non un flood continuo di caratteri per non aver problemi.

Ma proprio carattere pausa carattere, o pausa dopo una stringa ? Inotre l'enter come lo dò a fine riga ? Al momento uso \r e \n ma non sò se sia corretto.

Ps

Chiarisco una cosa, non sto usando la seriale come tty semplice ma proprio come console, sulla quale viene replicto il login.

Trasmetto solo. I dati li leggo dal raspy con cat.

Non serve la pausa dopo ogni carattere ma devi inviare/ricevere solo quando serve, inoltre il fine riga può andar bene come stai facendo tu ma è superfluo. Se nel tuo protocollo decidi di inviare i comandi che terminano sempre con un determinato carattere (Es #) puoi usare quello per determinare se hai finito di ricevere la trasmissione e risparmi un carattere, oppure puoi scegliere di intercettare solo \r o \n il protocollo è tuo e sta a te decidere come fare la fine trasmissione (Esiste anche il carattere EOT nella tabella ASCII se vuoi).
Il succo è che da Arduino e da Raspberry devi inviare solo quando serve, ad esempio se da Arduino devo inviare la temperatura rilevata da un sensore a Raspberry per infilarlo dentro un Db da Ardunino puoi fare una cosa del tipo:

if(vecchiaTemperatura!=nuovaTemperatura)
{
   Serial.write(0xAA); Carattere inizio trasmissione
   Serial.write(nuovaTemperatura);
   Serial.write(0xFF); //Il tuo terminatore
   vecchiaTemperatura=nuovaTemperatura;
}

e per similitudine anche su Raspberry prima di mandare qualcosa devi accertarti che sia strettamente necessario.
Chiaramente questo non è un vero e proprio protocollo in quanto non ho indicato verifica se sono avvenuti errori, check del comando, ecc. e neppure l'eventuale attesa di una risposta di comando ricevuto, però era per darti l'idea di come trattare la cosa.

Un altra cosa, io lo faccio loggare come root sulla seriale e lo stesso faccio tramite server ssh, possono coesistere due utenze root loggate contemporaneamente ? O potrebbe non loggarsi sulla seriale, che è l'ultima a provarci e io non ne saprei niente non avendo feedback ?

Abbiamo postato nello stesso minuto:

Raga, ve lo stò a dire da un pezzo, non è la seriale normale, nessun protocollo, è la ttyS0 che è una console.

Per capirci, è come se scrivessi con la tastiera al terminale, infatti cè pure la bash:

root@user:#

La prima voce che si presenta è:

login:

Alla quale io rispondo:

root\r\n

Che sarebbe root più invio.

ttys0 è la seriale hadware agganciata ai GPIO, è una console perché hai configurato così raspberry. Ma nessuno vieta di disabilitare la console e stabilire una comunicazione tra dispositivi e non tra un dispositivo e un'altro che si aspetta di parlare con un utente. Detto questo la configurazione standard di raspberry prevede il baud rate 115200 che tu hai già abbassato a 9600 se non ho capito male. A questo punto però non so indicare altre strade per risolvere i "caratteri strani" perché mi sono sempre connesso non come console ma come comunicazione seriale tra Arduino e un programma C in ascolto/invio su raspberry

dukeluca86:
possono coesistere due utenze root loggate contemporaneamente ?

Pur non conoscendo RPi direi proprio che si possa fare, in fondo è sempre Linux...

Raga, ve lo stò a dire da un pezzo, non è la seriale normale, nessun protocollo, è la ttyS0 che è una console.

Guarda che lo avevo capito (già dal copia/incolla che hai fatto dei caratteri "spuri" nel primo post), ma non significa nulla, la serial1 di RPi linka a ttyS0 (come ha detto anche fabpolli tra l'altro, ma tu queste cose dovresti saperle...), quindi si, è una seriale, e si, dipende da come è impostata la seriale e quale tipo di terminale si aspetta di trovare.

Come cercavo di dirti, se tu a una seriale ci colleghi un terminale "fisico" con la sua porta seriale, ha le sue impostazioni di velocità, parità, hanshake (nessuno/software/hardware), bit di stop, e se poi su Linux è inteso come terminale, nel tuo caso deve essere un tty semplice, niente ANSI ad esempio.

Ma queste cose già le avevo scritte, quindi per cortesia, se vuoi che provi ad aiutarti mi fai la prova che ti ho indicato?

E comunque hai visitato quel link che ti ho indicato?

Si appena ho un minuto la faccio, grazie mille comunque.

Ho risolto con un convertitore di livello decente, la resistenza introduceva una distorsione dei fronti d'onda nel segnale e sballava i timings. Risolto, grazie a tutti, alla fine è sempre un problema di tensioni.

Comunque ho adottato un approccio diverso, ho usato due pin, uno IN e uno OUT tra raspberry e arduino, ho fatto uno script bash su linux che mi gestisce avvio e spegnimento, facendo un polling sull'IN e segnalando sull'OUT quando ha raggiunto un certo punto nel caricamento dei moduli, in sostanza quando riesce a pingare il rooter, viceversa allo spegnimento quando ha stoppato i servizi e smontato sufficenti moduli da non causare piu danni se tolgo tensione, poi aspetto un timer di una 15na di secondi e tramite un relè tolgo tensione.

PS
Comunque una cosa, voi dite che non si riesce a mandare i dati piu di 9600... Ho usato un adattatore UART/USB con un cp1202 e raggiunge tranquillamente i 115200, in TX almeno, in RX non ho provato, ma devo solo inviare stringhe a fiume senza controllare niente quindi...

dukeluca86:
Comunque una cosa, voi dite che non si riesce a mandare i dati piu di 9600... Ho usato un adattatore UART/USB con un cp1202 e raggiunge tranquillamente i 115200

La UART fisica si, è la SoftwareSerial che ha limitazioni per quanto riguarda la velocità. Infatti ti si consigliava la SoftwareSerial a 9600 (teoricamente anche fino a 38400 funzionicchia, ma dato che dicevi di avere problemi meglio stare sul sicuro) più che altro per avere la seriale/USB libera per fare debug.

Comunque sia, meglio così se hai risolto con un decente adattamento dei livelli.. :wink:

dukeluca86:
Comunque una cosa, voi dite che non si riesce a mandare i dati piu di 9600... Ho usato un adattatore UART/USB con un cp1202 e raggiunge tranquillamente i 115200, in TX almeno, in RX non ho provato

Ecco, appunto, NON hai provato in RX ... in TX è piuttosto facile, è con l'RX che iniziano i problemi :slight_smile:

T'assicuro che qui di prove ne sono state fatte parecchie ... non solo con l'invio di qualche stringa, ma con prove su prove per vedere i limiti, quindi ... se ti dico che con la SoftwareSerial, se si vuole vera affidabilità, è meglio stare sui 9600, credici.

Guglielmo