Go Down

Topic: cosa viene trasmesso esattamente ? (Read 1 time) previous topic - next topic

gingardu

Oct 13, 2012, 06:31 pm Last Edit: Oct 13, 2012, 06:33 pm by gingardu Reason: 1
tra due arduini collegati tramite seriale  cosa viene effettivamente trasmesso  nella seriale del ricevente,   indipendentemente da come poi è strutturato lo sketct sul ricevente,

cosa viene trasmesso prima di tutto nei 2 casi



arduino trasmittente

long x;


x =  12345;

Serial.print (x);

Seriaa.write (x)
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

flz47655

viene trasmesso un byte alla volta con un bit di start e uno di stop

http://en.wikipedia.org/wiki/Universal_asynchronous_receiver/transmitter#Character_framing

Ciao

leo72

Nel primo caso il numero viene trasmesso trasformato in una sequenza di char, ossia byte il cui valore indica il codice ASCII della cifra in trasmissione.

Nel secondo viene spedito il numero scomposto nei byte che lo compongono.

flz47655

Quando non si trasmette la linea si dice che è in idle e vale 1, il bit di start è uno 0 e quello di stop un 1


Con l'oscilloscopio vedi questi valori
Ciao

gingardu


Nel primo caso il numero viene trasmesso trasformato in una sequenza di char, ossia byte il cui valore indica il codice ASCII della cifra in trasmissione.

Nel secondo viene spedito il numero scomposto nei byte che lo compongono.


quindi nel primo caso vengono trasmessi   49 50 51 52 53

e nel secondo  invece non riesco a comprendere bene  valori esadecimali?
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

astrobeed


Nel secondo viene spedito il numero scomposto nei byte che lo compongono.


La serial.write trasmette un solo byte, se gli passi un long ne fa il casting a unsigned char e invia questo unico byte risultante.

gingardu

#6
Oct 13, 2012, 07:09 pm Last Edit: Oct 13, 2012, 07:35 pm by gingardu Reason: 1
quindi   in questo caso viene "corrotto"  il dato perche è impossibile ricostruirlo nel ricevente ?   :~
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

astrobeed


quindi   in questo caso viene "corrotto" 


Non viene corrotto nulla, semplicemente la Serial.Write è pensata per inviare un singolo byte in formato binario, va da se che un long, ma anche un int, non puo è essere passato direttamente alla Serial.Write, se lo fai viene eseguito il casting a unsigned char, prima va scomposto nei byte che lo compongono e poi si inviano questi singolarmente.

gingardu

ok  adesso e piu chiaro, in tutti e due i casi viene trasmesso il comtenuto della variabile x
solo che vengono adoperate "codifiche"  differenti, 
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

astrobeed


ok  adesso e piu chiaro, in tutti e due i casi viene trasmesso il comtenuto della variabile x
solo che vengono adoperate "codifiche"  differenti, 


Non è proprio così, nel primo caso x viene convertito in stringa ASCII e viene trasmessa questa, nel secondo caso vengono presi solo i primi otto bit di x (casting) e viene trasmesso un singolo byte composto da questi bit.

gingardu

#10
Oct 13, 2012, 10:17 pm Last Edit: Oct 13, 2012, 10:20 pm by gingardu Reason: 1

Quando non si trasmette la linea si dice che è in idle e vale 1, il bit di start è uno 0 e quello di stop un 1


Con l'oscilloscopio vedi questi valori
Ciao


ma Arduino nella seriale a i meno 12 volt ?

e a conclusione la seriale trasmette sempre e unicamente 8 bit in quel modo?
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

flz47655

Nell'immagine sono mostrati i livelli di una porta seriale (quelle vecchie dei pc), in Arduino gli 1 sono 5 volt e gli 0 o 0 volt
Puoi impostare anche bit di parità, doppio stop, etc..
Ciao

leo72



ok  adesso e piu chiaro, in tutti e due i casi viene trasmesso il comtenuto della variabile x
solo che vengono adoperate "codifiche"  differenti, 


Non è proprio così, nel primo caso x viene convertito in stringa ASCII e viene trasmessa questa, nel secondo caso vengono presi solo i primi otto bit di x (casting) e viene trasmesso un singolo byte composto da questi bit.

Nel reference, alla voce Serial.write si parla esplicitamente che il metodo è capace di spedire 1 singolo byte oppure una sequenza di byte, dipende da che tipo di dati gli passi. Se gli passi un int o un long (2 o 4 byte) verrà spedita la variabile scomposta nei singoli byte.

astrobeed


Nel reference, alla voce Serial.write si parla esplicitamente che il metodo è capace di spedire 1 singolo byte oppure una sequenza di byte, dipende da che tipo di dati gli passi. Se gli passi un int o un long (2 o 4 byte) verrà spedita la variabile scomposta nei singoli byte.


No, la serie di byte è solo se gli passi uno string o un array, in quest'ultimo caso puoi anche specificare quanti byte vanno trasmessi, se gli passi una variabile numerica maggiore di un (unsigned) char viene trasmesso un singolo byte ottenuto tramite il casting, cioè solo i primi otto bit, di questa.
Provare per credere  :D

leo72


No, la serie di byte è solo se gli passi uno string o un array, in quest'ultimo caso puoi anche specificare quanti byte vanno trasmessi, se gli passi una variabile numerica maggiore di un (unsigned) char viene trasmesso un singolo byte ottenuto tramite il casting, cioè solo i primi otto bit, di questa.
Provare per credere  :D


Mi fido (anche perché sono a lavoro e non potrei materialmente fare la prova  ;)).
Allora l'unico modo è passargli il numero scomposto in un array di unsigned char (byte) che poi il metodo write spedisce 1 ad 1 con la sintassi Serial.write(buf, len).

Go Up