<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 利用SPComm 控件實(shí)現的PC 機與單片機串口通訊

利用SPComm 控件實(shí)現的PC 機與單片機串口通訊

作者: 時(shí)間:2012-02-03 來(lái)源:網(wǎng)絡(luò ) 收藏

1.引言

本文引用地址:http://dyxdggzs.com/article/172196.htm

隨著(zhù)計算機網(wǎng)絡(luò )與信息技術(shù)的高速發(fā)展,采用與多臺構成的分布式系統、工業(yè)控制系統、數據傳輸系統等越來(lái)越受到廣泛應用。下位機采用運行性能較為可靠的,直接對所控制對象進(jìn)行實(shí)時(shí)數據的采集、計算、判斷和處理;而上位機則多采用機(如Pentium 系列),主要負責對各進(jìn)行綜合管理,以測控系統的自動(dòng)檢測與控制。在這類(lèi)應用系統中,穩定可靠、方便快捷的數據通信是應用系統功能的基礎和保障。因此,如何根據系統的實(shí)際工作環(huán)境條件,選擇恰當的通信接口和協(xié)議,合理設計通信軟件和硬件控制電路以獲得高可靠性,強抗干擾和容錯能力成為衡量此類(lèi)系統好壞的最重要因素。

本文以某一工程項目系統為例,介紹一種基于Delphi語(yǔ)言Somm了計算機與下位AT80C51單片機之間通信的軟硬件設計與實(shí)現,并給出關(guān)鍵環(huán)節的具體的實(shí)現方法。

2.硬件系統

該系統以PC機作為上位主機,各下位機由AT80C51單片機組成,各下位機之間無(wú)數據傳輸,只與主機產(chǎn)生數據交換。根據該工程的特點(diǎn),各單片機與PC機以RS-485總線(xiàn)連接。

由于微機通常采用RS-232電平,而單片機是TTL電平,二者不兼容。所以,接口必須做電平轉換處理。單片機串行口的TXD、RXD經(jīng)MAX485電平轉換為RS-485電平,在主機端經(jīng)MAX485和MAX232轉換為RS-232電平,再與微機的RxD、 TxD和GND相連。為了提高可靠性和抗干擾能力。在本項目工程中,可以對下位機主控板上的通信部分進(jìn)行光電隔離。這樣的話(huà),使得即便是有超越 MAX485的ESD保護范圍的靜電或雷電感應在信號線(xiàn)上,也只會(huì )毀壞驅動(dòng)器或光耦合,不至于破壞整個(gè)后級系統。同時(shí),通信總線(xiàn)采用屏蔽線(xiàn),各段線(xiàn)路屏蔽層相聯(lián)接,集中到某一處,采用了必要的接地措施。布置總線(xiàn)時(shí)盡量避免了與高壓電或動(dòng)力電線(xiàn)路平行,無(wú)法避免時(shí),盡量讓兩者之間距離足夠大。其接口系統結構圖如圖所示:

33.jpg

3.系統軟件設計

1) 協(xié)議

在本系統中,PC機是主控單元,單片機是PC機信息的接受者。由于涉及到單片機多機通訊,因此串行口工作方式選為方式3,通訊格式為每11位構成一串行幀:1位起始位(0),8位數據位(最低有效位在前),1位地址幀識別位(1),1位停止位(1),無(wú)奇偶校驗位(其中第9位進(jìn)到單片機RB8)。該設計中,每次通訊過(guò)程總是由上位PC機首先發(fā)起,通訊時(shí)單片機先進(jìn)入通訊狀態(tài),等待與計算機通訊。其過(guò)程分為以下幾步:

(1)通訊前每臺單片機設置一個(gè)地址。所有單片機SCON寄存器中的SM2位置1,準備接收地址幀。

(2)PC機向所有單片機發(fā)地址幀,單片機接收到地址幀后與本機地址比較,若不同則不動(dòng)作,繼續等待下一個(gè)地址幀;若相同,返回本機地址確認。

(3)主機接收到地址確認后,按要求向目標發(fā)送命令字。①傳送數據命令:可根據要求單片機發(fā)送的數據的不同具體定義,為8位單字節數 ;②接收數據命令:EFh;

(4)目標單片機接收到命令字后:按要求動(dòng)作。①接收到“請求接收命令”:發(fā)FEh(若做好接收準備),發(fā)00h(若未準備好發(fā)送)。②接收到“請求發(fā)送數據”:按指定要求發(fā)送數據。

