Newsgroup: it.comp.programmare.win32
Titolo: Visual C++ 6 e lettura dati seriali.

Salve a tutti. E' la prima volta che scrivo (almeno riguardo al Visual C++,
che uso da circa una settimana...) e volevo chiedere delucidazioni, che ,
visto il mio molto scarso livello di conoscenza del C++, spero sia un
chiarimento sulle basi...
Sto cercando di sviluppare una semplice applicazione che dialoga con una
smartcard attraverso il mio programmatore SmartMouse. Dopo aver finalmente
capito come fare per richiedere l'ATR della card, mi trovo il problema di
leggerlo, visto che usando l'API ReadFile mi trovo il buffer che contiene i
dati letti in un formato a me sconosciuto. Vorrei avere una stringa di cui
effettuare il parsing, ma non saprei di che tipo devo immettere il buffer
nella chiamata ReadFile...
La porzione di codice su cui sto lavorando è questa, e la sequenza di bytes
dell'ATR (16 in tutto) mi sembra venga letta correttamente, ma non saprei
come trattare il buffer, visto che qualsiasi modifica mi provoca
un'eccezione...
Qualcuno saprebbe consigliarmi come definire il buffer inputData in modo che
poi possa effettuarne il parsing per trasformare l'ATR in una stringa?
Ringrazio per qualsiasi consiglio
A presto
Fulcro
{
 HANDLE hPort_;
 DCB MioDCB;
 LPSTR inputData;
 unsigned long length;
 long ret;
 hPort_ = CreateFile("COM1",    // Specify port device: default "COM1"
    GENERIC_READ | GENERIC_WRITE,        // Specify mode that open device.
    0,                                   // the devide isn't shared.
    NULL,                                // the object gets a default
security.
    OPEN_EXISTING,                       // Specify which action to take on
file.
    0,             // default.
    NULL);
    MioDCB.BaudRate = 9600;           // Specify buad rate of communicaiton.
 MioDCB.StopBits = 2;      // Specify stopbit of communication.
    MioDCB.Parity = 2;            // Specify parity of communication.
    MioDCB.ByteSize = 8;     // Specify  byte of size of communication.
 if (EscapeCommFunction(hPort_,CLRRTS)==0) //Richiesta di ATR
 {
  AfxMessageBox("Problema nell'ATR.");
 }
 Sleep(400);        // Attendo la risposta della card...
 ret=ReadFile(hPort_, &inputData,20,&length,NULL) == 0;
//a questo punto non so come trattare inputData che contiene il mio sudato
ATR....
}

 ret=ReadFile(hPort_, &inputData,20,&length,NULL) == 0;
Controlli il contenuto di ret?

 Controlli il contenuto di ret?
Lo controllo con il debug e assume valore 1, segno che la lettura viene
effettuata correttamente. Non lo controllo da codice, ma preferisco
raffinare la struttura una volta creato il "cuore" del programma.
Niente pretese, solo un programmino da usare come riferimento quando dovrň
ripassare le funzioni per qualcosa di piů serio...
... ma vorrei tanto arrivare ad un criterio di progettazione che ancora non
posso avere, visto uso il C++ (e ilVisualC++) da una sola settimana...
Il problema definitivo č questo: riempire un buffer con il flusso di dati
letto dalla seriale, e fare il parsing per avere una sequenza di numeri
esadecimali corrispondenti alle instruzioni scambiate tra card e PC, insomma
ricevere un ATR di 16 bytes, trasformarlo in sequenza "3B F7 11 00 01 14..."
ecc. e far lo stesso con le risposte della card ai miei comandi inviati come
stringa...
Grazie per i consigli, presente e futuri!

