Delphi串口通信編程.ppt_第1頁
Delphi串口通信編程.ppt_第2頁
Delphi串口通信編程.ppt_第3頁
Delphi串口通信編程.ppt_第4頁
Delphi串口通信編程.ppt_第5頁
已閱讀5頁,還剩90頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、Delphi串口通信編程,魏贇,第一章 基本概念,通信 串行通信 硬件基礎(chǔ)知識 模式及流量 接線和錯誤預(yù)防 錯誤排除,1、通信,通信:不同的獨(dú)立系統(tǒng)通過線路互相交換數(shù)據(jù) 數(shù)據(jù)通信:終端與計(jì)算機(jī)之間的通信或計(jì)算機(jī)與計(jì)算機(jī)之間的通信 網(wǎng)絡(luò):構(gòu)成整個通信的線路 數(shù)據(jù)傳送 通信的類型 字符傳輸,數(shù)據(jù)傳送,完整的通信系統(tǒng)包括發(fā)送端、接收端、轉(zhuǎn)換數(shù)據(jù) 的接口以及傳送數(shù)據(jù)的實(shí)際信道或媒體 DTE(Data Terminal Equipment):發(fā)送與接收的節(jié)點(diǎn) DSE(Data Switching Equipment):中間節(jié)點(diǎn),負(fù)責(zé)數(shù)據(jù)轉(zhuǎn)送工作 DCE(Data Communication Equipm

2、ent ):負(fù)責(zé)數(shù)據(jù)與電氣信號轉(zhuǎn)換的設(shè)備 DTE與DCE間的數(shù)據(jù)傳輸線路通常使用RS-232 DTE與DSE間的媒體則包括了雙絞線、同軸電纜、光纖或無線電等,傳送的方式,并行傳送(Parallel ):一次的傳輸量為8個位(1字節(jié)) 通過并行端口,如打印機(jī) 串行傳送(Serial ):一次只傳輸1個位 通過串行端口,如RS-232,通信的種類,將數(shù)據(jù)轉(zhuǎn)換成串行通信有兩種方式 同步方式:接收設(shè)備能自動與發(fā)送計(jì)算機(jī)同步,接收字符有規(guī)則的分割開來,以塊為單位,沒有起始位和停止位,效率高。 異步方式:以字符為傳送單位,傳送的字符之間有無規(guī)律的間隔,這樣可能使接收設(shè)備不能正常接收數(shù)據(jù),因?yàn)槊拷邮胀暌粋€字

3、符都不能確切地知道下一個接收的字符從何時開始。(通過加開始位和停止位實(shí)現(xiàn))傳輸效率低,成本也低。,字符傳輸,位和字節(jié) 文本編碼 非文本編碼 幀,位和字節(jié),二進(jìn)制中的每一位0和1,被叫做一個位 每8個位構(gòu)成一個字節(jié) 一個字節(jié)中最右面的位被稱為第0位,最左面的位被稱為第7位。,文本編碼,文本(字符字母、標(biāo)點(diǎn)符號等)在計(jì)算機(jī)中存儲時,每個不同的字符都用不同的數(shù)值來表示。這些數(shù)值的范圍通常在0-127或0-255范圍。 7位:ASCII碼,每個字節(jié)留一個備用位 8位:前128個遵循ASCII碼規(guī)則,其余的128個用來做擴(kuò)展字符、數(shù)字符號、圖形字符等編碼。,非文本編碼,某些可執(zhí)行指令文件和圖形圖像文件就

4、是 以二進(jìn)制形式而不是ASCII碼形式存儲的。 一個數(shù)據(jù)可用二進(jìn)制形式存儲,可以占多 個字節(jié)。 在通信領(lǐng)域,常常把這種類型的資料叫做 二進(jìn)制數(shù)據(jù)。,幀,幀:在串行異步通信情況下,構(gòu)成一個字節(jié)的那些數(shù)據(jù)單元被稱為數(shù)據(jù)位,在數(shù)據(jù)位的前、后要加上起始位、停止位和奇偶校驗(yàn)位。 一個字符所使用的位數(shù)根據(jù)協(xié)議而不同。 稱這些位數(shù)為字符位數(shù)據(jù)長或字長。 通常不是8位就是7位。,2、串行通信,RS-232串行通信 RS-485串行通信 USB接口 IEEE-1394,RS-232串行通信,RS-232的通信端口是每臺計(jì)算機(jī)上的必要配置, 通常含有COM!和COM2兩個端口。 計(jì)算機(jī)上的RS-232均是公頭 一

