Чтение с ком-порта
От: XorNeT  
Дата: 15.04.03 07:09
Оценка:
Проблема в чем ф-я реадфайл при чтении возвращает 0 прочитанных байт и отсутствие ошибки.
Данные точно присутствуют (кидаю гипертерминалом по нуль-модему). Причем в другом потоке в этот порт пишу без проблем. таймауты установлены нулевые — чтение происходит в цикле. Кто подскажет где грабли жить могут?
всем пасиба
Re: Чтение с ком-порта
От: kiamor  
Дата: 15.04.03 07:35
Оценка:
Здравствуйте, XorNeT.

Поиск поможет.
Re: Чтение с ком-порта
От: 4x Россия  
Дата: 17.04.03 06:30
Оценка:
Здравствуйте, XorNeT, Вы писали:

XNT>Проблема в чем ф-я реадфайл при чтении возвращает 0 прочитанных байт и отсутствие ошибки.

XNT>Данные точно присутствуют (кидаю гипертерминалом по нуль-модему). Причем в другом потоке в этот порт пишу без проблем. таймауты установлены нулевые — чтение происходит в цикле. Кто подскажет где грабли жить могут?
XNT>всем пасиба

Ты скажи, как СОМ-порт используешь (хотя-бы платформа какая)? Из-под виндов? Какими функциями обращаешся? Тогда виднее бодет...
void Me() { return Me(); } — познай себя!
Re[2]: Чтение с ком-порта
От: XorNeT  
Дата: 17.04.03 11:23
Оценка:
Здравствуйте, 4x, Вы писали:

4x>Здравствуйте, XorNeT, Вы писали:


XNT>Проблема в чем ф-я реадфайл при чтении возвращает 0 прочитанных байт и отсутствие ошибки.

XNT>Данные точно присутствуют (кидаю гипертерминалом по нуль-модему). Причем в другом потоке в этот порт пишу без проблем. таймауты установлены нулевые — чтение происходит в цикле. Кто подскажет где грабли жить могут?
XNT>всем пасиба

4x>Ты скажи, как СОМ-порт используешь (хотя-бы платформа какая)? Из-под виндов? Какими функциями обращаешся? Тогда виднее бодет...


Платформа в2к читаю реадфайлом предварительно вызывая SetCommState() & SetCommTimeouts()
if(hCom!= INVALID_HANDLE_VALUE){

DCB dCB;
::GetCommState(hCom,&dCB);
dCB.DCBlength = sizeof(DCB);
dCB.BaudRate = CBR_9600;
dCB.fParity = TRUE;
dCB.Parity = NOPARITY;
dCB.ByteSize = 8;
dCB.StopBits = ONESTOPBIT;
if(!::SetCommState(hCom,&dCB)){
TRACE("Error:SetComstate(rt)-%d\n",GetLastError());
}
}
COMMTIMEOUTS pCT;
pCT.ReadIntervalTimeout = MAXDWORD;
pCT.ReadTotalTimeoutConstant = 0;
pCT.ReadTotalTimeoutMultiplier = 0;
pCT.WriteTotalTimeoutConstant = 0;
pCT.WriteTotalTimeoutMultiplier =0;
Re[3]: Чтение с ком-порта
От: snowlight Россия  
Дата: 18.04.03 05:44
Оценка:
Здравствуйте, XorNeT, Вы писали:

XNT>Платформа в2к читаю реадфайлом предварительно вызывая SetCommState() & SetCommTimeouts()

XNT>if(hCom!= INVALID_HANDLE_VALUE){
XNT> DCB dCB;
XNT> ::GetCommState(hCom,&dCB);
XNT> dCB.DCBlength = sizeof(DCB);
XNT> dCB.BaudRate = CBR_9600;
XNT> dCB.fParity = TRUE;
XNT> dCB.Parity = NOPARITY;
XNT> dCB.ByteSize = 8;
XNT> dCB.StopBits = ONESTOPBIT;
XNT> if(!::SetCommState(hCom,&dCB)){
XNT> TRACE("Error:SetComstate(rt)-%d\n",GetLastError());
XNT> }
XNT> }
XNT> COMMTIMEOUTS pCT;
XNT> pCT.ReadIntervalTimeout = MAXDWORD;
XNT> pCT.ReadTotalTimeoutConstant = 0;
XNT> pCT.ReadTotalTimeoutMultiplier = 0;
XNT> pCT.WriteTotalTimeoutConstant = 0;
XNT> pCT.WriteTotalTimeoutMultiplier =0;

Приходилось с СОМ-портом работать этими же функциями. Ты не написал, как CreateFile вызываешь. У меня было так:
    // Вызов CreateFile для открытия СОМ-порта
    TCHAR sPort[10] = _T("\\\\.\\COM");
    sPort[7] = ((TCHAR)nPort) + '0';
    sPort[8] = 0;
    
    // Открываем порт
    m_hComm = CreateFile(sPort, GENERIC_READ | GENERIC_WRITE, 0, 
      NULL, OPEN_EXISTING, 0, NULL);
    if (m_hComm == INVALID_HANDLE_VALUE)
        return XDCP_PORTNOTOPENED;

    // Получаем текущее состояние до того как изменить его
    DCB dcb;
    dcb.DCBlength = sizeof(DCB);
    if ( !GetCommState(m_hComm, &dcb) )
        return XDCP_CANTGETSTATE;

    // Ставим свои параметры
    dcb.BaudRate = dwBaud; // Частота передачи
    dcb.ByteSize = 8; // Биты данных
    dcb.Parity = NOPARITY; // Паритет
    dcb.StopBits = ONESTOPBIT; // Стоповые биты

    // Делаем изменения в настройках порта
    if ( !SetCommState(m_hComm, &dcb) )
        return XDCP_CANTSETSTATE;

    // Устанавливаем таймауты
    COMMTIMEOUTS touts;
    touts.ReadIntervalTimeout = 250; // Таймаут между символами
    touts.ReadTotalTimeoutConstant = 250; // Таймаут добавляющийся к таймауту посылки
    touts.ReadTotalTimeoutMultiplier = 25; // Множитель таймаута для каждого символа
    touts.WriteTotalTimeoutConstant = 0;
    touts.WriteTotalTimeoutMultiplier = 0;
    if ( !SetCommTimeouts(m_hComm, &touts) )
        return XDCP_CANTSETTIMEOUTS;

Это работало.
void Me() { return Me(); } — познай себя!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.