|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Dec 2000
Città: Trento
Messaggi: 5917
|
[C] conversione da byte ad intero e stampa
Sto programmando un PIC che fa alcune acquisizioni (campionamenti a 10 bit) e trasmette i dati sulla seriale, e fin qui tutto bene.
Adesso dovrei fare un programma lato pc che legga dalla seriale e mi scriva i dati in un file (o a schermo). I dati trasmessi dal pic sono fatti da 2 byte alla volta e sono di due tipi: il primo contiene: 2 bit per l'intestazione (per dirmi che tipo di dato sta arrivando), 4 bit che identificano il valore di un moltiplicatore (un multiplexer analogico... comunque non e' importante cosa sia al fine del programma), 2 bit di dato (i 2 bit meno significativi dell'acquisizione) e il secondo byte contiene gli altri 8 bit del dato. il secondo tipo di dato e' strutturato cosi: 2 bit per l'intestazione 6 bit di contatore e il secondo byte sono 8 bit di contatore (quindi i 6+8 bit sono un UNICO contatore a 14bit non 2 diversi!) ho gia adattato un programma per poter leggere da seriale e stampare a video, ma ovviamente in questa maniera, vengono stampati i caratteri ascii del byte... io vorrei avere a video qualcosa di un po piu' leggibile! esempio: al posto dei due bit di intestazione sapere se e' un dato o un contatore... e questo l'ho fatto. il problema e' per i bit successivi se arriva 0000 per il moltiplicatore, mi piacerebbe stampasse 0, se arriva 0110 mi piacerebbe stampasse 6, e la cosa si fa ancora piu' complicata per gli altri 10 bit di dato o per i 14 bit di contatore, che dovrei mettere assieme e poi stampare. La base che ho usato per programmare e' catty: http://sourceforge.net/projects/catty/ e se volete dare un occhio (e non mi prendete troppo in giro per le schifezze che ho scritto per ora il programma stampa i dati in binario (sempre meglio che il codice ASCII il tutto sotto linux. Domanda: quando leggo il dato dalla seriale lo metto in un char, se questo char lo casto ad un unsigned int, e stampo l'int potrebbe funzionare? Grazie e ciao! P.S. lo so che il discorso e' tutto incasinato P.P.S. le modifiche iniziano attorno alla riga 480 (nel processo figlio)
__________________
Linux User #272700 >+++++++++[<+++++++++>-]<+.++.>++++[<---->-]<++.+++++++. HOWTO: SSH Firewall e DMZ ɐɹdosoʇʇos oʇuǝs ıɯ |
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
#define BITFIELD(v,h,l) ((v) >> (l) & ((1 << (h)-(l)) - 1 | 1 << (h)-(l))) Dove 'v' è il valore, e 'h' e 'l' sono rispettivamente il bit alto e basso (compresi) del campo di bit.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Jul 2006
Città: Tristram
Messaggi: 517
|
Non c'ho capito nulla
Da cosa (1 byte, 2 bytes...) devi convertire e in cosa (un numero, una lettera) e cosa vuoi stampare a video? Prova a fare un esempio numerico magari. Se casti un char in un unsigned int hai il codice ASCII nell'unsigned int (tra l'altro il cast njon è neanche necessario)
__________________
Il sole è giallo |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
ti consiglio una struttura a bit:
per il primo tipo di dato Codice:
struct S1
{
unsigned int Intest : 2;
unsigned int ValMolt : 4;
unsigned int Dato1 : 2;
unsigned int Dato2 : 8;
};
Codice:
struct S2
{
unsigned int Intest : 2;
unsigned int Cont : 14;
};
Codice:
memcpy( &S1, &dato, sizeof(dato) ); Codice:
printf( "Intestazione: <%du>\n", S1.Intest );
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
#5 | |||||
|
Senior Member
Iscritto dal: Dec 2000
Città: Trento
Messaggi: 5917
|
Intanto vi ringrazio per le risposte e per la pazienza di aver letto il groviglio di messaggio!
Quote:
Quote:
Quote:
io lato seriale ricevo 2 byte, che possono essere formati in queste maniere: 11MMMMXX XXXXXXXX 00CCCCCC CCCCCCCC se ha 11 come intestazione, il byte contiene 4 bit che identificano il moltiplicatore M e gli altri 10 bit X (2bit che sono i meno significativi + 1byte) che contengono il dato campionato; se ha come intestazione 00, il resto dei dati contengono 16 bit di contatore C. Supponiamo che mi arrivi questo: 11010001 00000000 Vuol dire, visto che i primi 2 bit di intestazione sono 11, che e' un dato contenente moltiplicatore (0100 = 4) + valore (0000000001 = 1). Quello che vorrei stampato a video è: moltiplicatore = 4; dato = 1. Se il dato è del tipo: 00100000 00000000 ho solo un valore del contatore (10000000000000 = 32768) e quello che voglio a video è: contatore = 32768. Quote:
Quote:
__________________
Linux User #272700 >+++++++++[<+++++++++>-]<+.++.>++++[<---->-]<++.+++++++. HOWTO: SSH Firewall e DMZ ɐɹdosoʇʇos oʇuǝs ıɯ |
|||||
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Jul 2006
Città: Tristram
Messaggi: 517
|
Ah ecco, allora - nel caso riesci a tirare fuori solo i singoli bit e non li riesci a raggruppare, ad esempio in esadecimali - quello che ti serve è un convertitore binario->decimale; nel caso tu non abbia idea di come farlo, te ne illustro uno al volo:
Codice:
int esponente = 0;
int base = 2;
unsigned int numero_decimale = 0;
Parti dal bit meno significativo del numero binario
while (ci sono ancora bits)
{
numero_dec += (int)bit * (base^esponente);
Salta al bit successivo (da destra a sinistra del numero binario per intenderci);
esponente+=1;
}
oops volevo dire binario
__________________
Il sole è giallo |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Dec 2000
Città: Trento
Messaggi: 5917
|
alla fine ho risolto "banalmente" usando una sprintf
Codice:
sprintf (stampa, "%d", (unsigned int)moltiplicatore); lunghezza = strlen (stampa); write (oldstdout,stampa,lunghezza);
__________________
Linux User #272700 >+++++++++[<+++++++++>-]<+.++.>++++[<---->-]<++.+++++++. HOWTO: SSH Firewall e DMZ ɐɹdosoʇʇos oʇuǝs ıɯ |
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
shiftature di bit, strutture a bit, conversioni binarie ... e tu alla fine fai una sprintf
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Dec 2000
Città: Trento
Messaggi: 5917
|
Quote:
mi arrangio come posso!
__________________
Linux User #272700 >+++++++++[<+++++++++>-]<+.++.>++++[<---->-]<++.+++++++. HOWTO: SSH Firewall e DMZ ɐɹdosoʇʇos oʇuǝs ıɯ |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:11.











shiftature di bit, strutture a bit, conversioni binarie ... e tu alla fine fai una sprintf







