亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? apexcommctl.cpp

?? c++實現的一個個串口通訊類
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
//////////////////////////////////////////////////////////
//  函數: OpenPort
//
//  目的: 在相應的端口啟動串口通訊
//
//  參數:
//    hNewCommFile - 用于通訊的串口設備句柄
//                   通過調用TAPI系統函數得到.
//
//  輸出:
//    Successful: 啟動串口通訊.
//    Failure: 產生異常事件.
//
//  注釋:
//
//    OpenPort 函數確保相應串口沒有正在進行的通訊過程,
//    創建通訊用串口句柄, 創建讀寫線程.  同時為端口設置合適的參數.
//
//    不管何種原因導致OpenPort 實施失敗, 那么調用該函數的相應用戶程序要
//    對它進行響應的處理:關閉其它程序打開的端口或者其它操作.因為控件不能
//    隨便關閉其它程序打開的通訊過程.
///////////////////////////////////////////////////////////////////
void CApexCommCtrl::OpenPort() 
{
   HANDLE hNewCommFile;

   //已經有通訊過程在執行嗎?
   if (m_hCommFile != NULL) 
      throw "該端口已經打開!";

   hNewCommFile = CreateFile( m_portID,
                              GENERIC_READ | GENERIC_WRITE,
                              0, //{! shared}
                              NULL, //{no security}
                              OPEN_EXISTING,
                              FILE_FLAG_OVERLAPPED,
                              NULL );//{template} 

   if (hNewCommFile == INVALID_HANDLE_VALUE) //得到非法值
     throw "無法打開串口資源!";

   // 這是一個合法的串口通訊句柄嗎?
   if (GetFileType( hNewCommFile ) != FILE_TYPE_CHAR) 
   {
       CloseHandle( hNewCommFile );
       throw "得到的文件句柄不為串口句柄!";
   }

   //設置輸入輸出緩沖區
   if (! SetupComm( hNewCommFile, m_inputBufferSize, m_outputBufferSize )) 
   {
       CloseHandle( hNewCommFile );
       throw "無法設置輸入輸出緩沖區!";
   }

   // 成功創建串口通訊.
   m_hCommFile = hNewCommFile;
   
   //將相應的串口緩沖區(不管輸入還是輸出)清空;終止正在進行的輸入輸出操作
   //并立即返回
   PurgeComm( m_hCommFile, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR ) ;
   m_bSendDataEmpty = true;//設緩沖區空標志

   // 查詢并設置超時時間值
   SetCommTimeState();

   // 查詢并設置通訊狀態,包括波特率,字節數,停止位等.
   SetPortState();

   // 創建通知線程結束的消息.
   m_hCloseEvent = CreateEvent( NULL, true, false, NULL );
   //成功創建嗎
   if (m_hCloseEvent == 0) 
   {
      CloseHandle( m_hCommFile );
      m_hCommFile = NULL;
      throw "無法創建線程結束消息事件!";
   }

   // 創建讀線程.
   try
   {
     ReadThread =new TReadThread;
     if (ReadThread==NULL)
        throw "無法生成新進程,程序將終止!";
     if (!ReadThread->CreateThread(CREATE_SUSPENDED))
     {
        delete ReadThread;
        throw "無法啟動新進程,程序將終止!";
     }
   }
   catch(char * ErrorString)
   {
      ReadThread = NULL;
      CloseHandle( m_hCloseEvent );
      CloseHandle( m_hCommFile );
      m_hCommFile = NULL;
      throw ErrorString;
   }
   ReadThread->m_hCommFile = m_hCommFile;
   ReadThread->m_hCloseEvent = m_hCloseEvent;
   ReadThread->m_handlemsg=m_hWnd;

   // 串口通訊具有最高優先級.
   // 如果不這樣,那么串口通訊將丟失數據
   ReadThread->SetThreadPriority(THREAD_PRIORITY_HIGHEST);

   // 創建寫線程.
   try
   {
     WriteThread = new TWriteThread;
     if (WriteThread==NULL)
        throw "無法生成新進程,程序將終止!";
     if (!WriteThread->CreateThread(CREATE_SUSPENDED))
     {
        delete WriteThread;
        throw "無法啟動新進程,程序將終止!";
     }
   }
   catch(char * ErrorString)
   {
     CloseReadThread();
     WriteThread = NULL;
     CloseHandle( m_hCloseEvent );
     CloseHandle( m_hCommFile );
     m_hCommFile = NULL;
     throw ErrorString;
   }
   WriteThread->m_hCommFile = m_hCommFile;
   WriteThread->m_hCloseEvent = m_hCloseEvent;
   WriteThread->m_handlemsg=m_hWnd;
   WriteThread->m_pbSendDataEmpty = m_bSendDataEmpty;

   WriteThread->SetThreadPriority(THREAD_PRIORITY_ABOVE_NORMAL);
   //啟動線程
   ReadThread->ResumeThread();
   WriteThread->ResumeThread();
   //至此串口通訊設置完畢,串口通訊準備就緒
}


