/* definizione del main /
int main( int argc , char argv[] )
{
/* vado ad aprire il file su cui vado a memorizzare i miei controlli */
stream = fopen( "prova.txt" , "w" );
if ( ( stream = fopen ("prova.txt","w") ) == NULL )
{
printf ( "non posso aprire il file %s\n" , "prova.txt" );
}
char gszPort[] = "COM6"; // imposto quale porta USB aprire
HANDLE hComm;
hComm = CreateFile( gszPort,
GENERIC_READ | GENERIC_WRITE,
0,
0,
OPEN_EXISTING,
0, // NO ! FILE_FLAG_OVERLAPPED,
0);
/* verifico che sono riuscito ad aprire la porta*/
if ( hComm == INVALID_HANDLE_VALUE )
{
printf( "error opening\n" );
// error opening port; abort
}
else // se ho aperto la porta COM
{
/* definisco i parametri della comunicazione */
char c;
DWORD nNumberOfBytesToRead = 1;
DWORD NumberOfBytesRead = 0;
LPOVERLAPPED lpOverlapped = NULL; // pointer to structure for data
BOOL bResult;
bResult = setComm ( hComm );
int ho = 0; // contatore dei cicli di lettura da seriale(definisco quante volte leggere)
const int LUNG_MAX = 30; // definisco la lunghezza massima della stringa in cui memorizzo i valori
int ax = 0, ay = 0, CRC_A = 0; // ax, ay = coordinata x e y CRC_A = CRC (valore di controllo correttezza del dato)
char str [ LUNG_MAX ]; // stringa in cui memorizzo il buffer della x e y
char buff [ 5 ]; // buffer dove memorizzo il valore esadecimale in formato ASCII di ax che uso per calcolare il CRC lato PC e che poi confronto con quello restituito dall'arduino
int yu = 0; // variabile di controllo di uscita dal ciclo della seriale (esco quando leggo una stringa valida)
int i = 0, j = 0; // i = contatore per scrivere nella stringa di lettura da seriale j = contatore dei cicli da seriale (quante volte vado a leggere il buffer della seriale a cui accedo con il puntatore *c)
int rec = 0; // variabile di controllo che mi dice se iniziare a memorizzare la stringa
for ( ho = 0 ; ho < 100 ; ho++ ) { // inizio il ciclo di lettura (vado a leggere 20000 volte dalla seriale)
/* inizializzo le variabili ogni volta che ho letto una stringa valida ( valida non vuol dire corretta, la corretteza la dice il CRC) */
ax = 0;
ay = 0;
CRC_A = 0;
yu = 0;
i = 0;
j = 0;
rec = 0;
buff[0] = '\0';
str[0] = '\0';
do // inizio a leggere un carattere per volta dal buffer della seriale fino a che non ho letto una stringa valida
{
nNumberOfBytesToRead = 1;
bResult = ReadFile(
hComm, // handle of file to read
&c, // pointer to buffer that receives data
nNumberOfBytesToRead, // number of bytes to read
&NumberOfBytesRead, // pointer to number of bytes read
lpOverlapped // pointer to structure for data
);
////////////////// stampo il ciclo j-esimo il carattere letto dal buffer che punta alla seriale prima in ASCII poi in Esadecimale //////////////////////
printf( " Ciclo : = %d\n", j++);
if(c == '|') { //se leggo | inizio a memorizzare i valori nella stringa
rec = 1;
}
// Ricostruisco a stringa
if(rec == 1 && i < LUNG_MAX)
{
if(c == '|') {} // non mi interessa nella ricostruzione della stringa quindi se la leggo non faccio nulla
else if(c != '<') // se non ho letto il terminatore (<) memorizzo il valore perchè è interessante
{
str [ i++ ] = c;
}
else // se ho letto < metto il terminatore di stringa in fondo a str perchè ho letto tutto quello che mi serve
{
str [ i ] = '\0';
yu = 1; // incremento yu e quindi esco dal ciclo do (notare che poi faccio controllo sul CRC, se non è soddisfatto riazzere yu e torno a leggere)
}
}
if (i > LUNG_MAX ) // se esco dalla lunghezza massima della stringa o se ho letto il terminatore faccio il controllo sul CRC e azzero le variabili del ciclo
{
sscanf ( str , "%d\t%d\t%d" , &ax, &ay, &CRC_A); //trasformo la stringa
itoa ( ax+ay, buff, 16); //trasformo il valore in esaASCII per fare il calcolo del CRC
crcInit(); //crea tabella per velocizzare il calcolo del CRC
// printf(" The crcFast() of %i is 0x%X, 0x%X\n", ax+ay, CRC_A, crcFast( buff, strlen(buff) ) ); //stampo a video il valore di interesse il CRC lato arduino e il CRC lato PC
/* faccio il controllo sul CRC confrontando quello calcolato sul PC con quello inviato da Arduino, salvo tutto in ogni caso ma metto ok se è corretto e NO se la stringa non è corretta */
// if( crcFast ( buff, strlen(buff)) == CRC_A ) fprintf ( stream, "ciclo = %2i|| OK ||x = %2i ||y = %2i ||somma = %2i ||CRC_arduino = 0x%i ||CRC_calc = 0x%X%\n", ho, ax, ay, ax+ay, CRC_A, crcFast( buff, strlen(buff) ) );
// else
// {
// fprintf( stream, "ciclo = %2i|| NO ||x = %i ||y = %2i ||somma = %2i ||CRC_arduino = 0x%X ||CRC_calc = 0x%X%\n", ho, ax, ay, ax+ay, CRC_A, crcFast(buff, strlen(buff) ) );
// yu = 0; // se la stringa non è corretta non devo uscire dal ciclo do quindi ricambio il valore di yu
// }
/* azzero le variabili che uso per la memorizzazione*/
rec = 0;
str [ 0 ] = '\0';
i = 0;
j = 0;
}
/* se non ho beccato l'inizio di scrittura per più di 200 cicli do qualcosa non va provo a spegnere e riaccendere la COM, mi sa ma non va molto bene*/
if (j > 200)
{
fprintf( stream, "ciclo = %i ho perso contatto \n", j );
CloseHandle ( hComm ); //chiudo la seriale
hComm = CreateFile( gszPort,
GENERIC_READ | GENERIC_WRITE,
0,
0,
OPEN_EXISTING,
0, // NO ! FILE_FLAG_OVERLAPPED,
0);
rec = 0;
str [ 0 ] = '\0';
i = 0;
j = 0;
}
} while( yu == 0 );// se yu è diverso da 0 esco dal ciclo id lettura dalla seriale perchè ho memorizzato in stringa il valore di x e y
}
fclose ( stream ); //chiudo il file
CloseHandle( hComm ); //chiudo la seriale
}
getch();
return 0;
}