tipi char, CString e relativi puntamenti...
Per un'applicazione del genere ti consiglio il C puro, in questo
modo segui meglio gli esempi del MSDN e la spiegazione delle API.
Per prima cosa dovresti lavorare in modo asincrono, in modo da
poter leggere e scrivere contemporaneamente. Inoltre la lettura,
che sta in un thread a parte, dovrebbe sbattere i dati in un
buffer circolare.
Usa questo codice come punto di partenza:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnfiles/html/msdn_serial.asp


http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnfiles/htm
l/msdn_serial.asp
Ti ringrazio ancora. Vedrò il documento (sempre che non lo abbia già
visto...) e cercherò di decifrarlo per vedere se riesco a cavare un ragno
dal buco! A presto!

questo sià più un quesito da it.comp.lang.c++...
Io in C farei cosi':
// definisco una stringa che conterra' il risultato esadecimale
char szEsa [100];
// questa stringa contiene i dati binari letti dalla seriale
char szBin [16];
// altre variabili
int f;
... leggo szBin ...
for (f=0;f<16;f++)
   sprintf (szEsa+(f*3),"%02X ",szBin [f]);
Posso trattare le stringhe come array di caratteri, con questo
"trucco" prelevo il singolo valore da szBin e uso sprintf per
convertirlo in forma esadecimale. Controlla la documentazione di
sprintf (e famiglia) nelle API per ulteriori informazioni.
Lavorare in modo asincrono e' la scelta migliore, ma anche quella
piu' incasinata... Puoi eveterla se la tua periferica lo
permette.

 permette.
Non sono sicuro, visto che in VB ho usato un controllo che intercetta
automaticamente gli eventi e ho associato il codice al solo evento di
ricezione dati oltre agli error-handler, quindi non so come lavora il MSComm
a basso livello. In ogni caso sto accompagnando lo sviluppo di applicazioni
basilari con lo studio della teoria di base del C++, e ora vedo di
concentrarrmi sul tuo esempio.
Vedrò di circoscrivere i settori in cui sono maggiormente in difficoltà
nella sintassi e di usare più appopriatamente il linguaggio senza l'uso di
nuove funzioni create per sopperire alla non conoscenza del linguaggio...
Grazie ancora per gli spunti preziosi! ;-)

meglio della pratica affiancata alla teoria...)
E questo e' un bene, anche se hai scelto un progetto un po'
ostico...

 sostenitori del C++... e viceversa. ;)
il viceversa sono critiche stupide: il C++ non toglie nulla al C dal punto
di vista funzionale, e penso che qualunque linker esistente ti permetta di
linkare file oggetto provenienti da sorgenti C a file oggetto provenienti
da sorgenti C++ (con le dovute accortezze sul mangling dei nomi).
molta gente ragiona in termini di religioni: molta gente è stupida. non è
mai questione di "è meglio questo" o "è meglio quello" in assoluto, ma
sempre in relativo. certe cose non si possono fare in C++, vanno fatte in
C. per tutte le altre c'è C++.
poi la domanda "è meglio imparare *prima* C o C++" per me già manca di
senso: se impari C++ sei a un passettino quasi nullo dal C...
che ci vuoi fare, una questione del genere i troll li attira per forza,
facevi meglio a non rispondere per niente :)
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 facevi meglio a non rispondere per niente :)
Se il riferimento ai troll mi riguarda libero di pensarla come vuoi, in ogni
caso il tuo intervento non ha apportato nulla alla discussione, serve solo a
fuorviarlo. Questo si, tipico dei troll...
La prossima volta capisci il senso, non limitarti a leggere. E non vedere
guerre di religione che nessuno ha voluto tirare in causa.

 facevi meglio a non rispondere per niente :)
Se il riferimento ai troll mi riguarda libero di pensarla come vuoi, in ogni


 guerre di religione che nessuno ha voluto tirare in causa.
si si, e intanto hai risposto :)


 si si, e intanto hai risposto :)
Umpf... Ma quanti anni hai?
Se non hai niente di meglio da dire perchè non eviti di scrivere?
Risparmieresti tempo a te e agli altri...