//////////////////////////////////////////////////////
//  函數: ClosePort
//
//  目的: 停止串口通訊和讀寫線程
//
//  參數: 無
//
//  返回值: 無
//
//  注釋:
//
//    要通知所有的通訊線程結束通訊,如果不能結束
//    要用戶主動結束它
/////////////////////////////////////////////////////////
void CApexCommCtrl::ClosePort() 
{
     // 沒有通訊當然不用結束通訊過程
     if (m_hCommFile == NULL )
        return;

     // 關閉線程.
     CloseReadThread();
     CloseWriteThread();
     // 停止消息傳遞.
     CloseHandle( m_hCloseEvent );
     // 關閉通訊串口.
     CloseHandle( m_hCommFile );
     m_hCommFile = NULL;
}

////////////////////////////////////////////////////////
//  函數: WriteComX(PChar, Word)
//
//  目的: 向串口寫入字符串,該字符串等待寫線程的傳送.
//
//  參數:
//    pszStringToWrite     - 字符串.
//    nSizeofStringToWrite - 字符串長度.
//
//  返回值:
//    如果消息成功發布,則返回true.
//    如果失敗或者寫線程不存在則返回false.
//
//  注釋:
//
//    這是一個封裝好的函數,用戶不必知道寫串口是通過向寫線程發布消息實現的
//    使用這種方法可以加速對 UI的反應 (very little delay to
//    'write' a string) 如果寫過程速度慢,那么還可以自動分配到緩沖區
//    (ie: the messages just pile up in the message queue).
//
//    Note that it is assumed that pszStringToWrite is allocated with
//    LocalAlloc, and that if WriteComX succeeds, its the job of the
//    Write thread to LocalFree it.  If WriteComX fails,  its
//    the job of the calling function to free the string.
//////////////////////////////////////////////////////////////////////

BOOL CApexCommCtrl::WritePort(LPCTSTR pDataToWrite, long dwSizeofDataToWrite) 
{
   LPSTR Buffer;
   if ((WriteThread != NULL) && (dwSizeofDataToWrite != 0)) 
   {
      Buffer = (LPSTR)(LocalAlloc( LPTR, dwSizeofDataToWrite+1 ));
      strncpy(Buffer,(LPSTR)pDataToWrite,dwSizeofDataToWrite);
      Buffer[dwSizeofDataToWrite] = '\0';
	  //AfxMessageBox(Buffer);
      if (PostThreadMessage( WriteThread->m_nThreadID, USER_WRITEPORT,WPARAM(dwSizeofDataToWrite), LPARAM(Buffer))) 
      {
         m_bSendDataEmpty = false;
         return true;         
      }
      else
      {
         LocalFree(HLOCAL(Buffer));
      }
   }
   return false;
}

