seriale con protocollo 560 baud

Salve , è tanto che no scrivo ma spesso vi leggo.
Ho un problema , dovrei ricevere una trasmissione seriale ripetitiva 560bit secondo
avete qualche idea?
In pratica ho perso una schedina che mi visualizzava dei numeri , riceve dall'hardware 3 byte, uno di sincronismo e gli altri due i dati, riceve di dati BCD, li visualizza sul un display e poi li rinvia sulla seriale
come posso fare ?
Le seriali nonnino hanno questa velocità
grazie in anticipo

Ho dato una corretta alla domanda , e forse mi sono risposto da solo, leggendo qui nel forum pare che la velocità la posso decidere io ... farò qualche esperimento al laboratorio, ma se avete qualche idea sparate

Intanto chiarisci: Arduino UNO o cosa? Parli della seriale UART onboard o SoftwareSerial?
In linea di massima la Serial (quindi "fisica") la puoi impostare alla velocità che vuoi, il limite è in alto (1M baud, 115200 bps) non in basso. La SoftwareSerial invece credo che sia compatibile solamente con i "tagli standard" (300, 600, 1200, 2400, 4800, 9600, 14400, ecc.).

D'altronde non è complicato ad esempio con una Mega farti un programmillo di test che "legge" i dati in ingresso sulla Serial1 e spara sulla Serial i valori HEX letti, così verifichi che tutto sia corretto.

PS: più che "seriali nonnino" direi che se devono trasmettere pochi dati e magari farlo con la migliore affidabilità possibile rispetto ad interferenze, perché "spingere" a velocità che non servono? :wink:

Parlo di arduino uno, ma mosso usare qualsiasi altro modello, non ho problemi a cambiare il tutto.
Quindi con la seriale hardware leggo i dati(3byte) a 560 baud li memorizzo in tre variabili e li ritrasmetto su un altra seriale per poterli leggere alla velocità che voglio
Poi in mezzo ci faccio tutto il software che mi pare

mi ha corretto le seriali non hanno queste velocità con le seriali nonnino

alessanddrob:
mi ha corretto le seriali non hanno queste velocità con le seriali nonnino

Scusa, spiegati meglio che non ho capito una mazza. :slight_smile: Chi ti ha "corretto le seriali"? E quali seriali dici che "non hanno queste velocità": parli della seriale "fisica"? E parliamo della UNO quindi (per cui ricevi con la Serial) o stai provando con la Mega? E cosa non funziona, la ricezione a 560 baud o la trasmissione sull'altra seriale (quale? hardware? che velocità?)?

nonnino=non ha, il correttore mi scritto nonnino, non era per dire vecchie seriali .

Comunque una parte l'ho risolta, ricevo impostando 260 come velocità(non era 560 avevo info sbagliate),il protocollo 821 e funziona tutto.
Per facilitarmi la cosa ho usato un mega cosi ho parecchie seriali, ricevo a 260 e mi ritrasmetto a 1200 8N1
Adesso mi devo sincronizzare con il byte di sincronismo con valore F0 e poi ricevere gli altri due byte con il valore che devo visualizzare.
Ps ma è normale che ricevo i byte sempre invertiti di peso (non è la prima volta che mi capita)
PS sono invecchiato, quale è l'algoritmo più veloce per invertire nel byte lsb msb ?
Grazie comunque

alessanddrob:
Comunque una parte l'ho risolta, ricevo impostando 260 come velocità(non era 560 avevo info sbagliate),il protocollo 821 e funziona tutto.

Ah, ok!

Ps ma è normale che ricevo i byte sempre invertiti di peso (non è la prima volta che mi capita)

Che cosa intendi con "invertiti di peso"? Che i due byte sono invertiti rispetto a quanto ti aspettavi stando al protocollo?

PS sono invecchiato, quale è l'algoritmo più veloce per invertire nel byte lsb msb ?

In un byte msb e lsb sono i BIT, tu intendi quello (quindi ad esempio ricevi "11011001" ed invece è "10011011") o che, come invece penso, i due BYTE sono invertiti ossia nella sequenza dei byte ricevuti ricevi ad esempio prima il byte più significativo e poi quello meno significativo invece tu ti aspetti l'opposto. Ossia la codifica "Little Endian" o "Big Endian" (vedi Wikipedia). Dipende dal protocollo cosa prevede.

Es. per il valore 16 bit 0x1A06 se codificato Big Endian ricevi 0x06 e poi 0x1A, altrimenti in Little Endian ricevi prima 0x1A e poi 0x06.

Quindi o ci fai vedere le specifiche del protocollo ed il tuo codice, oppure devi seguire semplicemente la codifica e fare byte[0]*256 + byte[1] (Little Endian) oppure byte[1]*256 + byte[0] (Big Endian).

Eccomi e ancora grazie
Per adesso mi sincronizzo e leggo tutto.
Intendo che, per esempio il byte di sincronismo da manuale 0xf0 11110000, quando lo ricevo è 0x0f 00001111.
e fino qui non ho problemi , lo sincronizzo/intercetto con un byte 0x07
per adesso mezzo lavoro lo sto facendo e può andare bene anche una conversione lenta.

Mi sono accorto di una cosa ancora più complicata, almeno per me, trasmette 3byte alla volta, con una pausa di 50milis e un eventuale mia risposta deve avvenire entro quel tempo, altrimenti mi si accavalla la risposta, esiste un qualche interrupt che mi dice il tempo tra un byte e l'altro

alessanddrob:
Intendo che, per esempio il byte di sincronismo da manuale 0xf0 11110000, quando lo ricevo è 0x0f 00001111.

Una cosa di questo tipo quindi?

byte reverse(byte v)
{
  byte b=0;
  for(int k=7; k >=0 ;k--) {
    b = ((b << 1) & 0xFF);
    b |= ((v >> (7-k)) & 0x01);
  }
  return b;
}

Il clock della seriale hardware è generato a partire dal clock principale. Ciò significa che il clock effettivamente usato a volte si discosta un po' da quello che dovrebbe essere corretto.
Ad esempio se il clock è a 16MHz e vuoi andare a 115200 baud l'errore è circa il 2.1% (significa che non stai andando a 115200 ma un pelo più veloce) oppure -3.5% a seconda dei valori che scegli per i registri. Per gli altri baud l'errore è variabile. Se invece il clock fosse 14.7456MHz l'errore sarebbe 0 tra 2400 e 230.4k baud.
Dal datasheet ATMEGA328 tabella 20.7

@alessanddrob,
l'inversione è molto curiosa perché nella trasmissione seriale il primo bit ad essere trasmesso è l'LSB (Least Significant Bit).
E' una trasmissione ad 8bit? La parità, se c'è, com'è?