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:
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;
}
Con la seriale riesco a comunicare ma, come dice anche il tutorial, il programma va in "wait", quindi si blocca tutto.
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