void CApexCommCtrl::SetPortState()
{
   DCB dcb;//保存通訊設置參數的結構體
   COMMPROP commprop;//保存通訊設置參數狀態的結構體
   DWORD fdwEvtMask;

   // Configure the comm settings.
   // !E: Most Comm settings can be set through TAPI, but this means that
   // the CommFile will have to be passed to this component.

   if (!GetCommState(m_hCommFile, &dcb))
      throw "無法取到串口配置";
   GetCommProperties(m_hCommFile, &commprop );
   GetCommMask(m_hCommFile, &fdwEvtMask );
   // fAbortOnError is the only DCB dependancy in TapiComm.
   // Can't guarentee that the SP will set this to what we expect.
   //{dcb.fAbortOnError = false; NOT VALID}
   dcb.BaudRate = m_baudRate;
   dcb.fBinary = 1;         // Enable fBinary

   dcb.fParity = m_enableParity; // Enable parity check

   dcb.fOutxCtsFlow =m_outxCtsFlow;  // setup hardware flow control

   dcb.fOutxDsrFlow = m_outxDsrFlow;

   switch(m_dtrControl)
   {
   case 0:
      dcb.fDtrControl=DTR_CONTROL_ENABLE;
      break;
   case 1:
      dcb.fDtrControl=DTR_CONTROL_DISABLE;
      break;   
   case 2:
      dcb.fDtrControl=DTR_CONTROL_HANDSHAKE;
      break;
   }

   dcb.fDsrSensitivity = m_dsrSensitivity;

   dcb.fTXContinueOnXoff = m_txContinueOnXoff;

   dcb.fOutX = m_outxXonXoffFlow;

   dcb.fInX = m_inxXonXoffFlow;

   dcb.fErrorChar = m_replaceWhenParityError;

   dcb.fNull = m_ignoreNullChar;

   switch(m_rtsControl)
   {
   case 0:
      dcb.fRtsControl=RTS_CONTROL_ENABLE;
      break;
   case 1:
      dcb.fRtsControl=RTS_CONTROL_DISABLE;
      break;   
   case 2:
      dcb.fRtsControl=RTS_CONTROL_HANDSHAKE;
      break;
   case 3:
      dcb.fRtsControl=RTS_CONTROL_TOGGLE;
      break;
   }

   dcb.XonLim = m_xonLimit;
   dcb.XoffLim = m_xoffLimit;

   dcb.ByteSize = (unsigned char)(m_byteSize + 5);
   dcb.Parity = (unsigned char) m_parity;
   dcb.StopBits = (unsigned char) m_stopBits;

   dcb.XonChar = char(m_xonChar);
   dcb.XoffChar = char(m_xoffChar);

   dcb.ErrorChar = char(m_replaceChar);

   if (!SetCommState( m_hCommFile, &dcb))
      throw "無法配置串口!";
}

void CApexCommCtrl::SetCommTimeState()
{
   COMMTIMEOUTS commtimeouts;
   if (!GetCommTimeouts(m_hCommFile, &commtimeouts))
      throw "無法得到串口時間配置!";
   // The CommTimeout numbers will very likely change if you are
   // coding to meet some kind of specification where
   // you need to reply within a certain amount of time after
   // recieving the last byte.  However,  If 1/4th of a second
   // goes by between recieving two characters, its a good
   // indication that the transmitting end has finished, even
   // assuming a 1200 baud modem.
   commtimeouts.ReadIntervalTimeout         = m_readIntervalTimeout;
   commtimeouts.ReadTotalTimeoutMultiplier  = m_readTotalTimeoutMultiplier;
   commtimeouts.ReadTotalTimeoutConstant    = m_readTotalTimeoutConstant;
   commtimeouts.WriteTotalTimeoutMultiplier = m_writeTotalTimeoutMultiplier;
   commtimeouts.WriteTotalTimeoutConstant   = m_writeTotalTimeoutConstant;

   if (!SetCommTimeouts(m_hCommFile, &commtimeouts))
      throw "無法配置串口時間!";
}


////////////////////////////////////////////////////////
//  函數: CloseReadThread
//
//  目的: Close the Read Thread.
//
//  參數:
//    none
//
//  返回值:
//    none
//
//  注釋:
//
//    Closes the Read thread by signaling the CloseEvent.
//    Purges any outstanding reads on the comm port.
//
//    Note that terminating a thread leaks memory.
//    Besides the normal leak incurred, there is an event object
//    that doesn't get closed.  This isn't worth worrying about
//    since it shouldn't happen anyway.
//
//
void CApexCommCtrl::CloseReadThread()
{
     // If it exists...
     if (ReadThread != NULL )
     {
          // Signal the event to close the worker threads.
          SetEvent( m_hCloseEvent );

          // Purge all outstanding reads
          PurgeComm( m_hCommFile, PURGE_RXABORT + PURGE_RXCLEAR );

          // Wait 10 seconds for it to return.  Shouldn't happen.
          //如果通過消息傳遞來關閉線程不能實現則主動刪除
          if (WaitForSingleObject(ReadThread->m_hThread, 10000) == WAIT_TIMEOUT) 
             TerminateThread(ReadThread->m_hThread,0);
             ReadThread = NULL;
     }
}


/////////////////////////////////////////////////////////
//  函數: CloseWriteThread
//
//  目的: 關閉寫線程.
//
//  參數:
//    none
//
//  返回值:
//    none
/////////////////////////////////////////////////////////////////
void CApexCommCtrl::CloseWriteThread()
{
   // If it exists...
   if (WriteThread != NULL )
   {
      // Signal the event to close the worker threads.
      SetEvent(m_hCloseEvent);

      // Purge all outstanding writes.
      PurgeComm(m_hCommFile, PURGE_TXABORT + PURGE_TXCLEAR);
      m_bSendDataEmpty = true;

      // Wait 10 seconds for it to return.  Shouldn't happen.
      if (WaitForSingleObject( WriteThread->m_hThread, 10000 ) == WAIT_TIMEOUT )
         TerminateThread(WriteThread->m_hThread,0);

      WriteThread = NULL;
   };
}

