Проблема в чем ф-я реадфайл при чтении возвращает 0 прочитанных байт и отсутствие ошибки.
Данные точно присутствуют (кидаю гипертерминалом по нуль-модему). Причем в другом потоке в этот порт пишу без проблем. таймауты установлены нулевые — чтение происходит в цикле. Кто подскажет где грабли жить могут?
всем пасиба
Здравствуйте, XorNeT.
Поиск поможет.
Здравствуйте, XorNeT, Вы писали:
XNT>Проблема в чем ф-я реадфайл при чтении возвращает 0 прочитанных байт и отсутствие ошибки.
XNT>Данные точно присутствуют (кидаю гипертерминалом по нуль-модему). Причем в другом потоке в этот порт пишу без проблем. таймауты установлены нулевые — чтение происходит в цикле. Кто подскажет где грабли жить могут?
XNT>всем пасиба
Ты скажи, как СОМ-порт используешь (хотя-бы платформа какая)? Из-под виндов? Какими функциями обращаешся? Тогда виднее бодет...
Здравствуйте, 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;
Здравствуйте, 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;
Это работало.