dedecms织梦内容管理系统      
首页 | 51单片机 | 休闲娱乐 | 手工乐园 | 免费软件 | 理财专区 | 串口通信 | UNIX/LINUX | TurboC | 专题 | 会员中心 | 支持论坛
  当前位置:主页>串口通信 >文档内容
一个实用的串口类(二)[串口通信 初入]
来源:原创 作者:温柔老胡 发布时间:2007-07-04  
你会看到这个提示,那是因为你的系统无法识别某栏目的模型信息,或者你新建模型后,没为这个模型设计单独的模板。不同模型的文档浏览页的模板为:article_模型名字标识.htm 如“article_article.htm”,更多的信息你可以在频道模型管理的地方查看。
body  

//  Send the Datas.
//  写数据到串口
BOOL CSaimIO::SendData(unsigned char *lpCommand, DWORD dwBytesToWrite)
{
   BOOL        fWriteStat ;
   DWORD       dwBytesWritten ;
   DWORD       dwErrorFlags;
   DWORD       dwError;
   DWORD       dwBytesSent=0;
   COMSTAT     ComStat;
   char        szError[ 128 ] ;


   if (IoInfoData.fConnected == FALSE )
      return ( FALSE ) ;

   fWriteStat = WriteFile( IoInfoData.idComDev , lpCommand, dwBytesToWrite,
                           &dwBytesWritten,NULL) ; // &IoInfoData.osWrite ) ;

   if(dwBytesWritten != dwBytesToWrite)
    return FALSE;

   if (!fWriteStat)
   {
      if(GetLastError() == ERROR_IO_PENDING)
      {
         while(!GetOverlappedResult( IoInfoData.idComDev ,
            &IoInfoData.osWrite, &dwBytesWritten, TRUE ))
         {
            dwError = GetLastError();
            if(dwError == ERROR_IO_INCOMPLETE)
            {
               // normal result if not finished
               dwBytesSent += dwBytesWritten;
               continue;
            }
            else
            {
               // an error occurred, try to recover
               wsprintf( szError, "向串口发送数据出错,错误代码: %u", dwError ) ;

               MessageBox(NULL,szError,"发送数据出错",MB_ICONEXCLAMATION);

               ClearCommError( IoInfoData.idComDev , &dwErrorFlags, &ComStat ) ;
              
               break;
            }
         }
      }
      else
      {
         // some other error occurred
         ClearCommError( IoInfoData.idComDev , &dwErrorFlags, &ComStat ) ;

   if (dwErrorFlags > 0)
   {
    wsprintf( szError, "向串口发送数据出错,错误代码: %u", dwErrorFlags ) ;

    MessageBox(NULL,szError,"发送数据出错",MB_ICONEXCLAMATION);
   }

       return ( FALSE );
      }
   }
   return ( TRUE ) ;

} // end of SendData()


//  Read the Datas.
//  从串口中读出数据
DWORD CSaimIO::GetData(unsigned char *DataBuffer, DWORD DataLength)
{
   BOOL       fReadStat ;
   COMSTAT    ComStat ;
   DWORD      dwErrorFlags;
   DWORD      dwLength = DataLength;
   DWORD      dwError;
   char       szError[ 128 ] ;
     
   if (IoInfoData.fConnected == FALSE)
      return ( FALSE ) ;

//    SetCommMask( IoInfoData.idComDev ,EV_RXCHAR) ;    //设定为收到第一个字符时产生中断

// unsigned long  dwFlg;
// WaitCommEvent(IoInfoData.idComDev , &dwFlg,  &IoInfoData.osRead);  //等侍收到第一个字符事件发生
   
// if( (dwFlg & ( EV_RXFLAG | EV_RXCHAR )) == (EV_RXFLAG | EV_RXCHAR) )
 {
 
   // only try to read number of bytes in queue
   ClearCommError( IoInfoData.idComDev, &dwErrorFlags, &ComStat ) ;
   dwLength = min( 128, ComStat.cbInQue ) ;

   if (dwLength > 0)
   {
      fReadStat = ReadFile( IoInfoData.idComDev, DataBuffer,
                      dwLength, &dwLength, &IoInfoData.osRead );
      if (!fReadStat)
      {
         if (GetLastError() == ERROR_IO_PENDING)
         {
            // We have to wait for read to complete.
            // This function will timeout according to the
            // CommTimeOuts.ReadTotalTimeoutConstant variable
            // Every time it times out, check for port errors
            while(!GetOverlappedResult( IoInfoData.idComDev,
               &IoInfoData.osRead, &dwLength, TRUE ))
           {
               dwError = GetLastError();
               if(dwError == ERROR_IO_INCOMPLETE)
                  // normal result if not finished
                  continue;
               else
               {
                  // an error occurred, try to recover
                  wsprintf( szError, "向串口发送数据出错,错误代码: %u", dwError ) ;

         MessageBox(NULL,szError,"发送数据出错",MB_ICONEXCLAMATION);

                  ClearCommError( IoInfoData.idComDev, &dwErrorFlags, &ComStat ) ;
                  if (dwErrorFlags > 0)
                  {
                 wsprintf( szError, "向串口发送数据出错,错误代码: %u", dwError ) ;

           MessageBox(NULL,szError,"发送数据出错",MB_ICONEXCLAMATION);
                  }
                  break;
               }
            }
   }
         else
         {
            // some other error occurred
            dwLength = 0 ;
            ClearCommError( IoInfoData.idComDev, &dwErrorFlags, &ComStat ) ;
            if (dwErrorFlags > 0 )
            {
             wsprintf( szError, "向串口发送数据出错,错误代码: %u", dwErrorFlags ) ;

    MessageBox(NULL,szError,"发送数据出错",MB_ICONEXCLAMATION);            }
         }
      }
   }
 }

   return ( dwLength ) ;
}

//  把字符串转换为十六进制数据
void CSaimIO::StrToHex(unsigned char *lpBuffer, int *Total)
{
 if(((*Total) % 2) != 0)
 {
  strcat((char *)lpBuffer,"0");
  (*Total) ++;
 }

 unsigned char HexBuffer[1024];

 memset(HexBuffer,'',1024);

 int i ;
 for( i = 0 ; i < (*Total) ; i++)
 {
 
  if(lpBuffer[i] > 0x39)
   lpBuffer[i] -= 0x37 ;
  else
   lpBuffer[i] -= 0x30 ;
 }

 for(i=0 ; i < (*Total) ; i+=2)
 {
  HexBuffer[i/2] = lpBuffer[i] ;
  HexBuffer[i/2] <<= 4;

  HexBuffer[i/2] |= lpBuffer[i+1];
 }

 memcpy(lpBuffer,HexBuffer,(*Total)/2);
}

//  把十六进制数据转换为字符串
CString CSaimIO::HexToStr(unsigned char *lpDataBuffer,int Total)
{
 CString ReturnStr;
 char OneNumber[5];

 ReturnStr.Empty();
 memset(OneNumber,0,5);

 for(int i=0;i<Total;i++)
 {
  itoa(lpDataBuffer[i],OneNumber,16);

  if(strlen(OneNumber) < 2)
  {
   OneNumber[2] = OneNumber[1];
   OneNumber[1] = OneNumber[0];
   OneNumber[0] = '0';
  }
  ReturnStr+=OneNumber;
  ReturnStr+=", ";
  memset(OneNumber,0,5);
 }
 
 return ReturnStr;
}
//  清空串口缓冲
void CSaimIO::ClearIObuffer()
{
   if(PurgeComm(IoInfoData.idComDev,PURGE_RXCLEAR)== 0)
   return ;
   if(PurgeComm(IoInfoData.idComDev,PURGE_TXCLEAR)== 0)
   return ;
}

//  开始对串口监听
BOOL CSaimIO::BeginListen()
{
 if(IoInfoData.fConnected == FALSE)
  return FALSE;
 
 //  判断线程是还在否运行
 if(ThreadIsRun())
  return TRUE;

 hListenThread = CreateThread((LPSECURITY_ATTRIBUTES)NULL,
                            0,
          (LPTHREAD_START_ROUTINE)ListenThread,
          (LPVOID)&IoInfoData,
          0,&dwThreadID);

 if( hListenThread == NULL)
 {
  DWORD dwError = GetLastError();
  CString Msg;
  Msg.Format("Error code : %d",dwError);
  AfxMessageBox(Msg);

  return FALSE;
 }
 else
 {
  return TRUE;
 }
}