(5)由于數據傳輸是在強干擾的環(huán)境中進(jìn)行的,而且傳輸距離又較遠,為了保證數據能高速、準確傳輸,軟件編程考慮對大批量數據進(jìn)行分組傳送,同時(shí)對每組數據進(jìn)行和校驗,檢查其準確性。PC機每次接收到一組數據,均要進(jìn)行再次和校驗,然后將PC機的校驗和結果和單片機傳送過(guò)來(lái)的校驗和相比較,若兩者不等則說(shuō)明傳輸有錯校驗失敗,PC機給單片機發(fā)重傳命令,要求單片機重新發(fā)送該組數據。若校驗正確,PC機發(fā)確認信號,并準備接收下一組采樣數據。

在傳輸過(guò)程中上位機發(fā)送出去的數據有三類(lèi):①從機地址;②命令字;③向下位機發(fā)送的數據包;收到的數據有兩類(lèi):①從下位單片機發(fā)來(lái)的確認信號;②從下位機傳來(lái)的數據;下位單片機接收和發(fā)送的數據與之對應不再贅述。

2) 上位機軟件設計

在Delphi 中進(jìn)行串行通訊的方法可以分成以下幾種:

本文采用了Spcomm , 其功能強大, 使用方便, 具有豐富的與通訊密切相關(guān)的屬性事件和方法, 提供了對串口的各種操作。其主要事件及方法如下:

主要事件:Onrececvedata: 當有數據輸入緩存時(shí), 將觸發(fā)該事件。OnreceiveError: 當接收數據出現錯誤時(shí), 觸發(fā)該事件。

主要方法:Startcomm: 用于打開(kāi)串口, 當打開(kāi)失敗時(shí)通常會(huì )報錯。Stopcomm: 用于關(guān)閉串口, 沒(méi)有返回值。Writecommdata: 用于將一個(gè)字符串發(fā)送到寫(xiě)進(jìn)程。

Spcomm編寫(xiě)上位機程序,簡(jiǎn)單快捷,靈活方便,實(shí)現過(guò)程中有以下關(guān)鍵點(diǎn)需要注意:

(1) 地址幀的產(chǎn)生。由于PC機沒(méi)有像單片機一樣的串口工作方式,因此不能自動(dòng)生成地址幀。設計軟件時(shí)應人工生成地址幀。單片機串口工作在方式3時(shí)地址幀的格式如圖2所示:

29.jpg
即八位數據后加一位“1”。因此可以Spcomm控件中的奇偶校驗位來(lái)模擬,方法是:
form1.Comm1.ParityCheck:=false;
form1.Comm1.Parity:=mark;
form1.Comm1.ParityCheck:=true;

這樣在發(fā)出的一個(gè)字節的數據末尾會(huì )加上一個(gè)“1”,也就形成了地址幀。當然在發(fā)送其他數據時(shí),應該先把最后一位清零“0”:
S3C2410 ARM9開(kāi)發(fā)板800
form1.Comm1.ParityCheck:=false;
form1.Comm1.Parity:=space;
form1.Comm1.ParityCheck:=true;

(2) 在PC機端的MAX485芯片的收發(fā)狀態(tài)可以利用DTR(九針串口第四針)引腳來(lái)控制。對于Spcomm控件來(lái)說(shuō),屬性中有DtrControl屬性,利用該屬性可以方便地對DTR引腳進(jìn)行高低電平控制。該屬性可以取三個(gè)值,分別為:DtrEnable,DtrDisable,DtrHandshake,本設計中只用到前兩個(gè)值。
form1.Comm1.DtrControl:=DTREnable; //DTR引腳有效
form1.Comm1.DtrControl:=DTRDisable; //DTR引腳無(wú)效

(3) 校驗和的產(chǎn)生。為了增強數據傳輸的準確性,采用校驗和的檢驗方式。本設計里校驗和的產(chǎn)生分兩部分,一部分是發(fā)送數據之前,要對發(fā)送的數據進(jìn)行累加產(chǎn)生校驗和發(fā)送出去,這個(gè)校驗和稱(chēng)為源校驗和(sorcechksum)。另一部分是在接收數據是,要將接收到的數據累加產(chǎn)生一個(gè)目的校驗(orgchksum)和用來(lái)與接收到的校驗和相比較。

