欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
用Win32 API實(shí)現串行通信
用Win32 API實(shí)現串行通信

串口是常用的計算機與外部串行設備之間的數據傳輸通道,由于串行通信方便
易行,所以應用廣泛。我們可以利用Windows API 提供的通信函數編寫(xiě)出高可移植性的
串行通信程序。
 
        在Win16中,可以利用OpenComm、CloseComm和WriteComm等函數打開(kāi)、關(guān)閉和
讀寫(xiě)串口。但在Win32中,串口和其他通信設備均被作為文件處理,串口的打開(kāi)、關(guān)閉
和讀寫(xiě)等操作所用的API函數與操作文件的函數相同??赏ㄟ^(guò)CreateFile函數打開(kāi)串口
,通過(guò)CloseFile函數關(guān)閉串口,通過(guò)CommProp、DCB結構、GetCommProperties、
SetCommProperties、GetCommState及SetCommState等函數設置串口狀態(tài),通過(guò)函數
ReadFile和WritFile讀寫(xiě)串口。 
         VC++ 6.0是Windows應用程序開(kāi)發(fā)的主流語(yǔ)言之一,它具有良好的圖形設計
界面并支持面向對象的程序設計方法。本文結合一個(gè)實(shí)例介紹在VC++ 6.0下如何利用
Win32 API 實(shí)現串行通信程序。 
實(shí)現原理 
        本文的實(shí)例來(lái)自一個(gè)水泥發(fā)貨系統,在系統中,需要將通過(guò)總量傳感器采集到
的倉重值傳入到計算機中,以便系統做出相應的處理。這需要使用串行通信來(lái)完成采集
數據的傳遞工作。 
        對于串行通信設備,Win32 API支持同步和異步兩種I/O操作。同步操作方式的
程序設計相對比較簡(jiǎn)單,但I/O操作函數在I/O操作結束前不能返回,這將掛起調用線(xiàn)程
,直到I/O操作結束。異步操作方式相對要復雜一些,但它可讓耗時(shí)的I/O操作在后臺進(jìn)
行,不會(huì )掛起調用線(xiàn)程,這在大數據量通信的情況下對改善調用線(xiàn)程的響應速度是相當
有效的。異步操作方式特別適合同時(shí)對多個(gè)串行設備進(jìn)行I/O操作和同時(shí)對一個(gè)串行設
備進(jìn)行讀/寫(xiě)操作。這兩種操作方式的程序設計基本思想是相似的,本文將針對同步操
作方式給出具體的通信程序設計,同時(shí)簡(jiǎn)單說(shuō)明如何實(shí)現異步的I/O操作。 
串行設備的初始化 
       串行設備的初始化是利用CreateFile函數實(shí)現的。該函數獲得串行設備句柄并