5、般有兩種:9引腳和25引腳,RS-485串行通信,RS-485的通信方式可有效地防止噪聲信號的干擾。 RS-485的信號將被發(fā)送出去時會先分成正負(fù)的兩條線路,當(dāng)?shù)竭_(dá)接收端后,再將信號相減還原來原來的信號;如果將原始的信號記為(DT),而被分成后的信號分別記為(D+)及(D-),則原始的信號與離散的信號在由發(fā)送端發(fā)送出去時: (DT)= (D+)- (D-) 如果此線路受干擾,則兩條傳輸線上的信號會分別成為(D+)+Noise及(D-)+Noise (DT)= (D+) +Noise- (D-) +Noise = (D+)- (D-),USB(Universal Serial Bus)接口,集成

6、一般計(jì)算機(jī)所使用的外圍設(shè)備的連接方式, 而且其所采用的信號傳輸方式也是串行通信。 USB特性:低價位,熱連接,單一的連接頭方式,連接數(shù)多,線上供電,不占系統(tǒng)資源,錯誤檢測與復(fù)原,節(jié)省能源,支持四種傳輸(巨量、實(shí)時、中斷及控制4種傳輸模式),速度較快(12M bps/RS-232最快115bps),IEEE-1394,IEEE-1394(也稱FireWire,火線)與USB一樣擁有即插即用的功能,也是用于解決計(jì)算機(jī)與外圍設(shè)備復(fù)雜的連接問題,并且也是使用串行通信的傳輸方式。 IEEE-1394的傳輸速度是400Mbps,而且速度還向1000Mbps邁進(jìn),USB與IEEE-1394的比較,比較項(xiàng)目

7、USB IEEE-1394 應(yīng)用 低速設(shè)備 高速設(shè)備 帶寬( Mbps) 1.5,12 100,200,400 電纜長度 5米 4.5米 電纜 4線 6線 即插即用 支持 支持,3、硬件基礎(chǔ)知識,PC機(jī)的RS-232接口名稱尚未統(tǒng)一,有多個名稱:RS-232口、串口、通信口、COM口、異步口等。,1,2,3,4,5,6,7,8,9,常用的9條RS-232信號線,一次應(yīng)答呼叫過程,Modem從接收到振鈴信號開始,到數(shù)據(jù)傳輸結(jié)束Modem和DTE恢復(fù)到原來的空閑狀態(tài)為止的過程。,數(shù)據(jù)終端DTE的控制軟件持續(xù)監(jiān)視振鈴指示RI,等待該 信號有效 響鈴后, RI信號在ON和OFF狀態(tài)之間交替變化。 DT

8、E的通信控制軟件在檢測到振鈴指示后,開始通過計(jì) 算機(jī)振鈴指示的ON和OFF狀態(tài)的變化次數(shù)來進(jìn)行計(jì)數(shù)。 當(dāng)達(dá)到程序設(shè)計(jì)的次數(shù)時,控制軟件發(fā)出終端就緒信號 (DTR)有效,使Modem進(jìn)行摘機(jī)狀態(tài),開始應(yīng)答電話 Modem在等待一小段時間后,自動地發(fā)送它的應(yīng)答載波 信號。同時Modem發(fā)出數(shù)據(jù)設(shè)備就緒信號(DSR),通 知DTE已經(jīng)完成所有準(zhǔn)備工作,正在等待對方的載波信 號,在DTE發(fā)出數(shù)據(jù)終端就緒信號(DTR)期間,DTE的控制軟件監(jiān)視數(shù)據(jù)設(shè)備就緒信號(DSR)是否有效,當(dāng)DSR為ON狀態(tài)后,DTE便知道Modem已準(zhǔn)備建立數(shù)據(jù)鏈路,于是DTE開始檢測載波信號(DCD),以檢查數(shù)據(jù)鏈路是否已經(jīng)建

