工控機(jī)系統(tǒng)串口通訊設(shè)計(jì)技術(shù)要點(diǎn)匯總:工控系統(tǒng)通常由工控儀器和計(jì)算機(jī)終端組成,工控儀器和計(jì)算機(jī)終端之間通過(guò)符合RS-232協(xié)議的串口通訊,計(jì)算終端可以通過(guò)雙方既定的數(shù)據(jù)協(xié)議,向工控儀器查詢(xún)狀態(tài)信號(hào)和發(fā)送控制信號(hào)。
一、硬件協(xié)議:定義了RS-232串口的電氣規(guī)范。
1)DTE/DCE:一般把工控儀器稱(chēng)為DCE,計(jì)算機(jī)終端稱(chēng)為DTE,設(shè)備之間通過(guò)RS-232電纜連接,DCE端采用母連接器(有槽),DTE端采用公連接器(有針)。但如果工控儀器和計(jì)算機(jī)終端都采用公連接器,則兩者都是DTE設(shè)備,它們之間的連接應(yīng)采用零調(diào)制解調(diào)器方式。 2)RS-232信號(hào):標(biāo)準(zhǔn)的RS-232管腳通常有D-25PIN和D-9PIN兩種類(lèi)型,常用的信號(hào)如下:信號(hào)分類(lèi) D-9PIN D-25PIN 信號(hào)名稱(chēng) 信號(hào)縮寫(xiě) 信號(hào)方向 數(shù)據(jù)信號(hào) 3 2 數(shù)據(jù)傳輸 TD DTE->DCE 2 3 接收數(shù)據(jù) RD DTE<-DCE 控制信號(hào) 7 4 請(qǐng)求發(fā)送 RTS DTE<-DCE 8 5 清除發(fā)送 CTS DTE<-DCE 6 6 數(shù)據(jù)發(fā)送就緒 DSR DTE<-DCE 1 8 載波檢測(cè) CD DTE<-DCE 4 20 數(shù)據(jù)終端就緒 DTR DTE->DCE 9 22 振鈴指示 RI DTE<-DCE 接地信號(hào) 5 7 接地信號(hào) GND
3)零調(diào)制解調(diào)連接(ZERO MODEM): ZERO MODEM處理DTE和DTE設(shè)備的對(duì)稱(chēng)連接,其連接原理為,一方的傳送數(shù)據(jù)信號(hào)為另一方的接收數(shù)據(jù)信號(hào),一方的控制請(qǐng)求信號(hào)為另一方的控制應(yīng)答信號(hào),接地信號(hào)互連。連接示意如下:信號(hào)分類(lèi) DTE DTE 數(shù)據(jù)信號(hào) TD-- RD RD-- TD 控制信號(hào) RTS-- CTS CTS-- RTS (DSR-DCD-RI)-- DTR DTR-- (DSR-DCD-RI ) 接地信號(hào) GND-- GND
二、軟件協(xié)議:定義了DTE的串口配置,DTE和DCE之間連接協(xié)議和數(shù)據(jù)傳輸協(xié)議。
1)串口參數(shù)配置: 波特率(BaudRate):在CBR_110到CBR_256000之間指定,參照儀器指定 數(shù)據(jù)位(ByteSize):每個(gè)字節(jié)的位數(shù),一般用7或8,默認(rèn)為8 停止位(StopBits):停止位的位數(shù),一般有:ONESTOPBIT、TOWSTOPBITS、ONE5STOPBITS,默認(rèn)為ONESTOPBIT 奇偶校驗(yàn)(Parity): 定義了奇偶校驗(yàn)的模式,一般有:NO_PARITY、EVEN_PARITY、ODD_PARITY,默認(rèn)NO_PARITY 流量控制(FlowCtrl):定義了流量控制方式,一般有:無(wú)控制、硬件方式、XON/XOFF方式,詳見(jiàn)握手協(xié)議。
2)握手協(xié)議:常見(jiàn)有硬件方式RTS/CTS和DTR/DSR方式,軟件方式有XON/XOFF和自定義的方式。 RTS/CTS:對(duì)于DTE來(lái)說(shuō),設(shè)置OutCtsFlow則CTS低水平位時(shí)停止輸出,直至高水平位時(shí)恢復(fù)輸出。設(shè)置RtsControl為HANDSHAKE則當(dāng)輸入緩沖區(qū)數(shù)據(jù)小于1/4時(shí),DTE將RTS置為高水平位,通知DCE可以傳輸數(shù)據(jù),當(dāng)輸入緩沖區(qū)數(shù)據(jù)大于3/4時(shí),DTE將RTS置為低水平位,通知DCE停止傳輸數(shù)據(jù)。DTE(計(jì)算機(jī))的緩沖區(qū)較大,通常都將RtsControl設(shè)置位ENABLE,即保持高水平位。 DTR/DSR:對(duì)于DTE來(lái)說(shuō),設(shè)置OutDsrFlow則DSR低水平位時(shí)停止輸出,直至高水平位時(shí)恢復(fù)輸出。設(shè)置DtrControl為HANDSHAKE則當(dāng)DTR設(shè)置為高水平位時(shí)容許數(shù)據(jù)輸入,當(dāng)DTR為低水平位時(shí)阻止數(shù)據(jù)輸入。DTE(計(jì)算機(jī))的緩沖區(qū)較大,通常都將DtrControl設(shè)置位ENABLE,即保持高水平位。 XON/XOFF:對(duì)于DTE來(lái)說(shuō),設(shè)置OutX時(shí),輸出流在DTE收到XoffChar時(shí)停止,在收到XonChar時(shí)恢復(fù)。設(shè)置InX時(shí),輸入流在緩沖區(qū)空閑不足XoffLim時(shí)DTE發(fā)送XoffChar,通知DCE中止傳輸數(shù)據(jù)。當(dāng)輸入流達(dá)到緩沖區(qū)空閑超過(guò)XonLim時(shí),DTE發(fā)送XonChar,通知DCE恢復(fù)傳輸數(shù)據(jù)。
三、編程模式: 在WIN32環(huán)境中,串口作為文件訪(fǎng)問(wèn),但與其他文件不同,串口文件的操作是采用阻塞方式的,讀寫(xiě)動(dòng)作通常會(huì)在后臺(tái)阻塞,用戶(hù)可以通過(guò)響應(yīng)串口事件,獲知端口狀態(tài)和控制讀寫(xiě)動(dòng)作。因此在WIN32環(huán)境中處理串口,應(yīng)采用重疊I/0機(jī)制訪(fǎng)問(wèn)串口文件和在線(xiàn)程中完成讀寫(xiě)操作,這樣意味著當(dāng)讀寫(xiě)線(xiàn)程阻塞時(shí),不會(huì)使主線(xiàn)程鎖定而失去響應(yīng)。
1、串口文件操作方式:根據(jù)如上要求,串口一般采用獨(dú)占和重疊方式打開(kāi),如:CreateFile(_T("\\\\.\\COM1"),/*端口名稱(chēng)*/ GENERIC_READ|GENERIC_WRITE,/*文件可讀寫(xiě)*/ 0,/*獨(dú)占方式*/ NULL,/*無(wú)權(quán)限屬性*/ OPEN_EXISTING,/*端口必須存在*/ FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,/*重疊的操作方式*/ NULL/*不支持臨時(shí)文件*/)。有效的串口文件打開(kāi)后,可以進(jìn)行重疊的讀寫(xiě)操作,其中要使用一個(gè)重疊操作結(jié)構(gòu)OVERLAPPED: struct { DWORD Internal; /*內(nèi)部使用*/ DWORD InternalHigh; /*內(nèi)部使用*/ DWORD Offset; /*操作開(kāi)始的文件位置(低位),串口文件不支持*/ DWORD OffsetHigh;/* 操作開(kāi)始的文件位置(高位),串口文件不支持*/ HANDLE hEvent; /*異步事件句柄,重疊操作完成或中斷時(shí)被激發(fā)*/ } OVERLAPPED; 寫(xiě)串口的方式如下: WriteFile(hCom,/*串口文件句柄*/ (void*)data,/*數(shù)據(jù)指針*/ dwDataBytes,/*請(qǐng)求寫(xiě)的數(shù)據(jù)字節(jié)數(shù)*/ &dwOperaBytes,/*函數(shù)返回的已寫(xiě)的字節(jié)數(shù),在重疊I/O中通常返回0*/ &ov/*重疊操作結(jié)構(gòu)指針*/); 讀串口的方式如下: ReadFile(hCom,/*串口文件句柄*/ (void*)buf,/*緩沖區(qū)指針*/ dwDataBytes,/*請(qǐng)求讀的數(shù)據(jù)字節(jié)數(shù)*/ &dwOperaBytes,/*函數(shù)返回的已讀的字節(jié)數(shù),在重疊I/O中通常返回0*/ &ov/*重疊操作結(jié)構(gòu)指針*/); 重疊方式調(diào)用讀寫(xiě)函數(shù)后即返回,程序稍后調(diào)用等待事件函數(shù)進(jìn)入阻塞狀態(tài),直至異步事件被激發(fā),調(diào)用方式如下: WaitForSingleObject(hEvent,/*OVERLAPPED中異步事件句柄*/ dwTimeouts/*讀寫(xiě)超時(shí)毫秒數(shù)*/) 讀寫(xiě)超時(shí)設(shè)置可以由串口配置超時(shí)參數(shù)COMMTIMEOUTS獲得,讀超時(shí)數(shù) =ReadTotalTimeoutMultiplier * 讀字節(jié)數(shù) + ReadTotalTimeoutConstant; 寫(xiě)超時(shí)數(shù) =WriteTotalTimeoutMultiplier * 寫(xiě)字節(jié)數(shù) + WriteTotalTimeoutConstant; 異步事件返回后,可以調(diào)用重疊I/O查詢(xún)函數(shù)查看后臺(tái)讀寫(xiě)狀況: GetOverlappedResult(hCom, /*端口文件句柄*/ &ov, /*重疊結(jié)構(gòu)指針*/ &dwOperaBytes, /*重疊操作完成的字節(jié)數(shù)*/ FALSE/*是否需要等待重疊操作完成*/); 以上時(shí)串口文件的操作方式,需要注意的是,這些操作除了打開(kāi)文件外,其他都應(yīng)當(dāng)在某個(gè)讀寫(xiě)線(xiàn)程中調(diào)用,讓線(xiàn)程在后臺(tái)阻塞,主線(xiàn)程保持響應(yīng)。
2、端口事件偵聽(tīng):WIN32提供串口事件查詢(xún)函數(shù)用以查看端口觸發(fā)的事件,端口可偵聽(tīng)事件一般有: EV_BREAK :端口中斷信號(hào) EV_CTS :CTS信號(hào)改變 EV_DSR :DSR信號(hào)改變 EV_RXCHAR :收到一個(gè)或多個(gè)字符 EV_RXFLAG :收到特殊字符 EV_ERR :端口錯(cuò)誤信號(hào) EV_TXEMPTY:輸出緩沖區(qū)數(shù)據(jù)發(fā)送完成可以通過(guò)SetCommMask(hCom/*端口文件句柄*/,dwMask/*事件組合*/)來(lái)設(shè)置需要偵聽(tīng)的事件,然后應(yīng)采用重疊模式調(diào)用查詢(xún)事件函數(shù):WaitCommEvent;
更多工控機(jī)產(chǎn)品資訊、新工控機(jī)行業(yè)新聞、如何挑選嵌入式工控機(jī)等知識(shí)歡迎訪(fǎng)問(wèn)網(wǎng)站相關(guān)板塊內(nèi)容。
企業(yè)分站 在線(xiàn)客服 : 服務(wù)熱線(xiàn): 025-86136252 / 15062244194 電子郵箱: [email protected]
公司地址:江蘇省南京市江寧區(qū)未來(lái)科技城
研維信息是一家集研發(fā)、生產(chǎn)、銷(xiāo)售為一體的工控機(jī)、嵌入式安裝工業(yè)平板電腦、加固手持平板電腦、加固類(lèi)三防計(jì)算機(jī)的專(zhuān)業(yè)設(shè)備提供商,提供各種尺寸和規(guī)格的安裝式工業(yè)平板電腦,手持三防平板電腦,加固三防計(jì)算機(jī)。核心研發(fā)及市場(chǎng)團(tuán)隊(duì)均有10余年的相關(guān)行業(yè)背景,尤其是公司的ODM團(tuán)隊(duì),可以為客戶(hù)提供快速、質(zhì)優(yōu)、靈活的客戶(hù)定制化產(chǎn)品OEM及ODM服務(wù),公司對(duì)員工及客戶(hù),都一直秉承合作共贏、以德為先的經(jīng)營(yíng)宗旨,為客戶(hù)提供優(yōu)質(zhì)產(chǎn)品及服務(wù),提升客戶(hù)價(jià)值。