Собственно сабж.
Дело в том, что у меня есть некое устройство, с которого надо считать данные на PPC. Я написал класс для работы с этим устройством(на EVC), но проблема в том, что если я через этот класс работаю на ПК (программа скомпилированна на VC++ 6.0), то все работает нормально, а вот после компиляции на EVC ничего не работает...
Таймауты и структуру DCB вроде устанавливаю коректно, но увы
Может у PPC есть какие нибуть особенности (за исключением отсутствия асихронного чтения/записи) ?
Вот куски кода установки параметров порта
Код: Выделить всё
bool CComPort::Connect()
{
if (Connected()) return true;
m_hPort = CreateFile(m_PortName,GENERIC_READ|GENERIC_WRITE,0,0,
OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
if (Connected())
{
COMMTIMEOUTS tm;
tm.ReadIntervalTimeout=1;
tm.ReadTotalTimeoutConstant=1;
tm.ReadTotalTimeoutMultiplier=1;
tm.WriteTotalTimeoutConstant=10;
tm.WriteTotalTimeoutMultiplier=0;
if (SetCommTimeouts(m_hPort,&tm))
return true;
else
Disconnect();
}
return false;
}
bool CComPort::SetDCB(DCB & dcb)
{
return (Connected() && SetCommState(m_hPort,&dcb));
}
// Multical - наследник CComPort
bool Multical::SetReadParams()
{
if (!Connected()) return false;
DCB dcb;
ZeroMemory(&dcb,sizeof(DCB));
dcb.ByteSize = 7;
dcb.DCBlength=sizeof(DCB);
dcb.fBinary=true;
dcb.fParity=true;
dcb.Parity=EVENPARITY;
dcb.fRtsControl=RTS_CONTROL_ENABLE;
dcb.StopBits=TWOSTOPBITS;
dcb.fDtrControl=DTR_CONTROL_ENABLE;
dcb.BaudRate = 1200;
return SetDCB(dcb);
}
Код: Выделить всё
int CComPort::ReadData(void * buf, int len)
{
char * ch = (char *)buf;
if (!Connected()||(len<0))
return -1;
DWORD t = GetTickCount(), Readed = 0;
DWORD NotReaded=(DWORD)len;
while ((GetTickCount() - t) < (DWORD)m_InputTimeout)
{
ReadFile(m_hPort,ch,NotReaded,&Readed,0);
if (Readed!=0)
{
ch=ch+Readed;
NotReaded=NotReaded-Readed;
if (NotReaded==0) return len;
t=GetTickCount();
}
}
return (len-NotReaded);
}