9、立 當(dāng)主叫Modem的載波信號出現(xiàn)在電話線上時,被叫Modem發(fā)出載波信號(DCD),以檢查數(shù)據(jù)鏈路是否已經(jīng)建立 在數(shù)據(jù)鏈路連接期間,發(fā)送數(shù)據(jù)(TxD)和接收數(shù)據(jù)(RxD)線上即開始了全又工通信。同時,DTE仍監(jiān)視載波信號(DCD),以確定數(shù)據(jù)鏈路是否連接 數(shù)據(jù)傳輸結(jié)束后,DTE使數(shù)據(jù)終端就緒信號(DTR)無效, Modem撤消載波檢測(DCD),并且使設(shè)備數(shù)據(jù)就緒信號(DSR)信號無效。數(shù)據(jù)候鏈路釋放后, Modem和DTE返回到初始狀態(tài)。,通信參數(shù),數(shù)據(jù)的傳送速度 數(shù)據(jù)的傳送單位,數(shù)據(jù)的傳送速度,波特率:每秒所能產(chǎn)生的最大電壓狀態(tài)改變率(一秒鐘可以振蕩的次數(shù))bps 通信雙方必須要取得一樣

10、的通信速度。原始信號經(jīng)過不一樣的波特率取樣后,所得的結(jié)果完全不一樣,如取樣速度只有原來一半時,信號被跳著取樣,數(shù)據(jù)因此錯誤。,數(shù)據(jù)的傳送單位,一般串行通信端口所傳送的數(shù)據(jù)是字符類型,若用來傳輸文件,則會使用二進(jìn)制的數(shù)據(jù)類型。,起始位及停止位,異步串行傳輸時需要 當(dāng)發(fā)送端要開始傳送數(shù)據(jù)時,便將傳輸線上的電壓由低電位提升至高電位,而當(dāng)傳送結(jié)束后,再將電壓降至低電壓。接收端會因起始位的觸發(fā)(因電壓由低電位升至高電位)而開始接收數(shù)據(jù);并因停止位的通知(因電壓維持在低電位)而確節(jié)知道數(shù)據(jù)的字符已經(jīng)結(jié)束。,校驗(yàn)位的檢查,用來檢查所傳送數(shù)據(jù)正確性的一種核對碼,其中又分成奇校驗(yàn)(Odd)及偶校驗(yàn)(Even)

11、串行通信上的字符數(shù)據(jù)格式 起始位+傳送字符+校驗(yàn)位+停止位,4、模式及流量,工作模式 硬件握手 軟件握手,工作模式,當(dāng)計(jì)算機(jī)在進(jìn)行數(shù)據(jù)的傳送與接收時,傳輸線上的數(shù)據(jù) 流動情況可分為3種: 單工:傳輸線上的數(shù)據(jù)流動只有一個方向 半雙工:數(shù)據(jù)流動是雙向,但同一時間只能一個方向行進(jìn) 全雙工:傳輸線同時具有兩個方向的傳輸能力 RS-485屬于半雙工,RS-232屬于全雙工(引腳在設(shè)計(jì)時就是接收與傳送是分屬兩個不同的引腳與線路。),串行數(shù)據(jù)的流動方式,當(dāng)數(shù)據(jù)要由A設(shè)備傳送至B設(shè)備前,數(shù)據(jù)會 先被送到A設(shè)備的數(shù)據(jù)輸出緩沖區(qū),接著 再由此緩沖區(qū)將數(shù)據(jù)由RS-232線路傳送到 B設(shè)備;同樣地,當(dāng)數(shù)據(jù)通過硬件線

12、路傳送 到B設(shè)備時,數(shù)據(jù)首先會送到接收緩沖區(qū), 而設(shè)備B的CPU再到接收緩沖區(qū)將數(shù)據(jù)讀取 并進(jìn)行處理。,握手,握手信號:提供一種控制數(shù)據(jù)流的方法,即接收設(shè)備可以控制發(fā)送設(shè)備的數(shù)據(jù)發(fā)送。 如果接收設(shè)備速度比發(fā)送速度快,握手信號可以略去。 在異步串行通信中,這稱之為握手(handshaking)或流量控制(flow control)。 流量控制:保證傳輸雙方都能正確地傳送和接收數(shù)據(jù)而不會漏失。 握手控制可以具休分為硬件握手和軟件握手。,硬件握手,使用專門的握手電路去控制數(shù)據(jù)的傳輸。 當(dāng)接收設(shè)備準(zhǔn)備好之后,就通過專用的握手電路傳送一 個正電壓給發(fā)送設(shè)備,指示發(fā)送設(shè)備發(fā)送數(shù)據(jù)。如果接 收設(shè)備傳送一個負(fù)

