Arduino Forum

International => Italiano => Generale => Topic started by: dukeluca86 on Nov 11, 2019, 03:55 pm

Title: Problema seriale caratteri strani.
Post by: dukeluca86 on Nov 11, 2019, 03:55 pm
Stò usando un arduino nano con la seriale software per ripetere i messaggi che riceve sulla seriale hardware e viceversa.

Il problema è che mentre quello che invio dalla seriale hardware tramite console viene trasmesso correttamente, quello che leggo invece è semileggibile ma contiene comunque errori.

Vi posto un listato qui sotto, dove lo collego alla seriale di un raspberry.

Cosa può essere ? Ho pensato al buffer troppo piccolo, ma si presenta pure con frasi molto corte.

Code: [Select]
Linux raspy4.19.42-v7+ #1219@SMP Tue May@14 21:20:58 BST 2019 a⸮ٝ⸮5

}⸮uy⸮⸮ae⸮⸮5⸮}⸮⸮⸮
 dbeop e,⸮!
dasuac⸮⸮a

b/ wB⸮9}a⸮⸮
rdpbw
SS⸮ is enabled@⸮⸮bab⸮q⸮⸮⸮⸮}⸮r}⸮ba:ej⸮⸮⸮⸮⸮}⸮yayy⸮
This is cill prtp t oroot@raspy:~#
root@raspy:~#
root@raspy:/# l
bin   dev  home  lost+found  mnt  proc run   server  srv  tmp   usb@⸮⸮⸮u
boc s   
root@raspy:/#
Title: Re: Problema seriale caratteri strani.
Post by: dukeluca86 on Nov 11, 2019, 04:09 pm
Questo è il codice usato

Code: [Select]

void loop() {

  if (Serial.available()) {
    soft_serial.print(char(Serial.read()));
  }

  if (soft_serial.available()) {
    Serial.print(char(soft_serial.read()));
  }

}
Title: Re: Problema seriale caratteri strani.
Post by: gpb01 on Nov 11, 2019, 04:10 pm
1. a che velocità fai lavorare la SoftwareSerial?

2. hai adattato i livelli? Arduino lavora a 5V, raspberry a 3.3V

Guglielmo
Title: Re: Problema seriale caratteri strani.
Post by: dukeluca86 on Nov 11, 2019, 04:18 pm
I livelli li ho adattati con un resistenza di 120ohm e uno zener a 3.3. da arduino a raspy, al contrario non li ho adattati ma il livello da 3v3 a 5 dovrebbe andare bene, perchè di solito le porte hanno il LOW da 0 a 0,8 e l'HIGH da 1,8 a 5... però devo controllare meglio sul datasheet dell 328p.

la velocità è la stessa sia per la hardware che per la software, impostata a 115200.
Title: Re: Problema seriale caratteri strani.
Post by: gpb01 on Nov 11, 2019, 04:23 pm
Scordatela quella velocità ... :D
... la SoftwareSerial, abbiamo dimostrato tempo fa qui sul forum, è affidabile fino a 9600 ... già a 38400 non va più bene.

Prova a 19200 o cala definitivamente a 9600.

Guglielmo
Title: Re: Problema seriale caratteri strani.
Post by: dukeluca86 on Nov 11, 2019, 05:03 pm
ok. Ho sistemato l'adattamento di livello, ma niente da fare, è migliorato un pò ma il problema persiste. Il fatto è che devo modificare i parametri dal raspberry e mi secca un pò perchè avevo altre cose che volevo gestire a 115200. va beh, in caso vedo se si può usare l'hardware serial dai pin 0 e 1.

Ma posono dare problemi se li uso anche per programmare il nano ? O devo scollegarli ogni volta ? No perchè l'RX è bufferizzato con due transistor e non dovrebbe dare rogne, mentre il TX ha solo una resistenza e uno zener, questo vuol dire che mentre lo programmo la roba arriva pure al raspy, spero non interferisca.

Niente, ho provato ma va per forza dissaldato.
Title: Re: Problema seriale caratteri strani.
Post by: gpb01 on Nov 11, 2019, 06:02 pm
Se devi per forza andare a quelle velocità, ti serve un qualche cosa con più di una seriale hardware ...
... o una scheda basata su ATmega1284P (es. QUESTA (https://www.futurashop.it/Pro-Midi-1284P-7300-PROMIDI1284P), con due seriali HW) o una Arduino MEGA con 4 seriali a bordo.

Guglielmo
Title: Re: Problema seriale caratteri strani.
Post by: dukeluca86 on Nov 11, 2019, 07:48 pm
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 ?
Title: Re: Problema seriale caratteri strani.
Post by: gpb01 on Nov 11, 2019, 08:05 pm
Ma le masse le hai messe in comune?  Hai abbassato la velocità della SoftwareSerial?

Guglielmo
Title: Re: Problema seriale caratteri strani.
Post by: dukeluca86 on Nov 11, 2019, 09:25 pm
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.
Title: Re: Problema seriale caratteri strani.
Post by: speedyant on Nov 11, 2019, 10:13 pm
Controlla che entrambe le seriali abbiano i parametri identici. Come test riduci la velocità fino a che non ottieni caratteri puliti.
Title: Re: Problema seriale caratteri strani.
Post by: dukeluca86 on Nov 12, 2019, 11:26 am
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 ?
Title: Re: Problema seriale caratteri strani.
Post by: gpb01 on Nov 12, 2019, 11:31 am
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
Title: Re: Problema seriale caratteri strani.
Post by: steve-cr on Nov 12, 2019, 12:05 pm
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.
Title: Re: Problema seriale caratteri strani.
Post by: Claudio_FF on Nov 12, 2019, 12:29 pm
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.
Title: Re: Problema seriale caratteri strani.
Post by: docdoc on Nov 12, 2019, 01:46 pm
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 (https://www.instructables.com/id/Raspberry-Pi-Arduino-Serial-Communication/)...
Title: Re: Problema seriale caratteri strani.
Post by: fabpolli on Nov 12, 2019, 01:57 pm
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.
Title: Re: Problema seriale caratteri strani.
Post by: dukeluca86 on Nov 12, 2019, 02:45 pm
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.
Title: Re: Problema seriale caratteri strani.
Post by: fabpolli on Nov 12, 2019, 02:56 pm
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.
Title: Re: Problema seriale caratteri strani.
Post by: dukeluca86 on Nov 12, 2019, 03:02 pm
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.
Title: Re: Problema seriale caratteri strani.
Post by: fabpolli on Nov 12, 2019, 03:45 pm
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
Title: Re: Problema seriale caratteri strani.
Post by: docdoc on Nov 12, 2019, 04:37 pm
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?
Title: Re: Problema seriale caratteri strani.
Post by: dukeluca86 on Nov 12, 2019, 09:46 pm
Si appena ho un minuto la faccio, grazie mille comunque.
Title: Re: Problema seriale caratteri strani.
Post by: dukeluca86 on Nov 15, 2019, 05:46 pm
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...
Title: Re: Problema seriale caratteri strani.
Post by: docdoc on Nov 18, 2019, 11:53 am
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.. ;)
Title: Re: Problema seriale caratteri strani.
Post by: gpb01 on Nov 18, 2019, 12:01 pm
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