此兩部分的程序實(shí)現如下:
function addchksum(sorstring:string): string;
var
i,j,chksum: integer;
begin
j:=length(sorstring);
chksum:=0;
for i:=1 to j do begin
chksum:=(chksum+ord(sorstring[i])) and $FF; //產(chǎn)生源校驗和
result:= sorstring+inttohex(chksum,2)+chr(13); //將源校驗和加在發(fā)送字符串尾
end;
end;
/*********************************************************************************/
function examchksum(var inbuf:array of char;strlen:WORD):boolean;
var i:integer;
sorchksum,orgchksum:integer;
begin
orgchksum:=0;
for i:= 0 to strlen-4 do begin
orgchksum:=(orgchksum+ord(inbuf[i]))and $FF; //產(chǎn)生目的校驗和
end;
sorchksum:=strtoint('$'+copy(inbuf,strlen-3+1,2)); //將源校驗和分離出來(lái)
if orgchksum=sorchksum then result:=true //比較目的校驗和與源校驗和
else result:=false;
end;

(4) 數據的接收和發(fā)送是將一組數據看成一個(gè)String類(lèi)型數據來(lái)操作的,而Delphi中使用的是Pascal字符串,因此在發(fā)送之前應該用Pchar()函數對要發(fā)送的數據進(jìn)行轉換:

WriteCommData(Pchar(@outstr[i]),1); //參數分別為發(fā)送字符串首地址,要發(fā)送的字符串數。

Spcomm控件中的數據接收發(fā)式是事件觸發(fā)方式。OnReceiveData : procedure (Sender: TObject;Buffer: Pointer;BufferLength: Word) of object

當輸入緩存有數據時(shí)將觸發(fā)該事件,在這里可以對從串口收到的數據進(jìn)行處理。Buffer中是收到的數據,bufferlength是收到的數據長(cháng)度。 因此對于PC機來(lái)說(shuō)可以通過(guò)bufflength的長(cháng)度來(lái)區分數據和從單片機返回的確認信號。本設計規定命確認信號為一個(gè)字節,而數據的傳輸由于加上校驗和至少為兩個(gè)字節。

(5) 為了防止實(shí)際工作中當向某臺從機發(fā)送地址幀或命令字后,如果失去接收主機發(fā)出的地址數據的機會(huì ),或因某臺從機不工作而使系統陷入“死循環(huán)”程序而不能正常工作。為了避免這種情況的發(fā)生,在設計時(shí)還要考慮一定的容錯機制,本設計中采用的方法是在發(fā)送完地址幀和命令字后,程序開(kāi)始計時(shí)。如果超過(guò)一定時(shí)間還沒(méi)收到返回確認信息,就重發(fā)剛剛發(fā)送的數據如果重發(fā)3確認還沒(méi)收到確認信息,即報告出錯,并記錄該出錯單片機地址。本設計利用WindowsAPI函數編寫(xiě)一個(gè)延時(shí)小程序:
procedure TimeDelay(DT:DWORD); //DT為延時(shí)時(shí)間(ms)
var TT:DWORD;
begin
TT:=GetTickCount(); //調用API函數
while GetTickCount()-TTDT do
Application.ProcessMessages; //系統掛起
end;

30.jpg

31.jpg

3) 下位機軟件設計

根據該工程特點(diǎn),通訊只在特定時(shí)間進(jìn)行,因此下位機只須采用查詢(xún)方式與主控機通信:當主控機需要發(fā)送或讀取下位機數據時(shí),事先控制下位機進(jìn)入通訊狀態(tài),初始化串口,等待PC機請求接收和發(fā)送數據。本設計采用C51語(yǔ)言進(jìn)行編寫(xiě),下位機主程序流圖如下圖所示。

32.jpg

4 結束語(yǔ)

經(jīng)過(guò)試運行該系統工作穩定,收發(fā)數據可靠。Delphi是Windows環(huán)境下最優(yōu)秀的程序設計工具之一,使用它可以方便地編寫(xiě)出非常優(yōu)美、流暢的應用程序界面。利用第三方Spcomm通訊控件避免了調用API函數,需要設置繁復的參數的麻煩。本文正是應用了二者的長(cháng)處,實(shí)現了微機與單片機的通信。

參考文獻
[1] 范逸之,陳立元. Delphi與RS-232串行通信控制[M].北京:清華大學(xué)出版社,2002
[2] 呂偉臣. 精通Delphi7.0. 北京:科學(xué)出版社[M],2004
[3] 李朝青. PC機及單片機數據通訊技術(shù)[M]. 北京:北京航空航天大學(xué)出版社,2001

單片機相關(guān)文章:單片機教程


單片機相關(guān)文章:單片機視頻教程


單片機相關(guān)文章:單片機工作原理


數字通信相關(guān)文章:數字通信原理


通信相關(guān)文章:通信原理




評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>