13、電壓給發(fā)送設(shè)備,則指示發(fā)送設(shè)備停 止發(fā)送數(shù)據(jù)。 硬件握手用到DSR、CTS、DTR、RTS4條硬件線路,其中DTR、RTS指的是計(jì)算機(jī)上的RS-232端;而DSR、CTS則是指被控制的設(shè)備端。,計(jì)算機(jī)-設(shè)備,設(shè)備必須將相對于計(jì)算機(jī)上的DSR引腳降為低電壓 計(jì)算機(jī)檢測到DSR引腳為低電位后,暫停數(shù)據(jù)的傳輸;同時設(shè)備繼續(xù)處理位于緩沖區(qū)的數(shù)據(jù) 等設(shè)備的接收緩沖區(qū)數(shù)據(jù)量下降到一定程度后,設(shè)備將DSR引腳的標(biāo)準(zhǔn)電壓升高 計(jì)算機(jī)一檢測到DSR引腳為高電壓后,隨即繼續(xù)傳送數(shù)據(jù)給設(shè)備,設(shè)備-計(jì)算機(jī),計(jì)算機(jī)將DTR引腳降為低電壓 設(shè)備檢測到DTR引腳為低電壓后,暫停數(shù)據(jù)的傳輸;同時計(jì)算機(jī)也會繼續(xù)處理位于緩沖區(qū)的

14、數(shù)據(jù) 待計(jì)算機(jī)的接收緩沖區(qū)中數(shù)據(jù)量下降到一定程度后,計(jì)算機(jī)將DTR引腳的標(biāo)準(zhǔn)電壓升高 設(shè)備一檢測到DTR引腳為高電壓后,隨即繼續(xù)傳送數(shù)據(jù)給計(jì)算機(jī),軟件握手,以數(shù)據(jù)線上的數(shù)據(jù)信號來代替實(shí)際的硬件線路 最常見的是XON/XOFF協(xié)議: 若接收端欲使發(fā)送端暫停數(shù)據(jù)的傳送時,它便向發(fā)送端 送出ASCII第19號字符(十六進(jìn)制是13);而欲恢復(fù)傳送 時,便向發(fā)送端送出ASCII第17號字符(十六進(jìn)制是11), 兩個字符的交互使用,便可控制發(fā)送端的傳送操作了。 其操作流程與硬件握手類似。,5、接線和錯誤預(yù)防,接線方法 錯誤預(yù)防,接線方法,RS-232口特點(diǎn): 9引腳或25引腳 公頭(區(qū)別于打印機(jī)接頭),1

15、,2,3,4,5,6,7,8,9,5,4,3,2,1,9,8,7,6,計(jì)算機(jī)上為公頭,連線上為公頭,當(dāng)使用RS-232與Modem進(jìn)行連接時,直接連接即可 當(dāng)使用RS-232和其他的設(shè)備進(jìn)行連接時,有時就必須做必要的跳線,跳線,跳線的實(shí)際意義就是一個傳送的信號必須到達(dá)對方的接 收引腳,如此才能形成一個完整的通路。 跳線:欲將數(shù)據(jù)從一個地方傳送至另一個地方,其實(shí)只要使用第2引腳、第3引腳與第5引腳就可以形成一個最簡單的通信線路。實(shí)際制作:將RS-232線的一端接頭拆掉,將里面的第2引腳和第3引腳對調(diào)即可。 跳線的意義:甲方傳送的數(shù)據(jù)必定到乙方的接收信道;而乙方的傳送數(shù)據(jù)則會到達(dá)甲方的接收信道,雙

16、方的傳送與接收形成一個完整的回路。,錯誤預(yù)防,檢測數(shù)據(jù)在傳送過程中發(fā)生的錯誤 CheckSum:將所有要傳送字符的ASCII碼做加法運(yùn)算,計(jì)算其總和后將此數(shù)目與一數(shù)字(通常是255)做除法運(yùn)算,再取其余數(shù),將此余數(shù)組合成傳送字符串的一部分而傳送出去;同樣,接收方也以相同的方式對所傳送過來的字符串進(jìn)行運(yùn)算操作,以判斷數(shù)據(jù)的正確性,如果不對,則要求發(fā)送方重發(fā)。 CRC(yclic Redundancy Check Code循環(huán)冗余校驗(yàn)碼) 將欲傳輸?shù)臄?shù)據(jù)塊視為一堆連續(xù)位所構(gòu)成的一個整數(shù)值,并將此數(shù)值除一個特定的除數(shù)。,錯誤預(yù)防原理: 將所傳送的數(shù)值做相加的操作后與一個固定的除 數(shù)進(jìn)行除法運(yùn)算,所得

