cosa viene trasmesso esattamente ?

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

Ciao

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.

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

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.

quindi nel primo caso vengono trasmessi 49 50 51 52 53

e nel secondo invece non riesco a comprendere bene valori esadecimali?

leo72:
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.

quindi in questo caso viene "corrotto" il dato perche è impossibile ricostruirlo nel ricevente ? :~

gingardu:
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.

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

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,

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.

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

ma Arduino nella seriale a i meno 12 volt ?

e a conclusione la seriale trasmette sempre e unicamente 8 bit in quel modo?

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

astrobeed:

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,

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.

leo72:
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 :smiley:

astrobeed:
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 :smiley:

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).

leo72:
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).

Si, il numero lo scomponi facilmente, e rapidamente, tramite una union e invii direttamente l'array definito in questa.

Esempio di codice, viene inviato sia il valore in formato ASCII, seguito da un 0x0D e 0x0A per via dell'uso di println, e i quattro byte che lo compongono (è un long int), lsb è il primo ( = S_LOINT.byte_s[0] )

union SCOMP_LOINT	// union per scomporre un long int in byte
{
 long int MyLong;
 unsigned char byte_s[4];	
} S_LOINT;

// S_LOINT.byte_s[n] // array equivalente al long int
// S_LOINT.MyLong    // variabile long int

void setup()
{ 
  Serial.begin(9600); 
  S_LOINT.MyLong = 123456;
  Serial.println(S_LOINT.MyLong); 
  Serial.write(S_LOINT.byte_s,4);
} 

void loop()
{ 
 
}

astrobeed:

leo72:

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 :smiley:

long x;

x = 92345;

Serial.write (x)

allora in questo cAso il dato non puo essere trasmesso cosi direttamente con un byte solo non lo trasmetti giusto?

gingardu:
allora in questo cAso il dato non puo essere trasmesso cosi direttamente con un byte solo non lo trasmetti giusto?

Ma lo leggi quello che scrivo oppure no ?
Ti ho già spiegato tutto nei minimi dettagli, ti ho messo uno sketch di esempio per come fare a trasmettere i singoli byte di un long int, o altro tipo di variabile più grossa di un byte a tuo piacere, non ho tempo da perdere con chi non vuole leggere, o non vuole capire.

mi sa che la mia domanda era posta "male" ]:smiley:

ho dato per "scontato" che serial.write (x) desse sempre lo stesso risultato indipendentemente
se x=3 oppure x=9999999

astrobeed:

leo72:

Si, il numero lo scomponi facilmente, e rapidamente, tramite una union e invii direttamente l'array definito in questa.

Esempio di codice, viene inviato sia il valore in formato ASCII, seguito da un 0x0D e 0x0A per via dell'uso di println, e i quattro byte che lo compongono (è un long int), lsb è il primo ( = S_LOINT.byte_s[0] )

union SCOMP_LOINT	// union per scomporre un long int in byte

{
long int MyLong;
unsigned char byte_s[4];
} S_LOINT;

// S_LOINT.byte_s[n] // array equivalente al long int
// S_LOINT.MyLong    // variabile long int

void setup()
{
 Serial.begin(9600);
 S_LOINT.MyLong = 123456;
 Serial.println(S_LOINT.MyLong);
 Serial.write(S_LOINT.byte_s,4);
}

void loop()
{

}

ma questo codice vale anche per la parte ricevente ?,