////////////////////////////////////////////////////////////////////
//函數名:ReceiveData
//功能:  處理用戶自定義消息:接收到數據
//參數:  wParam數據長度,lParam字符串
//返回值:標準自定義消息返回值
//注釋:  下面的函數形式相同
////////////////////////////////////////////////////////////////////
LRESULT CApexCommCtrl::ReceiveData(WPARAM wParam, LPARAM lParam )
{
   LPCTSTR strdata;
   WORD temp;
   strdata=(LPCTSTR)lParam;
   temp=wParam;
   FireOnReceiveData(strdata,temp);
   LocalFree((void*)lParam );
   return 0;
}

LRESULT CApexCommCtrl::CommHangup(WPARAM wParam, LPARAM lParam )
{
   WORD read_or_write;
   read_or_write=HIWORD(lParam);
   FireOnCommHangup(((read_or_write==0) ? 0:1));
   return 0;
}

LRESULT CApexCommCtrl::ReceiveDataError(WPARAM wParam, LPARAM lParam )
{
   long eventmask;
   eventmask=(long)lParam;
   FireReceiveDataError(eventmask);
   return 0;
}

LRESULT CApexCommCtrl::DataSendFinished(WPARAM wParam, LPARAM lParam )
{
   FireDataSendFinished();
   return 0;
}