17、的余數(shù)即為校驗(yàn)碼。傳送 與接收的雙方只要針對其固定的檢查方法分別進(jìn) 行運(yùn)算,比較后只要雙方均一致,即正確;若不 一致,數(shù)據(jù)重傳。,6、錯誤排除,波特率失配 檢驗(yàn)錯誤 字長不匹配 停止位錯 幀錯,波特率失配,如果兩個設(shè)備的波特率設(shè)置不同,當(dāng)接收 設(shè)備試圖接受數(shù)據(jù)時,程序?qū)?bào)告校驗(yàn)錯 和幀錯。,校驗(yàn)錯誤,指數(shù)據(jù)在傳輸中被破壞,至少可以說明設(shè) 備在奇偶校驗(yàn)位類型設(shè)置不同或者字長不 同。,字長不匹配,發(fā)送的是8位字長,接收采用7位字長 發(fā)送的是7位字長,接收采用8位字長,停止位錯,接收端要求一個停止位,而發(fā)送端發(fā)送了兩個停止位 接收端要求兩個停止位,而發(fā)送端發(fā)送了一個停止位,幀錯,一般指位數(shù)不匹配。

18、這個類型的錯誤,通常是在沒有接收到要求的停止位時出現(xiàn)。,第章串行通信程序及組件建立,1、串行通信的Windows簡述 2、通信測試 3、自動與事件,1、串行通信的Windows簡述,串行通信相關(guān)函數(shù) 串口通信流程 Delphi的Windows.pas單元文件中已經(jīng)將Win32 API均聲明進(jìn)去,因此在Delphi里面使用API時 只要在uses 區(qū)段中加入Windows,使其引用該 單元文件即可,串行通信相關(guān)函數(shù),CreateFile:建立文件,在此用打開通信端口 CloseHandle:關(guān)閉由CreateFile建立的文件,在此用于關(guān)閉通信端口 GetCommState:取得計(jì)算機(jī)串口的設(shè)置

19、參數(shù) SetCommState:設(shè)置計(jì)算機(jī)串口的參數(shù) WriteFile:將數(shù)據(jù)寫入文件,在此用來將數(shù)據(jù)由串口送出 ReadFile:由文件中讀取數(shù)據(jù),在此用來取得送到串口的數(shù)據(jù) ClearCommError:清除串行端口的錯誤,并取得信息,串行通信相關(guān)函數(shù),PurgeComm:清除串口上的緩沖區(qū) EscapeCommFunction:控制串口的硬件狀態(tài) SetCommMask:設(shè)置事件的掩碼,用以觸發(fā)事件 WaitCommEvent:等待設(shè)置事件的發(fā)生 GetCommModemStatus:取得串口上的硬件線路狀態(tài),HANDLE CreateFile( LPCTSTR lpFileName,

20、 /文件名指針 DWORD dwDesiredAccess, /存?。ㄗx/寫)模式 DWORD dwShareMode,/共享模式 LPSECURITY_ATTRIBUTES lpSecurityAttribute, /security attribute結(jié)構(gòu)指針 DWORD dwCreationDistribution, /打開文件的方式 DWORD dwAttrsAndFlags, /文件屬性 HANDLE hTemplateFile/帶屬性復(fù)制的文件句柄 );,有關(guān)參數(shù)說明,lpFileName :欲打開的文件名稱。以串口通信來說,就是COM1、 COM2等 dwDesiredAcces

21、s :讀寫模式設(shè)備。由于將會對串口進(jìn)行讀寫操作,因此在此給定GENERIC_READ和GENERIC_WRITE常數(shù) dwShareMode :是否共享串行端口。一般不共享,設(shè)為0 lpSecurityAttribute:傳入一個Security Attribute結(jié)構(gòu),指明其返回的Handle是否可以被子程序所繼承。在此設(shè)置為nil,表示不可繼承 dwCreationDistribution :指定如何打開文件。在打開設(shè)備時,此參數(shù)設(shè)定為OPEN_EXISTING dwAttrsAndFlags :文件屬性及相關(guān)標(biāo)志。此項(xiàng)設(shè)置為0 hTemplateFile :此項(xiàng)設(shè)置為0,BOOL Clo

