Witam.
Od jakiegos czasie pisze program, ktory bedzie komunikowal sie z urzadzeniem poprzez port COM. Urzadzenie to bedzie wysylalo dane w blizej nieokreslonym czasie, dlatego musze uzyc funkcji, ktore beda "monitorowac" ruch na porcie. I tutaj wlasnie mam problem. Mam juz napisana calosc, ale nie wiem jak w tym przypadku stworzyc nowy watek oraz jak przechwytywac do zmiennej dane, ktore zostana odczytane. Srodowisko to VC C++ 6.0 i MFC
Kod:
void CADlg::OnOK()
{
TCHAR *port = TEXT("COM2");
HANDLE hwd;
bool sukces;
DCB dcb;
OVERLAPPED o;
DWORD dwEvtMask = 0;
DWORD lpEvtMask;
//otwarcie portu
hwd = CreateFile(port, GENERIC_READ|GENERIC_WRITE, 0,NULL, OPEN_EXISTING,0,NULL);
if(hwd == INVALID_HANDLE_VALUE)
{
SetDlgItemText(IDC_EDIT1,"Nie mozna otworzyc portu");
} else
{
// set timeouts
// SetDlgItemText(IDC_EDIT1,"Otworzono port");
// COMMTIMEOUTS cto = { 0xFFFFFFFF, 0, 1000, 0, 1000 };
COMMTIMEOUTS cto = { 50, 50, 10, 0, 1000 };
SetCommTimeouts(hwd,&cto);
};
//pobranie aktualnych ustawien portu
sukces = GetCommState(hwd, &dcb);
if (!sukces)
{
SetDlgItemText(IDC_EDIT1,"Blad przy ustawieniu portu");
}
memset(&dcb,0,sizeof(dcb));
dcb.DCBlength = sizeof(dcb);
dcb.BaudRate = CBR_9600;
dcb.fParity = TRUE;
dcb.fBinary = TRUE;
// dcb.fDtrControl = DTR_CONTROL_ENABLE;
// dcb.fRtsControl = RTS_CONTROL_ENABLE;
// dcb.fRtsControl = DTR_CONTROL_HANDSHAKE;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;
dcb.ByteSize = 8;
GetCommMask(hwd,&lpEvtMask);
if(!SetCommState(hwd,&dcb))
printf("Blad");
SetCommMask(hwd,EV_RXCHAR);
char buf2[5];
DWORD read;
o.hEvent=CreateEvent(NULL, TRUE, FALSE, NULL);
o.Internal = 0;
o.InternalHigh = 0;
o.Offset = 0;
o.OffsetHigh = 0;
assert(o.hEvent);
DWORD dwErrorFlags;
COMSTAT ComStat;
char rfid[]="";
ClearCommError(hwd, &dwErrorFlags, &ComStat);
_sleep(50);
if(WaitCommEvent(hwd, &dwEvtMask, &o)>0)
{
if ((dwEvtMask & EV_RXCHAR) == EV_RXCHAR)
{
sukces = ReadFile(hwd,buf2,sizeof(buf2),&read,NULL);
if(sukces)
{
CString strCvt;
int Len = sizeof(buf2);
for(int i = 0; i <= 4; i++)
{
strCvt.Format("%d ", (BYTE)buf2[i]);
strcat(rfid,strCvt);
}
SetDlgItemText(IDC_EDIT1,rfid);
m_list.AddString(rfid);
}
}
else
{
DWORD dwRet = GetLastError();
if( ERROR_IO_PENDING == dwRet)
{
sukces = ReadFile(hwd,buf2,strlen(buf2),&read,NULL);
if (!sukces)
{
SetDlgItemText(IDC_EDIT1,"Blad przy odczycie");
}
}
else
SetDlgItemText(IDC_EDIT1,"Blad przy odczycie!");
}
}
CloseHandle(hwd);
}