久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3122|回復: 0
打印 上一主題 下一主題
收起左側

串口通信的函數

[復制鏈接]
跳轉到指定樓層
樓主
ID:60266 發(fā)表于 2014-8-18 02:07 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
用于串口通信的函數和結構在Winbase.h頭文件中定義。     函數 描述     CreateFile 打開串行口     GetCommState 用指定通信設備的當前控制設置填充設備控制塊(DCB結構)     SetCommState 按照DCB結構的說明配置通信設備。這個函數重新初始化所有硬件     和控制設備,但不清空I/O隊列     GetCommTimeouts 獲得指定通信設備上所有讀/寫操作的超時參數     SetCommTimeouts 設置指定通信設備上所有讀/寫操作的超時參數     WriteFile 向串行口寫數據,這樣將把數據傳送給串行連接另一端的設備     ReadFile 從串行口讀數據,這樣將從串行連接另一端的設備接收數據     SetCommMask 指定為通信設備監(jiān)視的一組事件     GetCommMask 獲得指定通信設備的事件掩碼值     WaitCommEvent 等待指定通信設備的事件的發(fā)生。WaitCommEvent函數監(jiān)視的事件     包含在與設備句柄相關聯(lián)的事件掩碼中     EscapeCommFunction 指導指定通信設備執(zhí)行擴展功能。通常用于將串行口設置為IR模式     ClearCommBreak 恢復指定通信設備的字符傳輸,并設置傳輸線路為不可中斷狀態(tài)     ClearCommError 獲得通信錯誤數據,并報告指定通信設備的當前狀態(tài)        BuildCommDCB( "COM2:19200,n,8,1 ",   &dcb);函數  打開端口             CreateFile函數用于打開串行口,因為硬件供應商和設備驅動程序開發(fā)者可以隨意命名端口,所以應用程序應該列出所有可用端口,從而使用戶能夠指定要打開的端口。如果端口不存在,則CreateFile函數返回ERROR_FILE_NOT_FOUND,而且應該通知用戶端口不可用。     打開串行口     1         在第一個參數lpzPortName指向的通信口后插入一個冒號。例如,指定“COM1:”為通信端口。     2         指定dwShareMode參數為0。通信端口不能像文件一樣被共享。     3         在dwCreationDisposition參數中指定OPEN_EXISTING。這個標志是必須的。     4         指定dwFlagsAndAttributes參數為0。Windows   CE只支持非重疊I/0.     下面的代碼段說明了如何打開串行通信端口。     hPort=CreateFile(lpszPortName, //指出通信端口     GENERIC_READ|GENERIC_WRITE, //讀寫模式     0, //共享模式     NULL, //安全屬性     OPEN_EXISTING, //如何打開服務端口     0, //端口屬性     NULL); //端口屬性句柄的拷貝     配置串行口             打開串行口后,一般情況下,應用程序需要改變缺省設置。用GetCommState函數可以獲得缺省設置,用SetCommState函數可以設置新的端口設置。             另外,端口配置還包括用COMMTIMEOUTS結構設置讀/寫操作的超時值。當發(fā)生超時時,ReadFile或WriteFile函數返回成功傳輸的具體字符數。     配置串行口     DCB   PortDCB;     PortDCB.DCBlength=sizeof(DCB);     GetCommState(hPort,&PortDCB);         PortDCB.BaudRate=9600; //波特率     PortDCB.fBinary=TRUE; //只支持二進制串行傳輸模式     PortDCB.fParity=TRUE; //啟用奇偶校驗     PortDCB.fOutxCtsFlow=FALSE; //TRUE是由CTS線來控制端口的輸出     PortDCB.fOutxDsrFlow=FALSE; //TRUE是由DSR線來控制端口的輸出     PortDCB.fDtrControl=DTR_CONTROL_ENABLE; //DTR_CONTROL_DISABLE:     禁用DTR(Data   Terminal   Ready)線并保持此狀態(tài);         DTR_CONTROL_ENABLE;     啟用DTR(Data   Terminal   Ready)線         DTR_CONTROL_HANDSHAKE     根據接收緩沖區(qū)數據的數量告訴串行驅動程序切換DTR線狀態(tài)     PortDCB.fDsrSensitivity=FALSE; //TRUE為端口將忽略任何輸入的字節(jié),除非端口DSR線被啟用     PortDCB.fTXContinueOnXoff=TRUE; //TRUE為如接收緩沖區(qū)已滿且驅動程序已傳送XOFF字符,     將使驅動程序停止傳輸字符     PortDCB.fOutX=FALSE; //TRUE為指定XON/XOFF控制被用于控制串行輸出     PortDCB.fInX=FALSE; //TRUE為指定XON/XOFF控制由輸入串行流使用     PortDCB.fErrorChar=FALSE; //Windows   CE串行驅動程序默認忽略該字段     PortDCB.fNull=FALSE; //TRUE為使串行驅動程序忽略接收到的空字節(jié)     PortDCB.fRtsControl=RTS_CONTROL_ENABLE; //RTS_CONTROL_DISABLE表示當端口打開時RTS(Request   and   Send)行     將禁用     //RTS_CONTROL_ENABLE表示當端口打開時RTS行將啟用     //RTS_CONTROL_HANDSHAKE表示RTS線由驅動程序控制,輸入緩沖區(qū)     不到半滿,則RTS線將被啟用,否則將被禁用     //RTS_CONTROL_TOGGLE表示如果在輸出緩沖區(qū)有字節(jié)要被傳輸,則     驅動程序將啟用RTS線,否則將禁用該線     PortDCB.fAbortOnError=FALSE; //出現(xiàn)讀/寫錯誤并不終止     PortDCB.ByteSize=8; //指定每字節(jié)的位數     PortDCB.Parity=NOPARITY; //奇偶字段,EVENPARITY、MARKPARITY、NOPARITY、ODDPARITY、SPACERITY     PortDCB.StopBits=ONESTOPBIT; //停止位,每字節(jié)一位(ONESTOPBIT)、一位半(ONE5STOPBITS)、     兩位(TWOSTOPBITS)。     if(!SetCommState(hPort,&PortDCB))     {     MessageBox(hMainWnd,TEXT("Unable   to   configure   the   serial   port"),TEXT("Error"),MB_OK);     dwError=GetLastError();     return   FALSE;     }         配置超時值             每次打開通信端口時應用程序都必須用COMMTIMEOUTS結構設置通信超時值。如果不配置這個結構,則端口使用驅動程序提供的缺省超時值,或者使用上一個通信應用程序的超時值。通過假定特殊的與實際設置不同的超時設置,應用程序可以執(zhí)行永遠不能完成的讀/寫操作,或者執(zhí)行完成過于頻繁的讀/寫操作。             當讀/寫操作發(fā)生超時時,操作結束。而且ReadFile和WriteFile函數并不返回錯誤值。若想確定某個操作是否發(fā)生了超時,可以驗證實際傳輸的字節(jié)數是否小于請求的字節(jié)數。例如,如果ReadFile函數返回TRUE,但讀的字節(jié)數小于請求的字節(jié)數,則這個操作發(fā)生了超時。     配置串行口的超時值     1         調用GetCommTimeouts函數或者手工設置成員來初始化COMMTIMEOUTS結構。     2         用ReadIntervalTimeout成員指定在不發(fā)生超時的情況下兩個字符間允許經過的最大毫秒數。     3         用ReadTotalTimeoutMultiplier成員指定讀超時乘子。對于每個讀操作,這個乘子被乘以讀操作期望接收到的字節(jié)數。     4         用ReadTotalTimeoutConstant成員指定讀超時常數。這個成員表示的毫秒數被加到讀取的總字節(jié)數與           ReadTotalTimeoutMultiplier的乘積上。最后得到的結果是讀操作發(fā)生超時前必須經過的毫秒數。     5         用WriteTotalTimeoutMultiplier成員指定寫超時乘子。對于每個寫操作,這個乘子被乘以寫操作期望接收的字節(jié)數。     6         用WriteTotalTimeoutConstant成員指定寫超時常數。這個成員表示的毫秒數被加到總字節(jié)數與WriteTotalTimeoutMultiplier的                 乘積上。最后得到的結果是寫操作發(fā)生超時前必須經過的毫秒數。     7         調用SetCommTimeouts函數激活端口超時設置。             為了有助于多任務處理,通常需要配置COMMTIMEOUTS結構,以便ReadFile函數能夠立即返回讀到的字符。要做到這一點,可以設置ReadIntervalTimeout為MAXWORD,設置ReadTotalTimeoutMultiplier和ReadTotalTimeoutMultiplier為0。         寫串行口             WriteFile函數通過串行連接向另一臺設備傳輸數據。調用這個函數之前,應用程序必須打開和配置串行口。             因為Windows   CE不支持重疊I/O(也稱為異步I/O),所以主線程或者任何創(chuàng)建窗口的線程都不應該試圖向串行口寫大量數據。這樣的線程將被阻塞,因而不能管理消息隊列。應用程序可以通過創(chuàng)建多個線程處理讀/寫操作以模擬重疊I/O。為了協(xié)調多個線程,應用程序可以調用WaitCommEvent函數阻塞線程,直至發(fā)生特定的通信事件。     寫串行口     1         用CreateFile函數返回的句柄。     2         用lpBuffer參數指定要寫的數據的指針。這一數據通常是二進制數據或者字符數據。     3         用nNumberOfBytesToWrite參數指定要寫的字符數。對于基于Windows   CE的設備,通常寫一個字符,因為應用程序必須將Unicode           字符轉換為ASCII字符,以便將文本傳輸到串行連接另一端的設備。     4         用lpNumberOfBytesWritten參數指定實際寫的字節(jié)數的指針。WriteFile函數填充這個變量,以便應用程序能夠確定數據是否已           被傳輸。     5         lpOverlapped參數必須是NULL。     讀串行口             ReadFile函數從串行連接另一端的設備獲取數據。參數與WriteFile相同。             通常情況下,讀操作是一個獨立的線程,他總是隨時準備處理到達串行口的數據。通信事件通知讀線程串行口有數據可讀。讀線程通常一次讀一個字節(jié)(每讀一個字節(jié)調用一次ReadFile函數),直至讀完所有數據,然后讀線程等待下一個通信事件。                 使用通信事件             通信事件是當發(fā)生重要事件時Windows   CE向應用程序發(fā)送的通知:應用程序可以用WaitCommEvent函數阻塞線程,直至特定事件發(fā)生;用SetCommMask函數可以指定繼續(xù)處理前必須發(fā)生的事件。如果指定了多個事件,則任何一個指定事件的發(fā)生將導致WaitCommEvent函數返回。             例如,這種機制使應用程序能夠知道數據何時到達串行口。通過等待表示數據到達的通信事件,應用程序可以避免因調用ReadFile函數等待數據到達而阻塞串行口。只有當有數據可讀時才應該調用ReadFile函數。     事件 描述     EV_BREAK 輸入中發(fā)生中斷     EV_CTS CTS信號狀態(tài)發(fā)生變化     EV_DSR DSR信號狀態(tài)發(fā)生變化     EV_ERR 發(fā)生線路狀態(tài)錯誤,線路狀態(tài)錯誤包括CE_FRAME,CE_OVERRUN和CE_RXPARITY     EV_RING 檢測到振鈴指示     EV_RLSD 接收線路信號檢測的信號狀態(tài)發(fā)生變化     EV_RXCHAR 接收到字符,并置于輸入緩沖區(qū)中     EV_RXFLAG 接收到事件字符,并置于輸入緩沖區(qū)中     EV_TXEMPTY 輸出緩沖區(qū)中的最后一個字符已被發(fā)送         使用通信事件     1         調用SetCommMask函數指定要查找的事件。     2         調用WaitCommEvent函數,并指定導致這個函數返回的事件。當應用程序指定多個事件時,lpEvtMask參數指向表示導致           WaitCommEvent函數返回的事件的變量。     3         WaitCommEvent函數返回后,循環(huán)調用ReadFile函數,直至讀完所有接收到的數據。     4         再次調用SetCommMask函數,指定要查找的事件。     SetCommMask函數通常是應用程序在監(jiān)視串行口和讀數據的循環(huán)中第一個調用的函數。下面的代碼說明了如何將通信事件用于這個目的。     BYTE   Byte;     DWORD   dwBytesTransferred;         SetCommMask(hPort,EV_RXCHAR|EV_CTS|EV_DSR|EV_RLSD|EV_RING);     while(hPort!=INVALID_HANDLE_VALUE)     {     WaitCommEvent(hPort,&dwCommModemStatus,0);     SetCommMask(hPort,EV_RXCHAR|EV_CTS|EV_DSR|EV_RING);     if(dwCommModemStatus   &   EV_RXCHAR)     {     do     {     ReadFile(hPort,&Byte,1,&dwBytesTransferred,0);     if(dwBytesTransferred==1)     ProcessChar(Byte);     }while(dwBytesTransferred==1);     }     }         最后關閉串行口     CloseHandle(hPort);
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品国产精品三级精品av网址 | 神马久久久久久久久久 | 欧美一区二区三区 | 日韩中文字幕视频 | 性一交一乱一伦视频免费观看 | 亚洲三区在线观看 | 操夜夜| 美国黄色毛片 | 国产欧美一区二区精品忘忧草 | 国产午夜精品福利 | 日韩区| 中文字幕在线二区 | 91精品国产综合久久久久久蜜臀 | 午夜精品一区二区三区在线观看 | 午夜电影网 | 亚洲精品视频在线看 | 激情毛片 | 天天人人精品 | 免费h在线 | 成人国产在线观看 | 国产日韩一区二区 | 国产欧美一区二区三区日本久久久 | 黄色在线免费观看视频网站 | 伊人久久国产 | 天天久久| 91看片免费 | 无码日韩精品一区二区免费 | 99亚洲精品 | 久久精品一区二区视频 | 黄网站色大毛片 | 精品欧美一区二区精品久久 | 久久久久久久一区二区 | 亚洲一区二区三区免费视频 | 日本精品裸体写真集在线观看 | 日韩精品一区二区三区久久 | 特级毛片爽www免费版 | 欧美精品在线一区二区三区 | 久久久妇女国产精品影视 | 亚洲精品中文在线观看 | 亚洲国产精品一区二区第一页 | 欧美日韩国产精品一区 |