22、seHandle(HANDLE hObject); hObject:要關(guān)閉對象的句柄 當(dāng)函數(shù)返回True時,表示關(guān)閉動作完成。,Var Fhandle:THandle; ComName:array0.4 of char; / ComName:string; Begin ComName:=COM1; / PCHAR(ComName) FHandle := CreateFile(ComName, GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if FHandleINVALID_HAN

23、DLE_VALUE then showmessage(串口打開成功!) Else showmessage(串口打開失??!); CloseHandle(FHandle); End;,GetCommState,BOOL GetCommState( HANDLE hFile,/ 通信設(shè)備的句柄 LPDCB lpDCB/ 設(shè)備控制塊結(jié)構(gòu)的地址 );,_DCB = packed record DCBlength: DWORD; /DCB結(jié)構(gòu)的長度 BaudRate: DWORD; /當(dāng)前波特率 Flags: Longint; / wReserved: Word; /保留,未使用 XonLim: Word

24、; /傳送XON閾值 XoffLim: Word; /傳送XOFF閾值 ByteSize: Byte; /每字節(jié)位數(shù)(4-8) Parity: Byte; /0-4:no,odd,even,mark,space StopBits: Byte; /0,1,2:1,1.5,2 XonChar: CHAR; /設(shè)置Tx和Rx的XON字符 XoffChar: CHAR; /設(shè)置Tx和Rx的XOFF字符 ErrorChar: CHAR; /有錯誤時的替換字符 EofChar: CHAR; /表示輸入結(jié)束的字符 EvtChar: CHAR; /接收事件字符 wReserved1: Word; /保留,未使

25、用 end; TDCB = _DCB; DCB = _DCB; PDCB = TDCB;,SetCommState,BOOL SetCommState( HANDLE hFile,/ 通信設(shè)備的句柄 LPDCB lpDCB/ 設(shè)備控制塊結(jié)構(gòu)的地址 );,VarFDCB: TDCB; GetCommState(FHandle, FDCB); FDCB.BaudRate := 9600; FDCB.Parity := EVENPARITY; FDCB.Stopbits := ONESTOPBIT; FDCB.Bytesize := 8; SetCommState(FCOMHandle, FDCB)

26、;,WriteFile,BOOL WriteFile( HANDLE hFile,/ 要寫入文件的句柄 LPCVOID lpBuffer,/ 寫入文件中的數(shù)據(jù)的指針 DWORD nNumberOfBytesToWrite,/ 寫入的字節(jié)數(shù) LPDWORD lpNumberOfBytesWritten,/ 寫入總字節(jié)數(shù)的指針 LPOVERLAPPED lpOverlapped / overlapped I/O結(jié)構(gòu)的指針 ); / lpOverlapped 通常用來作后臺工作時同步檢查之用,在串行通信中若不同時使用串行端口,則可不使用,設(shè)為nil,var i:byte; strlen:DWord;

27、 xx:byte; dat : array0.99of char; begin dat0 := chr($fe); dat1 := chr($1B); dat2 := chr($44); dat3 := chr($03); dat4 := chr($02); xx:=0; for i:=1 to 4 do xx := xx xor ord(dati); dat5 := chr(xx); /異或校驗(yàn) strlen:=6; WriteFile(FHandle,dat,strlen,strlen,nil); end;,ReadFile,BOOL ReadFile( HANDLE hFile, /要讀

28、取文件的句柄 LPVOID lpBuffer, /接收數(shù)據(jù)的緩沖區(qū)地址 DWORD NumberOfBytesToRead, /讀取的字節(jié)數(shù) LPDWORD lpNumberOfBytesRead,/讀取總字節(jié)數(shù)的地址 LPOVERLAPPED lpOverlapped/OverLapped I/O結(jié)構(gòu)的地址 );,Var dat : array0.99of char; flag:dword;stepno:integer; begin stepno:=0; repeat Readfile(FHandle,dat,1,flag,nil); if flag0 then if dat10=chr($

29、fe) then stepno:=1; until (stepno=1)or(flag=0); Readfile(FHandle,dat,1,flag,nil); length:=ord(dat10); /取長度 readfile(FHandle,dat1,length,flag,nil); end;,PurgeComm,BOOL PurgeComm( HANDLE hFile,/ 通信資源的句柄 DWORD dwFlags/ 執(zhí)行動作 );,dwFlags:指定執(zhí)行的工作,PURGE_TXABORT:終止目前所有的傳輸工作,立即返回,不管是否完完成傳輸?shù)牟僮?PURGE_RXABORT:終止

