串口操作问题,一下代码在WIN2000下没有问题,在98中出现问题,具体如下解释
/******************************
*******************************解释处******************************
******************************/
OVERLAPPED m_ov;void* CSerialComm::ReadData(int* iRead)
{

BOOL bRead = TRUE;
BOOL bResult = TRUE;
DWORD dwError = 0;
DWORD dwEvent =0;
DWORD BytesRead = 0;
DWORD dwTotalRead = 0;
int i = 0;
COMSTAT comstat; BYTE RXBuff[1024];

void* lpBuf;
lpBuf=(void*)malloc(1);
for(;;)
{
Sleep(20); //暂时作为延时接收数据

bResult = ClearCommError(m_hIDComDev, &dwError, &comstat);
if(comstat.cbInQue == 0)
break;
if(bRead)
{
bResult = ReadFile(m_hIDComDev, &RXBuff, 1024, &BytesRead,&m_ov);
if(bResult)
bRead = TRUE;
}
/******************************
*******************************
ReadFile函数调用总是读不到数据
使用GetLastError函数得到错误代码997(ERROR_IO_PENDING),根据MSDN说明在WIN98下把上面的ReadFile调用改为bResult = ReadFile(m_hIDComDev, &RXBuff, 1024, &BytesRead,NULL);
单步调试到处程序再也无法往下走******************************
******************************/ if(!bRead)
{
bRead = TRUE;
bResult = GetOverlappedResult(m_hIDComDev, &m_ov, &BytesRead, TRUE);
}
dwTotalRead += BytesRead;
lpBuf=(void*)realloc(lpBuf,dwTotalRead);
memcpy(((unsigned char*)lpBuf + dwTotalRead-BytesRead ), RXBuff, BytesRead);
i++;
}
*iRead = dwTotalRead;
return lpBuf;}/******************************
*******************************以下是打开串口代码******************************
******************************/ BOOL CSerialComm::Open(int nPort, long nBaud)
{

if(m_bOpened)
return TRUE;
if(m_ov.hEvent == NULL)
m_ov.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
else
ResetEvent(m_ov.hEvent); char szPort[10];
char szComParams[50];
DCB dcb;
sprintf(szPort, "COM%d", nPort);
sprintf(szComParams, "COM%d:%d,n,8,1", nPort, nBaud);
m_hIDComDev = CreateFile(szPort,
GENERIC_READ|GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,
NULL);
if(m_hIDComDev == INVALID_HANDLE_VALUE)
return FALSE;
COMMTIMEOUTS m_CommTimeOuts;
m_CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF;
m_CommTimeOuts.ReadTotalTimeoutMultiplier = 1000;
m_CommTimeOuts.ReadTotalTimeoutConstant = 1000;
m_CommTimeOuts.WriteTotalTimeoutMultiplier = 1000;
m_CommTimeOuts.WriteTotalTimeoutConstant = 1000;
if(SetCommTimeouts(m_hIDComDev, &m_CommTimeOuts))
{

if(SetCommMask(m_hIDComDev, EV_CTS|EV_RXCHAR))
{
if(GetCommState(m_hIDComDev, &dcb))
{
if(BuildCommDCB(szComParams, &dcb))
{
dcb.fDtrControl=DTR_CONTROL_ENABLE;
dcb.fRtsControl=RTS_CONTROL_ENABLE;
dcb.fBinary = TRUE;
SetCommState(m_hIDComDev, &dcb);
}
}
}

}
SetupComm(m_hIDComDev, 4096, 4096);
PurgeComm(m_hIDComDev, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);
m_bOpened = TRUE;
return TRUE;

}我如何才能实现WIN98或者2000下都能正常串口通讯?

解决方案 »

  1.   

    刚好最近我也碰到这个问题! 和你的是一模一样的问题!
    原先我是一次性读比较多的数据,在Win98下读不上来,后来我改成了一次性读少一点的数据,结果能够读上来,我也不知道为什么会发生这样的问题!
    你试试把ReadFile(...1024...)中的1024改小点看看!!
      

  2.   

    改小了也没有用,难道跟我打开串口时设定
    SetupComm(m_hIDComDev, 4096, 4096);有关系吗
      

  3.   

    刚才按 hdsunwind(太阳风)  的方法改小接收数据量,由于没有试到最小,后来我又改成
    ReadFile(...1...)就能读到,但比较慢了
      

  4.   

    你用的是异步操作,ReadFile函数会立刻返回,即使没有完成读操作。一次读1024个字符,读不到值是正常的,因为操作还未完成,在你调用GetLastOverlapped()后,函数会一直到操作完成才会返回,ERROR_IO_PENDING就是说明操作正在进行中。