張利利,李曉京,胡文東,李 婭
串行口是計算機與外部設備之間進行數(shù)據(jù)交換的重要介質,所以串行通信在工程中有著廣泛的應用。這種通信的實現(xiàn),經常要組成上位機為PC機而下位機為單片機的二級系統(tǒng), 通過RS232 進行通信【1】。筆者結合某人體重心測試系統(tǒng),詳細介紹在C++ Builder中實現(xiàn)PC機與單片機串行通信的方法。
串行通信是指數(shù)據(jù)是一位一位按順序傳送的通信方式。它有兩種基本的通信方式:異步通信和同步通信【2】。本系統(tǒng)采用的是異步通信,所以在此只對異步通信做簡要介紹。
異步串行通信時,每個字符作為一個獨立的信息,可以隨機出現(xiàn)在數(shù)據(jù)流中。為確保異步通信的正確性,必須找到一種方法,使通信雙方在隨機傳送的字符內部實現(xiàn)同步。這種方法就是在字符格式中設置起始位和停止位,即在一個字符正式發(fā)送之前先發(fā)一個起始位,該字符結束時再發(fā)一個停止位。接收器檢測到起始位便知道字符到達并開始接收字符,檢測到停止位則知道字符傳輸已結束。由于這種通信協(xié)議是靠起始位和停止位來實現(xiàn)字符內部同步的,所以有時也稱為起止式協(xié)議。
普通的單片機都是通過 RS232C串行口信號線與計算機相連??紤]到通信程序之間采用軟件握手以及降低編寫PC與單片機的程序的復雜性,PC與單片機之間的連接只采用了RS232接口中的3根線,即RXD,TXD,GND。因為由PC出來的是RS232電平,而單片機是典型的TTL電平,因此在PC與單片機的連接中必須要有電平轉換電路,此處采用的是MAX232電平轉換電路。PC數(shù)據(jù)發(fā)送是通過TXD口經過一個電平轉換電路連接到單片機的RXD端,而接收數(shù)據(jù)是由RXD經過一個電平轉換電路連接到單片機的TXD口,如圖1所示:
圖1 PC機與單片機的連接
本次設計中,以一個人體重心測控系統(tǒng)為背景,給出單片機部分和C++ Builder環(huán)境下的通信程序實例,通信協(xié)議采用全雙工異步串行通信方式,通過RS232的RTS信號進行收發(fā)轉換,傳輸數(shù)據(jù)采用16進制數(shù)據(jù),PC機與單片機之間采用主從式通訊。
串口通訊能有條不紊地進行,依賴于串口通訊協(xié)議的制定。串口通訊協(xié)議分為底層通訊協(xié)議和用戶層協(xié)議。底層協(xié)議一般由計算機硬件提供商和設備廠家提供,而用戶層協(xié)議則是指數(shù)據(jù)以何種格式發(fā)送出去,或如何從接收到的某種格式的數(shù)據(jù)中提取需要的數(shù)據(jù)等,本系統(tǒng)采用的用戶層協(xié)議是自主定義的通信協(xié)議【3】,具體如下:
(1)波特率19200bps,1個起始位,8個數(shù)據(jù)位,1個停止位,無奇偶校驗。實際通信中,PC機和下位機發(fā)送的數(shù)據(jù),都帶有一個起始字和結束字,可以增加它的抗干擾性,當下位機發(fā)送過來的數(shù)據(jù)亂了之后,上位機能立即檢測出來,并將亂了的那塊數(shù)據(jù)包扔掉,重新開始尋找下一個帶有起始字和結束符的一組完整數(shù)據(jù),這樣就能確保數(shù)據(jù)傳輸?shù)目煽啃浴?/p>
(2)通信采用主從式,即PC機主動發(fā)送命令給單片機,單片機根據(jù)命令進行相應的動作;所有發(fā)送的數(shù)據(jù)均采用16進制數(shù)(注:OxA1即16進制數(shù)A1)。PC機和下位機都采用定長的數(shù)據(jù)格式進行數(shù)據(jù)的發(fā)送,上位機和下位機首先只需判斷起始字是否為通信協(xié)議所規(guī)定的起始字,若是,才進行下一步的操作;否則就不用對它進行任何操作。這樣就確保了通信的高效性。
(3)通信數(shù)據(jù)幀格式
起始符:1個字節(jié),標識一次發(fā)送的開始,PC機默認的A1,下位機默認的為B1;
命令:3個字節(jié),區(qū)分不同的操作;
結束符:1個字節(jié),標識一次發(fā)送的結束,默認的為13;
預留符:1個字節(jié),增加程序的可擴充性。
本系統(tǒng)的詳細命令與數(shù)據(jù)格式如下:
握手:上位機發(fā)送A12000010013
下位機回復: B1000000000000000000000013
開始測試:
無剩余能力測試時上位機發(fā)送:A12004000113,其中的01表示本次進行無剩余能力測試。
有剩余能力測試時上位機發(fā)送:A12004000213,其中的02表示本次進行有剩余能力的測試。
下位機根據(jù)第3、4個字節(jié)確定要發(fā)送多少組數(shù)據(jù)給PC機,根據(jù)第5個字節(jié)確定要采集那些數(shù)據(jù)發(fā)送給PC機。
結束測試:上位機連續(xù)3次發(fā)送命令A12000000413,其中的04表示結束本次測試。
上位機的通信程序作為整個系統(tǒng)中的主機,肩負著系統(tǒng)數(shù)據(jù)分析、指令下達,同時提供信息系統(tǒng)管理功能的多重任務。因此我們選擇具有多任務的操作方式、良好的用戶界面和強大的數(shù)據(jù)庫管理功能的C++ Builder作為上位機的開發(fā)軟件。在C++ Builder中實現(xiàn)串口通信的方法有多種,利用MSComm ActiveX控件(它的支持文件:MSComm32.OCX,需注冊) ,可以非常方便地創(chuàng)建串行通信應用程序,但其程序執(zhí)行效率不夠高,并且無法應用串行通信的一些底層功能。還可利用一種以Microsoft Communications Control(version 6)為基礎的串口類CSerialPort,該串口類將API和ActiveX控件結合起來,以API編程的靈活性彌補了C++Builder中串口控件的不足。
下面就詳細介紹如何利用串口通信類CSerialPort來實現(xiàn)PC機與單片機的通信。 它的工作流程及在本系統(tǒng)的應用如下:
上位機程序工作流程如下:首先設置好串口參數(shù),再開啟串口監(jiān)測工作線程,串口監(jiān)測工作線程監(jiān)測到串口接收到的數(shù)據(jù)、流控制事件或其他串口事件后,就以消息方式通知主程序,激發(fā)消息處理函數(shù)來進行數(shù)據(jù)處理,這是對接收數(shù)據(jù)而言;發(fā)送數(shù)據(jù)可以直接發(fā)送。
1)首先在應用程序的工程中添加該類,同時要包含該類的定義文件“SerialPort.h”,手工添加#include “SerialPort.h”;
2) 自動搜索PC機上有效的串行端口。一般的PC機最多可擴展到128個串口,但是最常用的是前面10個串口,所以本系統(tǒng)只搜索前面10個串口號。首先聲明一個指向CSerialPort類的指針CSerialPort *Comm,然后利用InitPort函數(shù)對1-10號串口逐一進行初始化。如果初始化成功則為當前PC機上的有效串口,并將該串口號保存在變量中。
3)打開通信端口,進行數(shù)據(jù)的傳輸:
4)關閉通信端口,釋放系統(tǒng)資源。在完成串行通信操作后,應該將串行通信端口的資源歸還給操作系統(tǒng);
STC系列單片機具有采集速度快,帶有8路的10位的A/D轉換,價格便宜等優(yōu)點。所以本系統(tǒng)采用的單片機為STC12C5412AD ,振蕩頻率為22.1184MHz,串口工作于方式1,定時/計數(shù)器1用作波特率發(fā)生器,PCON 中的SMOD位為0,發(fā)送的波特率為19200。下位機端通信程序采用C51編程語言在KeilC51環(huán)境下開發(fā)的,通信流程,如圖2所示:
圖2 單片機通信流程圖
利用C++ Builder作為軟件開發(fā)平臺,通過API函數(shù)實現(xiàn)PC機與單片機之間的串口通信,該系統(tǒng)經過調試,運行穩(wěn)定可靠,已成功應用到人體重心測試系統(tǒng)中。本方法實現(xiàn)簡單,通用性好,只要稍加改動就能應用到其他的系統(tǒng)中。
[1]湯勃,徐立偉,饒潤生.基于VB的PC機與單片機串行通信程序設計.[j]武漢理工大學學報.2002年 26卷第4期.534~536.
[2]李朝青.PC機與單片機數(shù)據(jù)通信技術.[M]北京航空航天大學出版社.1999.
[3]黃良沛,黃昕,陽小燕.Delphi環(huán)境中利用MSCOMM實現(xiàn)PLC與上位機的串口通信.[j]計算機應用與軟件.2005年第22卷第4期.125~127.