30、目前所有的讀取工作,立即返回,不管是否完成讀取操作 PURGE_TXCLEAR:清除傳送緩沖區(qū)中的所有數(shù)據(jù) PURGE_RXCLEAR:清除接收緩沖區(qū)中的所有數(shù)據(jù),EscapeCommFunction,BOOL EscapeCommFunction( HANDLE hFile,/ 通信設(shè)備的句柄 DWORD dwFunc / 指定執(zhí)行的功能 );,dwFunc:指定串口必須完成的工作,CLRDTR:將DTR線路降成低電壓 CLRRTS:將RTS線路降成低電壓 SETDTR:將DTR線路升成高電壓 SETRTS:將RTS線路升成高電壓 SETXOFF:當(dāng)接收到Xoff字符時激活傳輸操作 SETX

31、ON:當(dāng)接收到Xon字符時激活傳輸操作 SETBREAK:設(shè)置通信狀態(tài)為中斷(送出BREAK信號) CLRBREAK:清除BREAK信號,使傳輸動作繼續(xù),GetCommModemStatus,取得串口數(shù)字輸入線路電壓狀態(tài)可用該函數(shù) BOOL GetCommModemStatus( HANDLE hFile,/ 通訊設(shè)備的句柄 LPDWORD lpModemStat/ 控制寄存器中數(shù)值的地址 );,lpModemStat:指向檢測到的狀態(tài)的參數(shù)地址,32位長度 MS_CTS_ON:CTS (clear-to-send) 引腳升至高電壓 MS_DSR_ON:DSR (data-set-ready)

32、 引腳升至高電壓 MS_RING_ON:RI引腳升至高電壓 MS_RLSD_ON:DCD引腳升至高電壓,串口通信流程,打開通信端口,打開成功?,通信參數(shù)設(shè)置,其他函數(shù)操作,顯示錯誤信息,關(guān)閉串口,結(jié)束,開始,繼續(xù)操作?,否,是,2、通信測試,通信步驟 回路測試,通信步驟,設(shè)置通信端口號碼 使用CreateFile函數(shù)打開通信端口 設(shè)置通信協(xié)議 設(shè)置傳輸速度等參數(shù) 設(shè)置其它參數(shù) 送出字符串或讀入字符串,使用ReadFile及WriteFile函數(shù) 使用完畢后以CloseHandle函數(shù)將通信端口關(guān)閉,回路測試,硬件設(shè)置 軟件實(shí)現(xiàn),硬件設(shè)置,兩臺計(jì)算機(jī),各使用其上的一個串口,一條RS-232兩邊都

33、是母頭的線 一臺計(jì)算機(jī),但擁有兩個串行通信口,一條RS-232兩邊都是母頭的線 一臺計(jì)算機(jī),一個串行通信口,一條RS-232線,至少其中一邊是母頭,3、自動與事件,自動化的實(shí)現(xiàn) 輪詢方式:不斷地發(fā)出詢問的信號給設(shè)備,要求設(shè)備返回計(jì)算機(jī)所要的信息 使用定時器(Timer組件),設(shè)定時間間隔,當(dāng)時間間隔一到,便會執(zhí)行原先放在定時器中的程序代碼 使用WhileDo不斷地執(zhí)行程序代碼 線程方式:將串行通信的功能封裝在一個線程中,利用線程的不斷執(zhí)行而達(dá)到自動化的目的,建立多線程,工作原理: 操作系統(tǒng)將CPU處理數(shù)據(jù)的時間切成很多的時間片 (Time Slice),操作系統(tǒng)再將應(yīng)用程序的代碼加載 到CPU

