Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Ошибка в вызове WaitCommEvent() / 7 сообщений из 7, страница 1 из 1
19.01.2006, 12:21
    #33491390
NatalyaK
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в вызове WaitCommEvent()
Добрый день всем
Происходит ошибка при вызове WaitCommEvent()
Есть код записи данных в Com-порт для устройства. Запись в порт происходит по событию. Событие ожидается с помощью WaitForMultipleObject(). Приведу фрагмент кода.

for(int i=0;i<22;i++)
{
m_events =CreateEvent(NULL,FALSE,FALSE,NULL);

};
soverlapped.Offset=0;
soverlapped.OffsetHigh=0;
soverlapped.hEvent=m_events[2];

PortId = CreateFile(PortName, GENERIC_READ|GENERIC_WRITE,0,NULL, OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);

SetCommMask(PortId,EV_RXCHAR);
while(1)
{
WaitCommEvent(PortId,&evtMask,&soverlapped);
DWORD dwerror=GetLastError();
if(dwerror!=ERROR_IO_PENDING)
ShowError(dwerror);

r=WaitForMultipleObjects(22,m_events,FALSE,INFINITE);

if(r==WAIT_FAILED)
ShowError(GetLastError());
else
switch(r-WAIT_OBJECT_0)
{...
case 11:
if(!WriteFile(PortId,bufer,count,&nWrite,&soverlapped))
{
dwerror=GetLastError();
Sleep(1000);
if(dwerror==ERROR_IO_PENDING)
{
if(!GetOverlappedResult(PortId, &soverlapped, &nWrite, TRUE))
ShowError(GetLastError());
}
else
ShowError(dwerror);
};
};

};
При вызове WaitCommEvent выдается ошибка 87 Параметр задан неверно. Может кто-нибудь сталкивался с подобной проблемой.
Спасибо
...
Рейтинг: 0 / 0
19.01.2006, 12:33
    #33491450
nikname
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в вызове WaitCommEvent()
Возьмите здесь хорошую MFC обвязку к COM порту ну или перепишите по мотивам.
...
Рейтинг: 0 / 0
19.01.2006, 12:38
    #33491478
NatalyaK
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в вызове WaitCommEvent()
Необходимо добавить,что ошибка происходит при втором проходе цикла while, при первом программа работает нормально
...
Рейтинг: 0 / 0
19.01.2006, 13:06
    #33491587
_Балтика
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в вызове WaitCommEvent()
Как-то писал что-то такое... Там по-моему событие должно быть с ручным сбросом.
...
Рейтинг: 0 / 0
19.01.2006, 13:17
    #33491635
_Балтика
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в вызове WaitCommEvent()
По крайней мере вот такой код у меня прекрасно работал в цикле
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
OVERLAPPED ov = { 0 };
ov.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
::WriteFile(hPort, writeBuf, numWriteByte, &numWriteByte, &ov);
if (::WaitForSingleObject(ov.hEvent, INFINITE) == WAIT_OBJECT_0)
    ::GetOverlappedResult(hPort, &ov, &numWriteByte, FALSE);
::ResetEvent(owner->m_hWriteEvent);
::CloseHandle(ov.hEvent);
...
Рейтинг: 0 / 0
19.01.2006, 13:46
    #33491744
NatalyaK
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в вызове WaitCommEvent()
Если возможно, объясните пожалуйста, почему важен ручной сброс события.

Сейчас запускаю программу под Windows 2000, а под 98 такая ошибка не возникала. Есть какие-нибудь тонкости работы функции в разных ОС?
...
Рейтинг: 0 / 0
19.01.2006, 13:55
    #33491788
_Балтика
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в вызове WaitCommEvent()
NatalyaKЕсли возможно, объясните пожалуйста, почему важен ручной сброс события.
Если честно, не помню... Надо в MSDN копаться, а сейчас нет времени. Гте-то у меня была ссылка на обсуждение этой проблемы. Ага
вот она .
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Ошибка в вызове WaitCommEvent() / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]