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

下面是异步串口模式下接收线程,和发送数据时的示例

接收线程:
//
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申请空间
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值