對其進(jìn)行通信參數設置,包括設置輸出/接收緩沖區大小、超時(shí)控制和事件監視等。 
//串行設備句柄; 
HANDLE hComDev=0;  
//串口打開(kāi)標志; 
BOOL bOpen=FALSE; 
//線(xiàn)程同步事件句柄; 
HANDLE hEvent=0;  
BOOL SetupSynCom() 
{  
 DCB dcb; 
 COMMTIMEOUTS timeouts; 
 //設備已打開(kāi) 
 if(bOpen) return FALSE;   
 //打開(kāi)COM1 
if((hComDev=CreateFile(“COM1”,GENERICREAD|GENERICWRITE,0,NULL,OPEN
EXISTING,FILEATTRIBUTENORMAL,NULL))== 
INVALIDHANDLEVALUE)  
return FALSE; 
//設置超時(shí)控制 
SetCommTimeouts(hComDev,&timeouts);  
 //設置接收緩沖區和輸出緩沖區的大小 
 SetupComm(hComDev,1024,512);  
//獲取缺省的DCB結構的值 
 GetCommState(hComDev,&dcb);  
//設定波特率為9600 bps 
 dcb.BaudRate=CBR9600;  
//設定無(wú)奇偶校驗 
 dcb.fParity=NOPARITY;  
//設定數據位為8 
 dcb.ByteSize=8;  
 //設定一個(gè)停止位 
 dcb.StopBits=ONESTOPBIT;  
//監視串口的錯誤和接收到字符兩種事件 
 SetCommMask(hComDev,EVERR|EVRXCHAR);  
//設置串行設備控制參數 
 SetCommState(hComDev,&dcb);  
//設備已打開(kāi) 
 bOpen=TRUE;  
 //創(chuàng )建人工重設、未發(fā)信號的事件 
 hEvent=CreateEvent(NULL,FALSE,FALSE, 
“WatchEvent”); 
//創(chuàng )建一個(gè)事件監視線(xiàn)程來(lái)監視串口事件 
 AfxBeginThread(CommWatchProc,pParam);  

        在設置串口DCB結構的參數時(shí),不必設置每一個(gè)值。首先讀出DCB缺省的參數設
置,然后只修改必要的參數,其他參數都取缺省值。由于對串口進(jìn)行的是同步I/O操作
,所以除非指定進(jìn)行監測的事件發(fā)生,否則WaitCommEvent函數不會(huì )返回。在串行設備
初始化的最后要建立一個(gè)單獨的監視線(xiàn)程來(lái)監視串口事件,以免掛起當前調用線(xiàn)程,其
中pParam可以是一個(gè)對事件進(jìn)行處理的窗口類(lèi)指針。 
如果要進(jìn)行異步I/O操作,打開(kāi)設備句柄時(shí),CreateFile的第6個(gè)參數應增加FILEFLAG
OVERLAPPED 標志。 
數據發(fā)送 
        數據發(fā)送利用WriteFile函數實(shí)現。對于同步I/O操作,它的最后一個(gè)參數可為
NULL;而對異步I/O操作,它的最后一個(gè)參數必需是一個(gè)指向OVERLAPPED結構的指針,
通過(guò)OVERLAPPED結構來(lái)獲得當前的操作狀態(tài)。 
BOOL WriteComm(LPCVOID lpSndBuffer,DWORD  
dwBytesToWrite) 
{ //lpSndBuffer為發(fā)送數據緩沖區指針, 
dwBytesToWrite為將要發(fā)送的字節長(cháng)度 
//設備已打開(kāi) 
 BOOL bWriteState;  
//實(shí)際發(fā)送的字節數 
 DWORD dwBytesWritten;  
//設備未打開(kāi) 
 if(!bOpen) return FALSE;  
 bWriteState=WriteFile(hComDev,lpSndBuffer, 
dwBytesToWrite,&dwBytesWritten,NULL); 
 if(!bWriteState || dwBytesToWrite!=dwBytesWritten) 
//發(fā)送失敗 
  return FALSE;  
 else 
//發(fā)送成功 
  return TRUE;  

數據接收 
        接收數據的任務(wù)由ReadFile函數完成。該函數從串口接收緩沖區中讀取數據,
讀取數據前,先用ClearCommError函數獲得接收緩沖區中的字節數。接收數據時(shí),同步
和異步讀取的差別同發(fā)送數據是一樣的。 
DWORD ReadComm(LPVOID lpInBuffer,DWORD  
dwBytesToRead) 
{ //lpInBuffer為接收數據的緩沖區指針, dwBytesToRead為準備讀取的數據長(cháng)度(字
節數) 
//串行設備狀態(tài)結構 
 COMSTAT ComStat;  
 DWORD dwBytesRead,dwErrorFlags;  
//設備未打開(kāi) 
 if(!bOpen) return 0; 
 //讀取串行設備的當前狀態(tài) 
 ClearCommError(hComDev,&dwErrorFlags,&ComStat);  
 //應該讀取的數據長(cháng)度 
dwBytesRead=min(dwBytesToRead,ComStat.cbInQue);  
 if(dwBytesRead>0) 
  //讀取數據 
  if(!ReadFile(hComDev,lpInBuffer,dwBytesRead,&dwBytesRead,NULL))  
   dwBytesRead=0; 
 return dwBytesRead; 

事件監視線(xiàn)程 
        事件監視線(xiàn)程對串口事件進(jìn)行監視,當監視的事件發(fā)生時(shí),監視線(xiàn)程可將這個(gè)
事件發(fā)送(SendMessage)或登記(PostMessage)到對事件進(jìn)行處理的窗口類(lèi)(由pParam指
定)中。 
UINT CommWatchProc(LPVOID pParam) 
{ DWORD dwEventMask=0; //發(fā)生的事件; 
 while(bOpen) 
 { //等待監視的事件發(fā)生 
WaitCommEvent(hComDev, &dwEventMask,  
NULL);  
 if ((dwEventMask & EVRXCHAR) ==  
EVRXCHAR) 
……//接收到字符事件后,可以將此消息登記到由pParam有指定的窗口類(lèi)中進(jìn)行處理 
  if(dwEventMask & EVERR)==EVERROR) 
   ……//發(fā)生錯誤時(shí)的處理 
 } 
 SetEvent(hEvent);  
 //發(fā)信號,指示監視線(xiàn)程結束 
 return 0; 

關(guān)閉串行設備 
        在整個(gè)應用程序結束或不再使用串行設備時(shí),應將串行設備關(guān)閉,包括取消事
件監視,將設備打開(kāi)標志bOpen置為FALSE以使事件監視線(xiàn)程結束,清除發(fā)送/接收緩沖
區和關(guān)閉設備句柄。 
void CloseSynComm() 
{  
if(!bOpen) return; 
//結束事件監視線(xiàn)程 
 bOpen=FALSE;  
 SetCommMask(hComDev,0);  
 //取消事件監視,此時(shí)監視線(xiàn)程中的WaitCommEvent將返回 
 WaitForSingleObject(hEvent,INFINITE); 
 //等待監視線(xiàn)程結束 
 CloseHandle(hEvent); //關(guān)閉事件句柄 
 //停止發(fā)送和接收數據,并清除發(fā)送和接收緩沖區 
PurgeComm(hComDev,PURGETXABORT| 
PURGERXABORT|PURGETXCLEAR| 
PURGERXCLEAR); 
//關(guān)閉設備句柄 
 CloseHandle(hComDev);  

小 結 
        以上給出了用Win32 API 設計串行通信的基本思路,對這個(gè)同步I/O操作的串
行通信程序稍加改造就可進(jìn)行異步I/O操作。在實(shí)際應用中,我們可以將這些串行通信
函數和成員變量加到一個(gè)已有的CWnd類(lèi)或其派生類(lèi)中來(lái)實(shí)現串行通信,也可設計一個(gè)新
的串行通信類(lèi)來(lái)包含這些成員函數和成員變量??傊?,利用Win32 API可以設計出滿(mǎn)足
各種需要的串行通信程序。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
用Windows API 實(shí)現串行通信
API串口通信
一種調用Win95 API實(shí)現串行通信的查詢(xún)方法
用API函數實(shí)現串行通訊
CMScomm中的函數則么用?CMScomm的介紹太少
串口編程入門(mén)
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久