Go Down

Topic: Problema seriale caratteri strani. (Read 352 times) previous topic - next topic

docdoc

#15
Nov 12, 2019, 01:46 pm Last Edit: Nov 12, 2019, 01:51 pm by docdoc
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...
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

fabpolli

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.

dukeluca86

#17
Nov 12, 2019, 02:45 pm Last Edit: Nov 12, 2019, 02:50 pm by dukeluca86
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.

fabpolli

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:
Code: [Select]

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.

dukeluca86

#19
Nov 12, 2019, 03:02 pm Last Edit: Nov 12, 2019, 03:11 pm by dukeluca86
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.

fabpolli

#20
Nov 12, 2019, 03:45 pm Last Edit: Nov 12, 2019, 04:42 pm by fabpolli
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

docdoc

#21
Nov 12, 2019, 04:37 pm Last Edit: Nov 12, 2019, 04:38 pm by docdoc
possono coesistere due utenze root loggate contemporaneamente ?
Pur non conoscendo RPi direi proprio che si possa fare, in fondo è sempre Linux...

Quote
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?
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

dukeluca86

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

dukeluca86

#23
Nov 15, 2019, 05:46 pm Last Edit: Nov 15, 2019, 05:48 pm by dukeluca86
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...

docdoc

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.. ;)
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

gpb01

#25
Nov 18, 2019, 12:01 pm Last Edit: Nov 18, 2019, 12:01 pm by gpb01
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 :)

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
Search is Your friend ... or I am Your enemy !

Go Up