王雷陽,李正生
(第二炮兵工程學(xué)院 101室,陜西 西安 710025)
在工業(yè)數(shù)據(jù)采集系統(tǒng)中,多以單片機(jī)作為核心器件采集數(shù)據(jù),PC機(jī)大多通過RS-232接口和單片機(jī)進(jìn)行通訊,實(shí)現(xiàn)對(duì)單片機(jī)的控制及在PC機(jī)上顯示及處理所采集的數(shù)據(jù)。由于RS-232接口協(xié)議所傳輸?shù)木嚯x[1]不能超過30 m,再者在只占用一個(gè)串口資源的情況下只能實(shí)現(xiàn)單機(jī)間的通訊,所以要實(shí)現(xiàn)多機(jī)遠(yuǎn)距離通訊時(shí),將RS-232轉(zhuǎn)換為RS-485接口協(xié)議。
RS-485作為一種通用串行通信接口,具有傳輸距離長(zhǎng)、速度較高、電平兼容性好、使用靈活方便、成本低廉和可靠度高等優(yōu)點(diǎn)[2],在工業(yè)測(cè)量、智能控制等許多領(lǐng)域都有著廣泛的應(yīng)用。在實(shí)際應(yīng)用中,需要注意電氣規(guī)定、網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)及傳輸線纜的選擇。
首先考慮電氣規(guī)定。不同的接口有不同的標(biāo)準(zhǔn),使用中,需要將表1中常見的3種電平進(jìn)行相互轉(zhuǎn)換。
其次考慮網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)。在數(shù)據(jù)采集系統(tǒng)中,一般有多個(gè)采集點(diǎn),因而需要構(gòu)建網(wǎng)絡(luò),進(jìn)行主機(jī)和從機(jī)間的通訊。網(wǎng)絡(luò)拓?fù)湟话悴捎媒K端匹配的總線型結(jié)構(gòu),不支持環(huán)形或星形網(wǎng)絡(luò)[3]。在構(gòu)建網(wǎng)絡(luò)時(shí),應(yīng)注意以下兩點(diǎn)。
表1 常見接口電氣特性表Tab.1 Electric characteristic of common ports
1)總線連線的方式 采用一條雙絞線電纜作為總線,將各個(gè)從機(jī)串聯(lián)起來,從總線到各個(gè)從機(jī)的引出線長(zhǎng)度應(yīng)盡量短,以便使引出線中的反射信號(hào)對(duì)總線信號(hào)的影響最低。
2)總線的特性阻抗 注意總線特性阻抗的連續(xù)性,在阻抗不連續(xù)點(diǎn)就會(huì)發(fā)生信號(hào)的反射。如果總線的不同區(qū)段采用了不同的電纜,或某一段總線上有許多從機(jī)緊靠在一起安裝,再者是過長(zhǎng)的分支線引出到總線等情況出現(xiàn),一產(chǎn)生阻抗的不連續(xù)性。
最后考慮傳輸線纜。在低速、短距離、無干擾的場(chǎng)合可以采用普通的雙絞線,反之,在高速、長(zhǎng)線傳輸時(shí),則必須采用阻抗匹配(一般為120 Ω)的RS485專用電纜,而在干擾惡劣的環(huán)境下還應(yīng)采用雙絞屏蔽電纜。
PC機(jī)作為主機(jī),Atmega16 AVR單片機(jī)為核心作為從機(jī),通過RS-485總線結(jié)構(gòu)將主機(jī)與各個(gè)從機(jī)相連接。PC機(jī)通過市場(chǎng)上現(xiàn)有的RS-232/RS-485轉(zhuǎn)接器連接到485總線網(wǎng)絡(luò),各個(gè)從機(jī)通過SN75176芯片連接到485總線網(wǎng)絡(luò),實(shí)現(xiàn)主機(jī)與從機(jī)間的通訊。485總線接口硬件結(jié)構(gòu)如圖1所示。
圖1 接口硬件結(jié)構(gòu)框圖Fig.1 Block diagram of interface hardware
ATmega16是ATmega系列中一種高性能、低功耗的8位AVR RISC微處理器。通過在一個(gè)時(shí)鐘周期執(zhí)行一條指令,ATmega16可以獲得接近1 MIPS/MHz的性能。該單片機(jī)具有16 kB的系統(tǒng)內(nèi)可編程Flash(具有同時(shí)讀/寫的能力)、512 B EEPROM、1 kB SRAM、32個(gè)通用I/0口。此外,還具有一個(gè)10位的A/D轉(zhuǎn)換器,一個(gè)全雙工同步/異步串行口和3個(gè)可編程定時(shí)/計(jì)數(shù)器。ATmega16功能強(qiáng)大,價(jià)格適宜,是一款性價(jià)比很高的MCU[4]。
通訊接口采用SN75176收發(fā)器芯片將單片機(jī)的TTL電平轉(zhuǎn)換為RS-485接口電平,其與單片機(jī)的接口電路如圖2所示。通過Atmega16的PA0和PA1按照表2的方式對(duì)SN75176的DE和RE端使能,表中,H為高電平輸入,L為低電平輸入。在A端與B端間并聯(lián)120 Ω(1/4 W)的終端匹配電阻,以便有效抑制反射信號(hào),通信距離可達(dá)1 200 m。
圖2 SN75176接口電路圖Fig.2 SN75176 ports circuit
表2 SN75176端口使能模式Tab.2 SN75176 ports enabled modal chart
串口通信協(xié)議分為底層協(xié)議和用戶層協(xié)議。底層協(xié)議一般由計(jì)算機(jī)硬件提供商及設(shè)備廠家提供,而用戶層協(xié)議需要,以此確定通信雙方的數(shù)據(jù)以何種方式進(jìn)行發(fā)送、接收及保證數(shù)據(jù)在串行通信過程中的正確性。在編制用戶層協(xié)議時(shí),需要遵守以下幾個(gè)原則。
1)數(shù)據(jù)包必須有包頭 包頭是數(shù)據(jù)接收端判斷數(shù)據(jù)是否傳輸?shù)闹匾獦?biāo)志,如果接收端接收到了包頭,就認(rèn)為以后的數(shù)據(jù)為有效數(shù)據(jù)。因而包頭字符必須有別于有效數(shù)據(jù),如果有效數(shù)據(jù)中包含了包頭,就會(huì)引起通信混亂。程序中,包頭定為兩個(gè)字節(jié),0xA7 0x7A。
2)數(shù)據(jù)包應(yīng)該指明長(zhǎng)度 指明了數(shù)據(jù)長(zhǎng)度,接收端便能夠判斷數(shù)據(jù)包是否結(jié)束。
設(shè)置各個(gè)從機(jī)的地址,分別為0x01~0x04,主機(jī)通過輪流發(fā)送從機(jī)地址的方式控制相應(yīng)的從機(jī)和接收從機(jī)的數(shù)據(jù)。從機(jī)只能被動(dòng)的接收命令,只有被查詢到的從機(jī)才能向主機(jī)發(fā)送數(shù)據(jù),本次通訊結(jié)束后,從機(jī)又處于接收命令的狀態(tài)。通訊的波特率為9 600 bps,單片機(jī)晶振選為11.059 2 MHz。數(shù)據(jù)幀格式設(shè)為:8數(shù)據(jù)位、無校驗(yàn)、1停止位。從機(jī)向主機(jī)發(fā)送數(shù)據(jù)包格式為:2字節(jié)的字頭(0xA7 0x7A)、30字節(jié)的數(shù)據(jù)。
3.2.1 串行通信方案選擇
主機(jī)在Windows環(huán)境下以VC++6.0軟件為開發(fā)平臺(tái),主要解決串口通訊及數(shù)據(jù)運(yùn)算處理。常用的串行通信有以下幾種方案[5]:
1)直接利用通信端口函數(shù)(-input(),-output()等),采用TC等C語言工具來開發(fā),這種方案由于涉及具體的硬件電路,所以比較復(fù)雜,而且TC開發(fā)可視化界面較困難;
2)用Windows API函數(shù)實(shí)現(xiàn)通信功能,實(shí)現(xiàn)起來較復(fù)雜;
3)直接利用ActiveX控件(如MSComm控件)來實(shí)現(xiàn),這種方案的特點(diǎn)是方便、簡(jiǎn)單;
4)利用串行通訊類來實(shí)現(xiàn),如Cserial類、CserialPort類。
本設(shè)計(jì)采用CserialPort類實(shí)現(xiàn)串口通信。CserialPort類是Remon Spekreijse寫的一個(gè)串口類,是一個(gè)簡(jiǎn)單而強(qiáng)大的多線程串口編程工具。使用時(shí),只需將該類添加到編寫的工程里,就可以使用其成員函數(shù),并且用戶可以根據(jù)需要對(duì)該類進(jìn)行改進(jìn)。
3.2.2 程序?qū)嶋H開發(fā)
程序開發(fā)的主要步驟如下:
1)建立可視化窗口界面 建立基于對(duì)話框的MFC應(yīng)用程序SerialPortTest,在自動(dòng)生成的用戶界面上添加必要的控件。界面如圖3所示,使用時(shí),按照通信要求正確設(shè)置串口參數(shù),打開串口后,選擇從機(jī)地址點(diǎn)擊發(fā)送,接收框便會(huì)自動(dòng)顯示該從機(jī)的測(cè)量數(shù)據(jù),并顯示出連續(xù)測(cè)量n次的平均值。
2) 添加CserialPort類文件 將SerialPort.h和SerialPort.cpp文件復(fù)制到工程根目錄下,用Project-Add to Project-Files命令將上述文件加入工程,并在SerialPortTestDlg.h中加入#include “SerialPort.h”。
圖3 窗口界面圖Fig.3 Window interface
3)串口初始化 串口初始化主要是按照默認(rèn)的參數(shù)打開串口。默認(rèn)的參數(shù)設(shè)置為:串口號(hào)為串口1、波特率9 600、8個(gè)數(shù)據(jù)位、1個(gè)停止位、無奇偶校驗(yàn)。此外,如果在初始化成功后,還要調(diào)用串口通信監(jiān)測(cè)線程函數(shù),這樣各種串口狀態(tài)和事件才能被監(jiān)測(cè)到。
使用的函數(shù)為:
① BOOL InitPort (CWnd*pPortOwner, UINT portnr,UINT baud, char parity, UINT databits, UINT stopbits,DWORD dwCommEvents, UINT writebuffersize), 該函數(shù)為串口初始化函數(shù),如果初始化成功,就返回TRUE。
②BOOL StartMonitoring(),該函數(shù)為串口通信監(jiān)測(cè)線程函數(shù)。
4)人工添加串口消息響應(yīng)函數(shù):OnComm(WPARAM ch,LPARAM port)
因?yàn)镃serialPort類所有的消息均需要人工添加消息處理函數(shù),所以需要用戶自己對(duì)函數(shù)進(jìn)行聲明和消息映射。首先在SerialPortTestDlg.h中添加該函數(shù)的聲明:
接著,在SerialPortTestDlg.cpp中加入函數(shù)OnComm()的實(shí)現(xiàn),關(guān)鍵代碼如下,實(shí)現(xiàn)了將收到的數(shù)據(jù)字符顯示到編輯框中,然后將字符轉(zhuǎn)換為整形,解析出所需要的數(shù)據(jù),并將多次測(cè)量的結(jié)果計(jì)算出均值。
LONG CSerialPortTestDlg::OnComm (WPARAM ch,LPARAM port)
5)添加串口發(fā)送函數(shù)。在發(fā)送框中輸入進(jìn)行通信從機(jī)的地址,由于單片機(jī)地址匹配的是十六進(jìn)制數(shù)據(jù),因而將待發(fā)送的數(shù)據(jù)在程序中使用用戶編寫的Str2Hex函數(shù)轉(zhuǎn)換為十六進(jìn)制。接收框便可接收到該從機(jī)所采集的數(shù)據(jù)。
通過宏定義給各個(gè)從機(jī)Atmega16單片機(jī)定義從機(jī)地址,在初始化后保持接收地址命令狀態(tài),當(dāng)與本機(jī)地址匹配后發(fā)送所采集的數(shù)據(jù),其余從機(jī)處于地址接收等待狀態(tài),當(dāng)該從機(jī)發(fā)送完數(shù)據(jù)后作出相應(yīng)的反應(yīng),回到接收地址命令的狀態(tài)。各個(gè)從機(jī)串口接收和發(fā)送均使用中斷的方式處理數(shù)據(jù),這樣能夠減輕單片機(jī)的運(yùn)行負(fù)荷,圖4為從機(jī)串口接收完成中斷服務(wù)程序流程圖。
圖4 從機(jī)串口接收完成中斷服務(wù)程序流程圖Fig.4 Receive interrupt program chart of slave
圖5 從機(jī)串口發(fā)送完成中斷服務(wù)程序流程圖Fig.5 Transmit interrupt program chart of slave
圖5為串口發(fā)送完成中斷服務(wù)程序流程圖。在服務(wù)程序中,首先發(fā)送字頭A7,此時(shí)產(chǎn)生發(fā)送完成中斷,程序進(jìn)入中斷服務(wù)程序,接著發(fā)第二個(gè)字頭7A,接著發(fā)送所采集的數(shù)據(jù),每發(fā)一個(gè)數(shù)據(jù),便計(jì)1次數(shù),當(dāng)發(fā)送32次時(shí),一個(gè)完整的數(shù)據(jù)包便發(fā)送完畢,此時(shí),設(shè)置一個(gè)標(biāo)志,當(dāng)主程序查詢到該標(biāo)志時(shí),程序便跳出中斷。
通過調(diào)試發(fā)現(xiàn),信號(hào)接地很重要,不能忽略,若不接地嚴(yán)重影響數(shù)據(jù)的有效通信。主要有兩方面的原因:一是共模干擾問題,RS-485收發(fā)器有一定的共模電壓范圍,如果沒有接地,很可能導(dǎo)致接收器共模輸入超出正常范圍,并在傳輸線上產(chǎn)生干擾電流,輕則影響正常通信,總則損壞通信接口電路;二是電磁干擾問題,發(fā)送驅(qū)動(dòng)器輸出信號(hào)中的共模部分需要一個(gè)返回通路,如沒有信號(hào)地,就會(huì)以輻射的形式返回源端,整個(gè)總線就會(huì)向外輻射電磁波。
將本文的設(shè)計(jì)應(yīng)用到線陣CCD縫隙測(cè)量系統(tǒng)中,經(jīng)過軟硬件測(cè)試,各個(gè)從機(jī)能夠接收到主機(jī)的命令并準(zhǔn)確的發(fā)出CCD測(cè)量的縫隙數(shù)據(jù),主機(jī)能夠接收到數(shù)據(jù)并計(jì)算出縫隙的大小,總體運(yùn)行良好,可靠性較高。
[1]李永,李芙玲,賀秀玲.基于PC機(jī)和AVR單片機(jī)的RS485通信系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].工礦自動(dòng)化,2008(1):108-110.
LI Yong, LI Fu-ling,HE Xiu-ling.Design and implement of RS-485 communication system based on PC and AVR MCU[J].Industry and Mine Automation,2008(1):108-110.
[2]耿立中,王鵬,馬騁,等.RS485高速數(shù)據(jù)傳輸協(xié)議的設(shè)計(jì)與實(shí)現(xiàn)[J].清華大學(xué)學(xué)報(bào) :自然科 學(xué)版,2008,48(8):1311-1314.
GENG Li-zhong, WANG Peng, MA Cheng,et al.Design and implement of RS-485 high speed data communications protocal [J].JournalofTsighua University:Sci&Tech,2008,48 (8):1311-1314.
[3]龔建偉,熊光明.Visual C++/Turbo C串口通信編程實(shí)踐[M].北京:電子工業(yè)出版社,2005.
[4]江海波,王卓然,耿德根.深入淺出AVR單片機(jī)[M].北京:中國(guó)電力出版社,2008.
[5]陳善林,楊承志,楊曉洪.基于CSerialPort類的PLC與上位計(jì)算機(jī)的串行通信 [J].云南民族大學(xué)學(xué)報(bào):自然科學(xué)版,2004,13(2):129-138.
CHEN Shan-lin,YANG Cheng-zhi,YANG Xiao-hong.Serial communication between PLC and computerbased on CSerialPort class[J].Journal of Yunnan Nationalities University:Natural Sciences Edition,2004,13(2):129-138.
[6]任海波,韓崇偉,李碩,等.CSerialPort類在定位定向數(shù)據(jù)采集系統(tǒng)中的應(yīng)用[J].火炮發(fā)射與控制學(xué)報(bào),2010(1):26-29.
REN Hai-bo,HAN Chong-wei,LI Shuo,et al.The application of CSerialPort class in the data acquisition system of location and orientatin[J].Journal of Gun Launch and Control,2010(1):26-29.