将一个之前写的wince串口读写程序移植到xp平台时,发现收正常,发数据的时候经常出现卡死的情况,后来查找了些资料,需要改为异步串口才行。但是改成异步之后,收发都不能进行了,改了点之后出现以下问题:
DWORD ChControlDlg::DataSend(const BYTE *buf , int length)
{
UpdateData(true);
if (m_hComm==INVALID_HANDLE_VALUE)
{
return 0;
}
BOOL fWriteState;
DWORD dwBytesWritten;
OVERLAPPED m_osWrite;
memset(&m_osWrite,0,sizeof(OVERLAPPED));
m_osWrite.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
COMSTAT ComStat;  
DWORD dwErrorFlags;
ClearCommError(m_hComm,&dwErrorFlags,&ComStat);
BOOL bWriteStat;
DWORD wCount = 100;
//bWriteStat = WriteFile(hCom, m_send, m_send.GetLength(), &wCount, &m_osWrite);//发送数据
fWriteState=WriteFile(m_hComm,buf,length*sizeof(char),&dwBytesWritten,&m_osWrite);//此处,buf和length都可以正常读取,但是dwBytesWritten值始终为0,返回值fWriteState也为0.但是实际情况是在接收端已经正常显示收到了数据,这是为什么?哪里出错了么?
if(!fWriteState)
{
if(GetLastError()==ERROR_IO_PENDING)
{
SetEvent(m_osWrite.hEvent);
WaitForSingleObject(m_osWrite.hEvent,1000);
}
} return dwBytesWritten;
}
DWORD ChControlDlg::ReadPortThread(LPVOID lpParameter)
{
ChControlDlg* m_pSerial;
m_pSerial=(ChControlDlg*)lpParameter;
        //我在此处设置了断点后,程序到此暂停,发端一直在发,现在可以接收到数据可以显示。继续运行完整以后暂停显示。如果不设断点,接受区什么反应都没
BOOL fReadState;
DWORD dwLength; COMSTAT ComStat;
DWORD dwErrorFlags;
OVERLAPPED m_osRead;
memset(&m_osRead,0,sizeof(OVERLAPPED));
m_osRead.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL); ClearCommError(m_pSerial->m_hComm,&dwErrorFlags,&ComStat); m_pSerial->m_nBufferSize=min(m_pSerial->m_nBufferSize,(DWORD)ComStat.cbInQue); if (!m_pSerial->m_nBufferSize)
{
return FALSE;
} char* buf=new char[m_pSerial->m_nBufferSize]; while(m_pSerial->m_hComm!=INVALID_HANDLE_VALUE)
{
fReadState=ReadFile(m_pSerial->m_hComm,buf,m_pSerial->m_nBufferSize,&dwLength,&m_osRead);
if(!fReadState)
{
//AfxMessageBox(_T("无法从串口读取数据!"));
if (GetLastError()==ERROR_IO_PENDING)
{
WaitForSingleObject(m_osRead.hEvent,2000);
PurgeComm(m_pSerial->m_hComm, PURGE_TXABORT|
PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
return m_pSerial->m_nBufferSize; }
return 0;
}
else
{
if(dwLength!=0)
{
//回送数据
if(m_pSerial->m_lpDataArriveProc!=NULL)
{
m_pSerial->m_lpDataArriveProc(buf,dwLength,m_pSerial->m_dwUserData);//这个是做了一个消息传递,然后就处理数据并显示
}
}
}
}
PurgeComm(m_pSerial->m_hComm, PURGE_TXABORT|
PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
// return dwBytesRead;
delete[] buf;
return 0;
}