Newsgroup: it.comp.programmare.win32
Titolo: Codice a barre

Ragazzi, mi serve il vostro prezioso aiuto. Mi č stato commissionato un
programmino per la gestione di un laboratorio :-) Ho deciso di programmare
il tutto in c++ con l'ausilio di wxwidgets per creare un'applicazione free
da licenze da comperare qua e la. Questo laboratorio ha un lettore per
leggere i codici a barre delle ricette che fa viaggiare le informazioni
tramite porta seriale, qualcuno puņ darmi un idea o ha un idea su dove
reperire del codice di esempio o manuali che spieghino come programmare
l'acquisizione di questo stramaledetto numero che dovrebbe essere registrato
nella mia app.
Un ringraziamento particolare va a tutti coloro che mi risponderanno e che
dedicheranno un po' delloro tempo ......
Thanks

 nella mia app.
Se ho capito bene, consiglierei di consultare l'MSDN
per la lettura da una porta seriale (COM1 p.es.).
Comunque su questa NG ho gia' presentato tempo fa
uno spezzone di codice utile che riporto per semplicita' qui
e funziona bene solo per letture di 13 caratteri alla volta.
Per un codice a numero di caratteri variabili consiglio
di gestire un solo carattere alla volta.
riporto:
Fatto salvo che dalle ricerche si siano gia' studiate le API,
dovresti 
p.es
. avere una variabile globale
CWinThread *p_MioThread;
per poi iniziare una catena con
((CBUTApp*)AfxGetApp())->p_MioThread =
AfxBeginThread(LeggiSeriale,h_hwnd,THREAD_PRIORITY_ABOVE_NORMAL);
in cui LeggiSeriale e' la proc. del thread
p. es., usando 
CEvent per_fine_LS come variabile controllo
volatile HANDLE h_seriale come Handle del file di comunicazione
allora un modello potrebbe essere
UINT LeggiSeriale(LPVOID pParam)
{
	COMSTAT CommStat;
	DWORD dwFlagsErrori;
	OVERLAPPED overlap = {0};
	DWORD nBytesRead;
	int b_Ris;
	int error_code;
 
	// per debugging preferisco avere il buffer a zero!
	ZeroMemory(inbuff,13);
	try
	{
		b_Ris =  ::ClearCommError(h_seriale, &dwFlagsErrori, &CommStat);
		if(dwFlagsErrori)
		{
			switch(dwFlagsErrori)
			{
				case CE_BREAK:
					break;
				case CE_FRAME:
					break;
				case CE_IOE:
					break;
				case CE_MODE:
					break;
				case CE_OVERRUN:
					break;
				case CE_RXOVER:
					break;
				case CE_RXPARITY:
					break;
				case CE_TXFULL:
					break;
				default:
			}
			return 0;
		};
		overlap.hEvent = (HANDLE) per_fine_LS;	
		if(overlap.hEvent==NULL)
			AfxMessageBox("CreateEvent ha fallito", MB_ICONERROR|MB_OK);
		if(!b_Ris||dwFlagsErrori)	throw 1;
		b_Ris = ::ReadFile(h_seriale,inbuff,13,&nBytesRead,&overlap);
		if(!b_Ris)
		{
			error_code = GetLastError();
			if(error_code==ERROR_IO_PENDING)
			{
				b_Ris = ::WaitForSingleObject(overlap.hEvent, INFINITE);
				if(b_Ris != WAIT_OBJECT_0)	throw 2;
				else
				{
					b_Ris = GetOverlappedResult(h_seriale, &overlap, &nBytesRead,
FALSE);
					if(!b_Ris)	throw 3;
					::ResetEvent(overlap.hEvent);// reinizializzazione per la prossima
lettura
				};
			}
			else	throw 4;
		}; // di if(!bRis)
	} // del try
 
	catch(int errore)
	{
		switch(errore)
		{
			case 1:
				{
					//JJ ClearCommError non a buon fine
				};
				break;
			case 2:
				{
					//JJ WAIT_OBJECT_0 non a buon termine");
				};
				break;
			case 3:
				{
					//JJ GetOverlappedResult non a buon termine");
				};
					break;	
		}; //JJ dello switch
		::PurgeComm(h_seriale, PURGE_RXABORT);
		::ResetEvent(overlap.hEvent);
	}; //JJ del catch
		//JJ Creazione di un nuovo Thread per leggere la seriale
		((CBUTApp*)AfxGetApp())->p_MioThread =
AfxBeginThread(LeggiSeriale,AfxGetMainWnd(),THREAD_PRIORITY_ABOVE_NORMAL);
//JJ viene lanciato un thread per la nuova lettura
	return 0;
}
In pratica ogni lettura della seriale esce da un thread e ne crea un
altro.
Se si vuole si puo' forzare la chiusura del thread agendo su
per_fine_LS.
N.B. usa 
::PurgeComm(h_seriale_LS, PURGE_RXCLEAR);
 per riutilizzare il canale!!
Saluti
JJ
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG