Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

вопрос про com порт

1.8K
11 апреля 2003 года
gerich
23 / / 22.11.2002
Народ, подскажите как узнать что в ком порт что-то записалось, точнее пришло от подключенного оборудования. Пробовал постоянно опрашивать порт но иногда программа как-будто бы не замечает пришеддших данных пока они повторно не придут. Программа пишется на VC++ 6.0 под winapi. Я хотел бы узнать можно ли перехватить само событие прихода данных что бы стопроцентно с первого раза прочитать что туда пришло.
427
13 апреля 2003 года
Glazunov Oleg
79 / / 20.03.2000
Если неизвестен момент прихода данных на порт, то используется объект ядра - событие (). Ниже привожу пример проги задействующей данный механизм. (Прога писалась под Builder, но ничего особенного там нет, так что переделать на VC не составит никакого труда).

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);
}
//---------------------------------------------------------
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог