вопрос про com порт
Народ, подскажите как узнать что в ком порт что-то записалось, точнее пришло от подключенного оборудования. Пробовал постоянно опрашивать порт но иногда программа как-будто бы не замечает пришеддших данных пока они повторно не придут. Программа пишется на VC++ 6.0 под winapi. Я хотел бы узнать можно ли перехватить само событие прихода данных что бы стопроцентно с первого раза прочитать что туда пришло.
DCB dcb;
HANDLE hCom;
OVERLAPPED o;
COMMTIMEOUTS CommTimeouts;
BOOL fSuccess;
DWORD dwEvtMask;
byte Buf[1000];
byte Buf2[300];
DWORD ReadBytes;
RAW_MEASUREMENT_DATA RMD;
//---------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
hCom = CreateFile("COM1",
GENERIC_READ | GENERIC_WRITE,
0, /* exclusive access */
NULL, /* no security attrs */
OPEN_EXISTING,
0,//FILE_FLAG_OVERLAPPED,
NULL
);
if (hCom == INVALID_HANDLE_VALUE) {
/* Deal with the error. */
MessageBox(NULL,"Error CreateFile!","Message",MB_OK);
}
fSuccess = GetCommState(hCom, &dcb);
if (!fSuccess) {
/* Handle the error. */
MessageBox(NULL,"Error GetCommState!","Message",MB_OK);
}
/* Fill in the DCB: baud=9600, 8 data bits, no parity, 1 stop bit. */
dcb.BaudRate = CBR_115200;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;
Label2->Caption=dcb.fBinary;
Label4->Caption=dcb.fParity;
Label6->Caption=dcb.EofChar;
Label8->Caption=dcb.fDtrControl;
Label10->Caption=dcb.fDsrSensitivity;
GetCommTimeouts(hCom,&CommTimeouts);
CommTimeouts.ReadIntervalTimeout=10;
// CommTimeouts.ReadTotalTimeoutMultiplier=0;
SetCommTimeouts(hCom,&CommTimeouts);
fSuccess = SetCommState(hCom, &dcb);
if (!fSuccess) {
/* Handle the error. */
MessageBox(NULL,"Error SetCommState!","Message",MB_OK);
}
/* Set the event mask. */
fSuccess = SetCommMask(hCom, EV_CTS | EV_DSR|EV_RXCHAR);
if (!fSuccess) {
/* deal with error */
MessageBox(NULL,"Error SetCommMask!","Message",MB_OK);
}
/* Create an event object for use in WaitCommEvent. */
o.hEvent = CreateEvent(NULL, /* no security attributes */
FALSE, /* auto reset event */
FALSE, /* not signaled */
NULL /* no name */
);
assert(o.hEvent);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
char MyTitle[5];
int ReadPos;
for(;;)
{
WaitCommEvent(hCom, &dwEvtMask,NULL);//&o);
// WaitForSingleObject(o.hEvent,NULL);
{
if (dwEvtMask & EV_DSR) {
MessageBox(NULL,"Ok EV_DSR!","Message",MB_OK);
/*
* . . .
*/
}
if (dwEvtMask & EV_RXCHAR) {
ReadFile(hCom,Buf,500,&ReadBytes,NULL);
if (dwEvtMask & EV_CTS) {
MessageBox(NULL,"Ok EV_CTS!","Message",MB_OK);
/*
* . . .
*/
}
}
ZeroMemory(Buf,sizeof(Buf));
Application->ProcessMessages();
}
}
//---------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
CloseHandle(hCom);
CloseHandle(o.hEvent);
}
//---------------------------------------------------------