一個串口程式

來源:互聯網
上載者:User
 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);   
     

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.