Questo è la funzione di Apertura delle porte:
void initSerialPort(int seq,const LPCWSTR port){
// Imposto i valori per i Timeout
cto[seq].ReadIntervalTimeout = 500;
cto[seq].ReadTotalTimeoutMultiplier = 500;
cto[seq].ReadTotalTimeoutConstant = 500;
cto[seq].WriteTotalTimeoutMultiplier = 500;
cto[seq].WriteTotalTimeoutConstant = 500;
// Inizializzo la porta seriale
serialport[seq] = CreateFile(port, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
// Imposto il Timeout
SetCommTimeouts(serialport[seq], &cto[seq]);
// Imposto le proprietà della connessione
if (serialport[seq] == INVALID_HANDLE_VALUE)
return;
DCB prop[2];
GetCommState(serialport[seq], &prop[seq]);
prop[seq].BaudRate = CBR_9600;
prop[seq].Parity = NOPARITY;
prop[seq].ByteSize = 8;
prop[seq].StopBits = ONESTOPBIT;
if (!SetCommState(serialport[seq], &prop[seq]))
serialport[seq] = INVALID_HANDLE_VALUE;
return;
}
Questa è il codice di lettura nel thread principale :
LPCWSTR porta =L"com1";
initSerialPort(0,porta);
.......
do {
ReadFile(serialport[0], ch, 1, &CS, NULL);
if (CS == 1) {
hdg[ind] = ch[0];
ind++;
}
else ind = 2;
} while (ind < 2);
Aggiungo le porte che mi servono e di conseguenza accodo codici di lettura per ogni porta.
L'apertura delle porte avviene all'inizio del thread. Poi si entra in un ciclo che continua fino alla chiusura del programma.
Questo per dirti che non ho commesso l'errore di aprire le porte all'infinto.
il while fa in modo che io riceva esattamente tre caratteri per formare la stringa hdg che io utilizzerò per codificare gli ordini da inviare al simulatore di volo.
Quindi formo una stringa da interpretare. Non devo salvarla da nessuna parte solo utilizzarla.
Qui vedi un time out di 500 che va bene per una porta. Mettendo a 0 i valori la lettura su più porte è immediata.
Tuttavia le stringhe escono tutte assieme quando tutte le porte hanno dati da inviare.
Arduino manda un carattere alla volta.
Il tutto avviene in tempo reale. (ovvaimente per noi umani non per il processore).
Non ho un numero fisso di dati da ricevere. Se ci sono ad esempio due schede collegate ne uso comunque una alla volta. Non muovo due encoder contemporaneamente su due schede diverse.
Alla tua domanda "non arriva niente per quanto tempo" rispondo: non è questione di tempo. Appena l'ultima porta ha dei dati da inviare arrivano in ordine tutti. Ma io ho bisogno che agiscano indipendentemente una dall'altra
In pratica ho bisogno di un "no-blocking code" funzionante.
Il fare programmi separati per ogni porta usata aggira il problema di dover attendere la fine della lettura di una porta per passare ad un'altra cosa che appunto voglio evitare.
Ti ringrazio per la pazienza.