清空串口的缓存及应用

本文介绍了一种基于Windows API的串口通信读写实现方法。通过使用PurgeComm进行串口清理,确保通信正常进行,并利用ReadFile与WriteFile进行数据的接收与发送。在读取数据时,通过循环直至接收到指定长度的数据;在写入数据时,则确保所有数据都被成功发送。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PurgeComm(hCom, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);

Read(int len)
{
 BOOL rtn = TRUE;
 iRecvLen = len;
 DWORD dwAllRecv = 0;
 memset(szRecv,0,sizeof(szRecv));
 int Count =0;
 while(TRUE)
 {
  Count++;
  DWORD len1 = 0;
  OVERLAPPED overread;
  
  //overread.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
  
  DWORD dwBytesRead=len;
  COMSTAT ComStat;
  DWORD dwErrorFlags;
  
  memset(&overread,0,sizeof(overread));
  
  if(!ClearCommError(hCom,&dwErrorFlags,&ComStat))
  {
   PurgeComm(hCom, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
   rtn = FALSE;
   break;
  }
  
  dwBytesRead=min(dwBytesRead,(DWORD)ComStat.cbInQue);

  if(dwBytesRead == 0)
  {
   if(Count > 100)
   {
    rtn = FALSE;
    break;
   }
   else
   {
    Sleep(5);
    continue;
   }
   
  } 
  len1 = 0;
  BOOL bSucess = ::ReadFile(hCom,szRecv+dwAllRecv,dwBytesRead,&len1,&overread);
  if(!bSucess)
  {
   if(GetLastError() == ERROR_IO_PENDING)
   {
    if(GetOverlappedResult(hCom,&overread,&len1,TRUE))
    {
     rtn = TRUE;
     dwAllRecv += len1;
    }
    else
    {
     rtn = FALSE;
     break;
    }
   }
   else
   {
    rtn = FALSE;
    break;;

   }
  }
  else
  {
   rtn = TRUE;
   dwAllRecv += len1;
  }

  if(dwAllRecv == len)
  {
   rtn = TRUE;
   break;
  }
  Sleep(5);
 }
 
 
 return rtn; 
}

BOOL Write(char *pSend,DWORD len)
{
// return FALSE;
 if(hCom == INVALID_HANDLE_VALUE)
  return FALSE;
 DWORD len1 = 0;

 COMSTAT ComStat;
 DWORD dwErrorFlags;
 OVERLAPPED overwrite;
 memset(&overwrite,0,sizeof(overwrite));
 BOOL rtn = TRUE;
 PurgeComm(hCom, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
 if(!ClearCommError(hCom,&dwErrorFlags,&ComStat))
 {
  DWORD Code = GetLastError();
  PurgeComm(hCom, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
  rtn = FALSE;
  return rtn;
 }

 len1 = 0;
 BOOL bSucess = ::WriteFile(hCom,pSend,len,&len1,&overwrite);

 DWORD written = 0;
 DWORD n = 0;
 if(!bSucess)
 {
  if(GetLastError() == ERROR_IO_PENDING)
  {
   if(GetOverlappedResult(hCom,&overwrite,&len1,TRUE))
   {
    rtn = TRUE;
   }
   else
   {
    rtn = FALSE;
   }
  }
  else
  {
   rtn = FALSE;
  }
 }
 else
 {
  rtn = TRUE;
 }

 return rtn;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值