34、中執(zhí)行,一旦這一小塊的時間執(zhí)行完畢后, 操作系統(tǒng)會將正在執(zhí)行的程序放一邊,然后再取另 外一個應(yīng)用程序進(jìn)CPU中執(zhí)行,一樣只執(zhí)行這一小 塊時間片,如此周而復(fù)始,所以見到了整個系統(tǒng)中 多任務(wù)的情況。,線程的實(shí)現(xiàn),應(yīng)用程序執(zhí)行后即產(chǎn)生主線程,而主線程可以衍 生出其他線程。一個應(yīng)用程序可以依需要而造出 多個線程對象,每一個線程開始執(zhí)行后即被排入 CPU的執(zhí)行周期中,這些線程可能被建立后開始 執(zhí)行,直到應(yīng)用程序結(jié)束;也有可能執(zhí)行完工作 后在應(yīng)用程序結(jié)束前就結(jié)束掉,實(shí)際的情況看具 體需求而定。,Tthread類中常用的方法,Create:建立線程。使用此方法可建立線程,有1個參數(shù),若設(shè)成True,表示建立

35、后不立即執(zhí)行;若設(shè)成False,則表示一建立后馬上執(zhí)行。 constructor Create(CreateSuspended: Boolean); Free:釋放線程,線程程序代碼將從內(nèi)存中被刪除 procedure Free; Resume:執(zhí)行程序代碼。若線程暫停時,使用此指令再次激活 procedure Resume; Suspend:暫停線程。將執(zhí)行中的線程暫停 procedure Suspend;,var SecondProcess: TMyThread; TMyThread is a custom descendant of TThread begin SecondProcess

36、 := TMyThread.Create(True); create suspended -secondprocess does not run yet SecondProcess.Priority := tpLower; set the priority to lower than normal SecondProcess.Resume; now run the thread end;,第4章 串行通信中的字符與字節(jié),1、字符與字節(jié) 2、字節(jié)數(shù)據(jù)的傳送與接收,1、字符與字節(jié),字符和字節(jié)的差別 Delphi中的字符串種類及處理函數(shù) 中英文字符串長度計(jì)算,字符和字節(jié)的差別,Windows支持的字

37、符集有單字符集、雙字節(jié)字符集及UniCode字符集,在西方國家使用Windows系統(tǒng)基本使用單字符集,每一個字符都使用一個字節(jié)來表示;而亞洲國家由于字符無法單用一個字節(jié)表示,因此使用雙字節(jié)字符集,其中每個字符使用雙字節(jié)字符集。,UniCode,UniCode涵蓋了世界上所有國家的字符碼,每個字符用一個唯一的內(nèi)碼來表示,其特點(diǎn)是所有的字符以兩個字節(jié)表示,不僅中文使用兩個字節(jié),英文也使用兩個字節(jié),串口通信過程中,如果傳送的是一個英文字節(jié)組成,只要一個字節(jié)就可以將信息傳送出去;如果傳送的是雙字節(jié)的字符(如中文),完整的字符傳送就必須是兩個字節(jié)。,Delphi中的字符串種類及處理函數(shù),Chr(x):返

38、回X參數(shù)的字符 Ord(x):返回x參數(shù)所列的序數(shù),一般用來解讀字符在ASCII碼中的序數(shù) Pos(substr,str):返回str中,substr出現(xiàn)的位置,若找不到則返回0 StrPos(str1,str2):返回str2在str1出現(xiàn)的第一位置的指針,無則返回nil Copy(str,index,count):返回str參數(shù)中,索引index開始的count數(shù)目的字串 Delete(str,index,count):刪除str字串中,由index所指定的開始位置的count數(shù)目的字串 Length(str):返回字串str的長度 SetLength(str,newlen):設(shè)置str的

39、長度 Value(str,value,code):將str轉(zhuǎn)成數(shù)值value,code表示發(fā)生錯誤的位置 Str(value,str): Trim(str),TrimRight(str),TrimLeft(str):去空格 StringReplace(str,oldpattern,newpattern):替換 Insert(s1,s2,index):s1插入s2的第index位置,中英文字符串長度計(jì)算,Var InstrW:WideString; InstrA:ANSIString; Instr:string; Begin Instr:=edit1.text; InstrW:=edit1.text; InstrA:=edit1.text; edit2.text:=inttostr(length(Instr); edit3.text:=inttostr(length(InstrW); edit4.text:=inttostr(length(InstrA); End;,現(xiàn)象,純英文字符串使用三種字符串的計(jì)算結(jié)果相同,顯示出一樣的字符串長度 純中文字符串時,String和ANSIString所呈現(xiàn)的結(jié)果一樣,但Wi

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論