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

Ваш аккаунт

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

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

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

Проблемы с ReadFile при работе с COM портом

4.8K
01 марта 2011 года
fakel15
54 / / 02.12.2005
Добрый день!
Возникла следующая неприятная особенность при работе с COM портом.
Суть программы в том, что она в начале посылает запрос устройству, а потом считывает ответ. Это реализовано примерно так:
Код:
bState=WriteFile(
        hCom,                   // handle to file to write to
        transData,              // pointer to data to write to file
        8,                      // number of bytes to write
        &sent_number,           // pointer to number of bytes written
        NULL                    // pointer to structure for overlapped I/O
        );
   
if (!bState)
{
    return 0x10;
}
   
 bState=ReadFile(
           hCom,
           readData,
               5+ucCountReg*2,
           &read_number,
           NULL
    );
if (!bState) return 0x10;


В принципе работает без нареканий. НО!
Если остановить работу программы и запустить какую-нибудь другую программу (использующую тот же порт), а потом её выключить, то при запуске моей программы запись в порт осуществляется без проблем (т.е. bState и sent_number корректны), а вот при чтении возвращает read_number=0. Приходится отключать преобразователь USB<->RS485 (который в системе регистрируется как COM порт) и включать его заново.
В чём может быть проблема?
13K
09 марта 2011 года
MihaZzz
18 / / 06.03.2006
Попробуй использовать функции SetCommMask и WaitCommEvent перед чтением порта.

 
Код:
GetCommMask( hPort, &dwEvtMask );
SetCommMask( hPort, dwEvtMask|EV_RXCHAR );

WaitCommEvent( hPort, &dwEvtMask, 0 );

if( dwEvtMask & EV_RXCHAR )
{
    ReadFile( hPort,... );
}


P.S.
Возможно твоя программа открывает соединение на другой частоте.
Также настрой тайм-ауты (SetCommTimeouts).
Можешь проверить с помощью функции GetCommConfig, затем установить нужные параметры порта через SetCommConfig или SetCommState

Код:
BOOL PortSetup( HANDLE hPort )
{
   DCB PortDCB;
   PortDCB.DCBlength = sizeof (DCB);
   GetCommState (hPort, &PortDCB);

   PortDCB.BaudRate = CBR_9600; // частота
   PortDCB.fBinary = TRUE;
   PortDCB.fParity = FALSE;
   PortDCB.fOutxCtsFlow = FALSE;
   PortDCB.fOutxDsrFlow = FALSE;
   PortDCB.fDtrControl = DTR_CONTROL_DISABLE;
   PortDCB.fDsrSensitivity = FALSE;
   PortDCB.fTXContinueOnXoff = TRUE;
   PortDCB.fOutX = FALSE;
   PortDCB.fInX = FALSE;
   PortDCB.fErrorChar = FALSE;
   PortDCB.fNull = FALSE;
   PortDCB.fRtsControl = RTS_CONTROL_DISABLE;
   PortDCB.fAbortOnError = FALSE;
   PortDCB.ByteSize = 8;
   PortDCB.Parity = NOPARITY;
   PortDCB.StopBits = ONESTOPBIT;

   if( !SetCommState (hPort, &PortDCB) )
       return FALSE;

   COMMTIMEOUTS CommTimeouts;
   GetCommTimeouts (hPort, &CommTimeouts);

   CommTimeouts.ReadIntervalTimeout = -1;
   CommTimeouts.ReadTotalTimeoutMultiplier = 0;
   CommTimeouts.ReadTotalTimeoutConstant = 0;
   CommTimeouts.WriteTotalTimeoutMultiplier = 10;
   CommTimeouts.WriteTotalTimeoutConstant = 1000;

   if( !SetCommTimeouts (hPort, &CommTimeouts) )
       return FALSE;

    PurgeComm( hPort,
        PURGE_TXABORT | PURGE_RXABORT |
        PURGE_TXCLEAR | PURGE_RXCLEAR );

    return TRUE;
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог