您的位置:首页 > 其它

异步串口模式发送和接收数据

2013-04-26 16:17 344 查看
下面是异步串口模式下接收线程,和发送数据时的示例

接收线程:

//////////////////////////////////////////////////////////////////////

CCESeries *ceSeries = (CCESeries*)lparam;

DWORD evtMask;
BYTE  readBuf[1600];//读取的字节
DWORD actualReadLen=0;//实际读取的字节数
DWORD willReadLen;
int iFrameLen=0,iReadLen=0;

DWORD dwReadErrors;
COMSTAT
cmState;

memset(readBuf,0,1600);

// 清空缓冲,并检查串口是否打开。
ASSERT(ceSeries->m_hComm !=INVALID_HANDLE_VALUE); 

//清空串口
PurgeComm(ceSeries->m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR );

SetCommMask (ceSeries->m_hComm, EV_RXCHAR | EV_CTS | EV_DSR );

//////////////////////////////////////////////////////////////////////////
OVERLAPPED olWaite,olRead;
memset(&olWaite,0,sizeof(olWaite)); 
olWaite.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);     
SetCommMask(ceSeries->m_hComm,EV_RXCHAR);
DWORD dwCommStatus = 0;
WaitCommEvent(ceSeries->m_hComm,&dwCommStatus,&olWaite);

while(1)
{
DWORD dwByte; //norains:It is only suitable for the GetOverlappedResult(),not undefined here.
if(GetOverlappedResult(ceSeries->m_hComm,&olWaite,&dwByte,TRUE) == FALSE)
{
if(GetLastError() != ERROR_IO_PENDING)
{
return 0x30;
}
//Clear the error flag
DWORD dwErrors;
COMSTAT comStat;
memset(&comStat,0,sizeof(comStat));
ClearCommError(ceSeries->m_hComm,&dwErrors,&comStat);
return 0x35;
}

memset(&olRead,0,sizeof(olRead));
olRead.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);

DWORD dwRead;
if(ReadFile(ceSeries->m_hComm,readBuf,1024,&dwRead,&olRead) ==FALSE)
{
if(GetLastError() != ERROR_IO_PENDING)
{

// return 0x40;
}
if(GetOverlappedResult(ceSeries->m_hComm,&olRead,&dwRead,TRUE) == FALSE)
{
return 0x45;
}
if(dwRead == 0)
{
return 0x50;
}
}

Sleep(2);

if (dwRead > 0)
{

memcpy(g_RecvBuf+iReadLen,readBuf,dwRead);

iReadLen = iReadLen + dwRead;
if (iReadLen > 8)
{
iFrameLen = (readBuf[6]<<8) + readBuf[7];
}

if (iReadLen > iFrameLen)
{
iFrameLen =0;
iReadLen =0;
memset(g_RecvBuf,0,MAXDATALEN);
}

if ( (iFrameLen == iReadLen) && iFrameLen >0 && iReadLen>0)
{
ceSeries->m_OnSeriesRead(ceSeries->m_pPortOwner,g_RecvBuf,actualReadLen);
iFrameLen =0;
iReadLen =0;
}

//   TRACE("%0x %0x %0x %0x %0x %0x %0x %0x\n",readBuf[0],readBuf[1],

//   readBuf[2],readBuf[3],readBuf[4],readBuf[5],readBuf[6],readBuf[7]);
}

}

//////////////////////////////////////////////////////////////////////////

return 0;

2、数据发送:

OVERLAPPED olWrite;
memset(&olWrite,0,sizeof(olWrite));

    olWrite.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
DWORD dwBytes;
int iSendLen=0; //发出去的数据长度

DWORD dwactlen; 
if(WriteFile(m_hComm, buf, datalen, &dwactlen, &olWrite) == FALSE)
{

// if(GetLastError() != ERROR_IO_PENDING)

// {

// return 0x20;

//         }

// return -1;
}

Sleep(1);

if(GetOverlappedResult(m_hComm,&olWrite,&dwBytes,TRUE) == FALSE)

    {
return -1;

    }

iSendLen += dwBytes;
while(datalen >iSendLen)
{
if(WriteFile(m_hComm, buf+iSendLen, datalen-iSendLen, &dwactlen, &olWrite) == FALSE)
{
;
}

if(GetOverlappedResult(m_hComm,&olWrite,&dwBytes,TRUE) == FALSE)
{
return -1;
}

iSendLen += dwBytes;
}

if (dwBytes !=0)
{

// TRACE("%d\n",iSendLen);
CString str;
str.Format("发送%d字节",dwBytes);
AfxMessageBox(str);
}

// 

// for (int i=0;i<15;i++)

// {

// TRACE("%0x\n",buf[i]);

// }

// Sleep(5);
return dwactlen;

3、Release版本下发送数据时,定义的缓冲区超过实际发送的数据长度时会出错。可以定义一个指针,需要的数据长度计算出来后用new申请空间
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: