zoukankan      html  css  js  c++  java
  • 一个串口程序(转)

     bool   TForm1   ::   OpenPorts()  
      {  
                      //打开并设置串口  
                      //如果打开成功:返回true,否则返回false;  
                      //如果打开成功:m_hPortsHandle含有一有效值,否则为m_hPortsHandle为NULL;  
       
       
                      m_hPortsHandle   =   CreateFile(m_strPortsName.c_str(),  
                                                                                GENERIC_READ|GENERIC_WRITE,  
                                                                                0,  
                                                                                NULL,  
                                                                                OPEN_EXISTING   ,  
                                                                                FILE_FLAG_OVERLAPPED ,     //  
                                                                                NULL  
                                                                                );  
                      if(   m_hPortsHandle   ==   INVALID_HANDLE_VALUE)  
                      {  
                                      m_hPortsHandle   =   NULL;  
                                      return   false;  
       
                      }  
       
                      if(   SetupComm(m_hPortsHandle,1200,128)   ==   0)  
                      {  
                                      Application   ->   MessageBox("SetupComm   Failed!","提示",MB_OK);  
                                      CloseHandle(m_hPortsHandle);  
                                      m_hPortsHandle   =   NULL;  
                                      return   false;  
                      }  
                      if(   PurgeComm(m_hPortsHandle   ,PURGE_TXABORT   |   PURGE_RXABORT   |PURGE_TXCLEAR   |   PURGE_RXCLEAR)   ==   0)  
                      {  
                                      Application   ->   MessageBox("PurgeComm()   failed!","OpenPorts()",MB_OK);  
                                      CloseHandle(m_hPortsHandle);  
                                      m_hPortsHandle   =   NULL;  
                                      return   false;  
                      }  
       
                      DCB   Dcb   ;  
                      if(   GetCommState(m_hPortsHandle,&Dcb)   ==   FALSE)  
                      {  
                                      Application   ->   MessageBox("GetCommState()   failed","OpenAndSetCom()",MB_OK);  
                                      CloseHandle(m_hPortsHandle);  
                                      m_hPortsHandle   =   NULL;  
                                      return   false;  
                      }  
                      //   设置串口参数  
                      Dcb.     DCBlength   =   sizeof(DCB);  
                      Dcb   .   BaudRate   =   m_dwBaudRate;  
                      Dcb   .   ByteSize   =   m_byByteSize;  
                      Dcb   .   StopBits   =   m_byStopBits;  
                      Dcb   .   Parity   =   m_byParity;         //   Even  
       
                      if(   SetCommState(m_hPortsHandle,&Dcb)   ==   0)  
                      {  
                                      Application   ->   MessageBox("SetCommState()   failed!","OpenAndSetCom()",MB_OK);  
                                      CloseHandle(m_hPortsHandle);  
                                      m_hPortsHandle   =   NULL;  
                                      return   false;  
                      }  
       
                      return   true;  
       
      }  
       
       
       
      bool   TForm1   ::   RetrieveData(   unsigned   char   *Command,   int   CommandLength,  
                                                                                  unsigned   char   *Answer,   int   AnswerLength)  
      {  
                      //向软件狗中发送取数据命令.  
                      if(   m_hPortsHandle   ==   NULL   )  
                      {  
                                      return   false;  
                      }  
       
                      OVERLAPPED   MyOverLapped;  
                      MyOverLapped.hEvent   =   CreateEvent(   NULL,   TRUE,FALSE,NULL);  
                      MyOverLapped.Offset   =   0;  
                      MyOverLapped.OffsetHigh   =   0;  
                      if(   MyOverLapped.hEvent   ==   NULL)  
                      {  
                                      return   false;  
                      }  
       
                      if(   PurgeComm(m_hPortsHandle   ,PURGE_TXABORT   |   PURGE_RXABORT   |PURGE_TXCLEAR   |   PURGE_RXCLEAR)   ==   0)  
                      {  
                                      Application   ->   MessageBox("PurgeComm()   failed!","OpenPorts()",MB_OK);  
       
                                      CloseHandle(   MyOverLapped.hEvent);  
                                      return   false;  
                      }  
                      DWORD   dwWrittenLength;  
                      BOOL   bWriteResult   =   WriteFile(m_hPortsHandle,Command,CommandLength,  
                                                                                      &dwWrittenLength,   &MyOverLapped);  
       
                      if(   bWriteResult   ==   FALSE   )  
                      {  
       
                                      DWORD   dwLastError   =   GetLastError();  
                                      if(   dwLastError   ==   ERROR_IO_PENDING   )  
                                      {  
                                                      DWORD   dwWaitResult   =   WaitForSingleObject(   MyOverLapped.hEvent,10000);   //最多等待10秒钟  
                                                      if(   dwWaitResult   ==   WAIT_FAILED   ||  
                                                                      dwWaitResult   ==   WAIT_ABANDONED   ||  
                                                                      dwWaitResult   ==   WAIT_TIMEOUT)  
                                                      {  
                                                                      PurgeComm(m_hPortsHandle   ,PURGE_TXABORT   |   PURGE_RXABORT   |PURGE_TXCLEAR   |   PURGE_RXCLEAR);  
                                                                      CloseHandle(   MyOverLapped.hEvent);  
                                                                      return   false;  
                                                      }  
                                                      ResetEvent(   MyOverLapped.hEvent   );       //复位事件,以备ReadFile中使用  
                                      }  
                                      else  
                                      {  
                                                      PurgeComm(m_hPortsHandle   ,PURGE_TXABORT   |   PURGE_RXABORT   |PURGE_TXCLEAR   |   PURGE_RXCLEAR);  
                                                      CloseHandle(MyOverLapped.hEvent);  
                                                      return   false;  
                                      }  
                      }  
       
                      //   从软件狗中取回数据  
                      DWORD   dwReadLength;  
                      MyOverLapped   .   Offset   =   0;  
                      MyOverLapped   .   OffsetHigh   =   0;  
                      BOOL   bReadResult   =   ReadFile(   m_hPortsHandle,  
                                                                                Answer,  
                                                                                AnswerLength,  
                                                                                &dwReadLength,  
                                                                                &MyOverLapped  
                                                                            );  
                      if(   bReadResult   ==   FALSE   )  
                      {  
                                   
                                      DWORD   dwLastError   =   GetLastError();  
                                      if(   dwLastError   ==   ERROR_IO_PENDING   )  
                                      {  
                                                      DWORD   dwWaitResult   =   WaitForSingleObject(MyOverLapped.hEvent,10000);  
                                                      if(   dwWaitResult   ==   WAIT_FAILED   ||   dwWaitResult   ==   WAIT_ABANDONED   ||  
                                                                      dwWaitResult   ==   WAIT_TIMEOUT)  
                                                      {  
                                                                      PurgeComm(m_hPortsHandle   ,PURGE_TXABORT   |   PURGE_RXABORT   |PURGE_TXCLEAR   |   PURGE_RXCLEAR);  
                                                                      CloseHandle(   MyOverLapped.hEvent);  
                                                                      return   false;  
                                                      }  
                                      }  
                                      else  
                                      {  
                                                      PurgeComm(m_hPortsHandle   ,PURGE_TXABORT   |   PURGE_RXABORT   |PURGE_TXCLEAR   |   PURGE_RXCLEAR);  
                                                      CloseHandle(   MyOverLapped.hEvent);  
                                                      return   false;  
                                      }  
                      }  
       
       
                      CloseHandle(   MyOverLapped   .   hEvent);   
         
  • 相关阅读:
    java RSA加密解密
    spring boot 错误处理机制
    Redis 服务常见的几个错误解决方案
    Nginx目录遍历功能时间相差8小时
    翻过大山越过海洋看到了什么
    【分享】分层明确高度定制化的 Python Flask MVC
    编程浪子客服系统开源啦
    快速搭建一个直播Demo
    免费为网站加上HTTPS
    Mac 下安装Fiddler抓包工具
  • 原文地址:https://www.cnblogs.com/buffer/p/1277126.html
Copyright © 2011-2022 走看看