// 停止对串口监听
BOOL CSaimIO::EndListern()
{
 if(IoInfoData.fConnected == FALSE)
  return TRUE;

 if( hListenThread == NULL)
  return TRUE;

 //  判断线程是还在否运行
 if(!ThreadIsRun())
  return TRUE;

 KillListenThread = TRUE;
 Sleep(100);

 // 如果线程还在运行异常终止监听线程
 if(!TerminateThread( hListenThread,0))
 {
  DWORD dwError = GetLastError();
  CString Msg;
  Msg.Format("Error code : %d",dwError);
  AfxMessageBox(Msg);

  return FALSE;
 }
 else
  return CloseHandle( hListenThread );

}
// 打开串口,例如:Com1,9600,n,8,1
BOOL CSaimIO::ConnectCom(LPTSTR initStr)
{
 char strTemp[10];
 int i = 3;
 int j = 0;

 //  读出串口号
 while(initStr[i] != ',' && initStr[i] != '')
 {
  strTemp[j] = initStr[i];
  i++;
  j++;
  if(j > 3) return FALSE;
 }
 strTemp[j] = '';
    IoInfoData.bPort = atoi(strTemp);

 // 读出波特率
 i++;
 j=0;
 while(initStr[i]!=',' && initStr[i] != '')
 {
  strTemp[j] = initStr[i];
  i++;
  j++;
  if(j > 6) return FALSE;
 }
 strTemp[j] = '';

 if(strstr(strTemp,"256000") != NULL)
 {
  IoInfoData.dwBaudRate = CBR_256000;
 }
 else if(strstr(strTemp,"128000") != NULL)
 {
  IoInfoData.dwBaudRate = CBR_128000;
 }
 else if(strstr(strTemp,"115200") != NULL)
 {
  IoInfoData.dwBaudRate = CBR_115200;
 }
 else if(strstr(strTemp,"57600") != NULL)
 {
  IoInfoData.dwBaudRate = CBR_57600;
 }
 else if(strstr(strTemp,"56000") != NULL)
 {
  IoInfoData.dwBaudRate = CBR_56000;
 }
 else if(strstr(strTemp,"38400") != NULL)
 {
  IoInfoData.dwBaudRate = CBR_38400;
 }
 else if(strstr(strTemp,"19200") != NULL)
 {
  IoInfoData.dwBaudRate = CBR_19200;
 }
 else if(strstr(strTemp,"14400") != NULL)
 {
  IoInfoData.dwBaudRate = CBR_14400;
 }
 else if(strstr(strTemp,"9600") != NULL)
 {
  IoInfoData.dwBaudRate = CBR_9600;
 }
 else if(strstr(strTemp,"4800") != NULL)
 {
  IoInfoData.dwBaudRate = CBR_4800;
 }
 else if(strstr(strTemp,"2400") != NULL)
 {
  IoInfoData.dwBaudRate = CBR_2400;
 }
 else if(strstr(strTemp,"1200") != NULL)
 {
  IoInfoData.dwBaudRate = CBR_1200;
 }
 else if(strstr(strTemp,"600") != NULL)
 {
  IoInfoData.dwBaudRate = CBR_600;
 }
 else if(strstr(strTemp,"300") != NULL)
 {
  IoInfoData.dwBaudRate = CBR_300;
 }
 else if(strstr(strTemp,"110") != NULL)
 {
  IoInfoData.dwBaudRate = CBR_110;
 }
 else
 {
  IoInfoData.dwBaudRate = CBR_9600;
 }

 //读出校验方式
 i++;
 strTemp[0] = initStr[i];
 strTemp[1] = '';

 if(strstr(strTemp,"n")!=NULL)
 {
  IoInfoData.bParity = NOPARITY ;
 }
 else if(strstr(strTemp,"e")!=NULL)
 {
  IoInfoData.bParity = EVENPARITY ;
 }
 else if(strstr(strTemp,"o")!=NULL)
 {
  IoInfoData.bParity = ODDPARITY ;
 }
 else if(strstr(strTemp,"m")!=NULL)
 {
  IoInfoData.bParity = MARKPARITY ;
 }
 else if(strstr(strTemp,"s")!=NULL)
 {
  IoInfoData.bParity = SPACEPARITY ;
 }
 else
 {
  IoInfoData.bParity = NOPARITY ;
 }
   
 //读出数据位数
 i++;
 i++;
 strTemp[0]=initStr[i];
 IoInfoData.bByteSize = atoi(strTemp);

 //读出停止位
 i++;
 j = -1;
 do
 {
  i++;
  j++;
  strTemp[j] = initStr[i];
 }while(initStr[i] == '');

 if(strstr(strTemp,"1")!=NULL)
 {
  IoInfoData.bStopBits = ONESTOPBIT ;
 }
 else if(strstr(strTemp,"2")!=NULL)
 {
  IoInfoData.bStopBits = TWOSTOPBITS ;
 }
 else if(strstr(strTemp,"1.5")!=NULL)
 {
  IoInfoData.bStopBits = ONE5STOPBITS ;
 }
 else
 {
  IoInfoData.bStopBits = ONESTOPBIT ;
 }

 return Connect();
}

//  判断线程是还在否运行
BOOL CSaimIO::ThreadIsRun()
{
 DWORD lpExitCode;
 GetExitCodeThread(hListenThread,&lpExitCode);  
 
 if(lpExitCode == STILL_ACTIVE)
 {
  return TRUE;
 }
 else
 {
  return FALSE;
 }

}
//挂起线程
void CSaimIO::SuspandThread()
{
 ::SuspendThread(hListenThread);
}
//唤醒线程
void CSaimIO::ResumeThread()
{
 ::ResumeThread(hListenThread);
}

还可以到我的BLOG查看  http://blog.csdn.net/Saimen/archive/2001/10/03/10626.aspx

 


[收藏] [推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
用户名: 新注册) 密码: 匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
 §最新评论:
  热点文档
·负数补码计算方法
·一个实用的串口类(一)[串口通信
  相关文档
·负数补码计算方法
·一个实用的串口类(一)[串口通信
  推荐文档
·负数补码计算方法

 Powered by 温柔老胡 System by www.dedecms.com