//只有這樣才能讓窗口接收消息,同時又不顯示
BOOL CApexCommCtrl::PreCreateWindow(CREATESTRUCT& cs) 
{

   LPCTSTR tt; 
   tt=AfxRegisterWndClass (CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS,AfxGetApp()->LoadCursor(IDC_NOTHING),0,0);

   cs.lpszClass=tt;

   if (AmbientUserMode())
      cs.style = WS_CHILD | WS_CLIPSIBLINGS | WS_MAXIMIZEBOX ;
   else
      cs.style = WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_MAXIMIZEBOX;
   cs.dwExStyle &=~WS_EX_NOPARENTNOTIFY;
   
   return COleControl::PreCreateWindow(cs);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91麻豆免费观看| 国产成人免费9x9x人网站视频| 日韩一级片网址| 色综合色综合色综合| 麻豆精品一区二区三区| 亚洲视频一二三| 久久久国产午夜精品| 欧美性xxxxxx少妇| caoporen国产精品视频| 美女一区二区三区| 性久久久久久久| 亚洲天堂成人网| 中文无字幕一区二区三区| 欧美一二区视频| 欧美日韩久久久久久| av在线不卡电影| 成人黄色在线视频| 国产伦精品一区二区三区免费| 性久久久久久久久| 一区二区三区欧美激情| 国产精品九色蝌蚪自拍| 久久青草欧美一区二区三区| 欧美本精品男人aⅴ天堂| 欧美精品精品一区| 色老汉一区二区三区| 不卡电影一区二区三区| 国产麻豆成人精品| 国产一区二区三区香蕉| 蜜桃av一区二区三区电影| 午夜精品一区二区三区电影天堂| 亚洲欧美日韩小说| 亚洲日本丝袜连裤袜办公室| 国产精品国产三级国产普通话蜜臀| 26uuu色噜噜精品一区二区| 欧美一区二区福利在线| 欧美人体做爰大胆视频| 欧美日韩美少妇| 欧美日韩精品一区二区三区四区| 色婷婷精品大在线视频| 色噜噜狠狠色综合中国| 在线免费av一区| 欧美探花视频资源| 欧美精品tushy高清| 91.com视频| 欧美精品久久99| 欧美一级午夜免费电影| 欧美成人女星排行榜| 精品播放一区二区| 久久久三级国产网站| 欧美国产欧美综合| 1024亚洲合集| 亚洲一区在线观看视频| 日韩在线一区二区三区| 精品一区二区在线看| 国产精品99久久久久久久女警| 国产成人综合亚洲网站| av中文字幕亚洲| 欧美午夜在线一二页| 欧美一级视频精品观看| www成人在线观看| 国产精品久久久久久久浪潮网站| 亚洲色图欧洲色图| 亚洲高清在线精品| 黑人巨大精品欧美一区| 国产.欧美.日韩| 91九色最新地址| 91精品国产免费久久综合| 国产亚洲精品aa午夜观看| 亚洲欧洲日韩在线| 亚洲va欧美va人人爽| 激情综合亚洲精品| 波多野结衣中文字幕一区二区三区 | 色婷婷精品久久二区二区蜜臂av| 欧美无砖专区一中文字| 日韩欧美在线不卡| 国产精品家庭影院| 日韩国产精品久久久久久亚洲| 国产在线视频一区二区| 欧美美女直播网站| 日韩区在线观看| 国产精品久久久久久久久免费丝袜| 一区二区在线观看不卡| 日韩国产欧美在线视频| 国产a精品视频| 884aa四虎影成人精品一区| 国产色一区二区| 婷婷成人激情在线网| 国产成人小视频| 88在线观看91蜜桃国自产| 亚洲国产电影在线观看| 免费日本视频一区| 91老师片黄在线观看| 精品区一区二区| 一区二区三区四区亚洲| 国产一区二区电影| 欧美老年两性高潮| 亚洲另类在线一区| 国产精品自产自拍| 欧美一区二区三区在线观看视频| 国产精品久久久久7777按摩| 久久精品理论片| 精品视频在线免费| 国产精品国产三级国产aⅴ原创 | 全国精品久久少妇| 91天堂素人约啪| 久久综合色婷婷| 亚洲gay无套男同| 91视频.com| 国产精品毛片无遮挡高清| 日韩av在线发布| 欧洲国内综合视频| 亚洲欧美另类小说| 国产91在线观看丝袜| 欧美电影免费观看高清完整版在 | 亚洲伦理在线精品| 成人午夜电影网站| 国产丝袜欧美中文另类| 久久成人久久爱| 欧美一级欧美一级在线播放| 亚洲午夜在线观看视频在线| 91在线观看成人| 中文字幕一区二区在线播放 | 国产一本一道久久香蕉| 日韩欧美亚洲一区二区| 男女男精品视频| 91精品国产综合久久精品性色| 亚洲另类在线一区| 色狠狠桃花综合| 亚洲人123区| 99久久精品国产麻豆演员表| 国产精品久久久久久妇女6080| 国产盗摄视频一区二区三区| 337p粉嫩大胆色噜噜噜噜亚洲| 色综合激情久久| 中文字幕日韩av资源站| av电影天堂一区二区在线观看| 欧美国产视频在线| 99国产欧美另类久久久精品| 亚洲欧洲精品一区二区三区不卡| av激情亚洲男人天堂| 中文字幕中文字幕中文字幕亚洲无线| 成人美女在线视频| 综合激情网...| 欧美色图第一页| 三级影片在线观看欧美日韩一区二区| 欧美日韩久久不卡| 久久99久久久欧美国产| 精品对白一区国产伦| 国产黄色精品视频| 国产精品久久久久久一区二区三区 | 色婷婷综合视频在线观看| 一区二区三区在线视频免费 | 午夜欧美在线一二页| 欧美精品一二三| 精品在线一区二区| 国产精品理论片| 欧美综合久久久| 欧美aⅴ一区二区三区视频| 久久综合九色欧美综合狠狠| 高清不卡一区二区| 一区二区三区在线免费观看| 欧美日韩一区不卡| 久久不见久久见免费视频1| 国产欧美日韩精品在线| 在线精品视频小说1| 日韩电影在线免费观看| 久久久精品国产免大香伊| 一本色道综合亚洲| 免费视频最近日韩| 国产精品国产三级国产普通话三级 | 99久久久精品免费观看国产蜜| 一区二区日韩av| 精品久久一区二区| av亚洲精华国产精华| 日韩成人av影视| 国产精品你懂的| 欧美蜜桃一区二区三区| 丁香五精品蜜臀久久久久99网站| 亚洲黄色片在线观看| 日韩精品一区二区三区三区免费| 成人开心网精品视频| 日本美女一区二区三区视频| 国产精品网友自拍| 欧美一卡二卡在线| 色综合一个色综合亚洲| 久久99最新地址| 亚洲小说欧美激情另类| 久久精品亚洲麻豆av一区二区| 色哟哟国产精品| 国产成人午夜视频| 日韩电影在线观看一区| 中文字幕一区二| 2023国产精品| 69av一区二区三区| av亚洲精华国产精华精华| 韩国午夜理伦三级不卡影院| 亚洲一区在线视频| 综合自拍亚洲综合图不卡区| 精品国产一区二区三区不卡| 欧美猛男超大videosgay|