Ciao a tutti,
non so se questo è il posto giusto dove postere questo messaggio, se no scusatemi.
Arrivo subito al punto, sto realizzando un programma con il Microsoft Visual C++ 2008 Express Edition che dialoga con una scheda mediante seriale.
Dato che non ne sapevo niente di come comunica il VC++ con seriale, ho cercato un pò in rete e alla fine trovato dei tutorial, ma ora mi si pone un problema.
Il codice realizzato è il seguente:
Con la seriale riesco a comunicare ma, come dice anche il tutorial, il programma va in "wait", quindi si blocca tutto.codice:#include<iostream> #include "stdafx.h" #include "windows.h" #include "conio.h" using namespace std; BOOL setComm(HANDLE hComm) { DCB dcb; BOOL res; FillMemory(&dcb, sizeof(dcb), 0); res = GetCommState(hComm, &dcb); if (!res) return FALSE; dcb.ByteSize = 8; dcb.StopBits = TWOSTOPBITS; dcb.BaudRate = CBR_57600; dcb.Parity = NOPARITY; dcb.fAbortOnError = 0; res = SetCommState(hComm, &dcb); if (!res) return FALSE; DWORD err = GetLastError(); if ( err) cout << "Errore " << err << endl; return TRUE; } void state(HANDLE hComm) { DCB dcb; BOOL res; FillMemory(&dcb, sizeof(dcb), 0); res = GetCommState(hComm, &dcb); DWORD err = GetLastError(); if ( err) cout << "Errore ricevuto " << err << endl; SetLastError(0); } BOOL write(HANDLE hComm, char * buf) { DWORD nNumberOfBytesToWrite = strlen(buf); DWORD NumberOfBytesWritten; LPOVERLAPPED lpOverlapped = NULL; BOOL res = WriteFile( hComm, buf, nNumberOfBytesToWrite, &NumberOfBytesWritten, lpOverlapped ); if (res) cout << "Scrittura OK " << endl; else { DWORD err = GetLastError(); cout << "Errore in Scrittura " << err; } return res; } int main(int argc, char* argv[]) { char gszPort[] = "COM1"; HANDLE hComm; hComm = CreateFile( gszPort, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0); if (hComm == INVALID_HANDLE_VALUE) { cout << "Errore nell'apertura della porta " << endl; } else { char comando; char* com = &comando; cout << "inserisci un comando "; cin >> comando; cout << endl; cout << "comando inserito " << comando << endl; if (comando == 't' || comando == 'v') { cout << "il comando inserito può essere eseguito" << endl; // qui devo modificare char c; char CR[] = {13,10,0}; DWORD nNumberOfBytesToRead = 1; DWORD NumberOfBytesRead=0; LPOVERLAPPED lpOverlapped = NULL; BOOL bResult; bResult = setComm(hComm); // questo deve essere modificato write(hComm, com); //write(hComm, CR); //write(hComm, CR); for(;;) { nNumberOfBytesToRead = 1; bResult = ReadFile( hComm, &c, nNumberOfBytesToRead, &NumberOfBytesRead, lpOverlapped ); if (NumberOfBytesRead>0) cout << c; //printf("%c", c); } } else { cout << "il comando inserito non appartiene ai comandi che possono essere eseguiti" << endl; } CloseHandle(hComm); } cout << endl; getch(); return 0; }
Il tutorial suggeriva di "threadare" la lettura e scrittura su seriale.
Ho provato a lavorare su questo punto ma trovo delle difficoltà, mi potete dare qualche suggerimento o dove posso trovare materiale?
Grazie mille
Ciccio

Rispondi quotando