王中生,曹 梅
(西安工業(yè)大學 計算機科學與工程學院,陜西 西安 710032)
隨著城市的發(fā)展,車輛的增加,使人們出行越來越不便。如何能有效解決當前面臨的交通擁堵問題是公交系統(tǒng)目前需要重點解決的任務。筆者設計的系統(tǒng)通過ZigBee模塊來實現(xiàn)對車輛的定位,將車輛的現(xiàn)行信息傳輸回路由節(jié)點,通過串口通信與計算機相連,將數(shù)據(jù)顯示在屏幕上使調(diào)度人員能夠實時了解車輛行車信息,從而能夠有效地對道路擁堵狀況有所了解并進行及時的處理,對司機的行車情況及時了解。
ZigBee技術是一種短距離、低功耗的無線通信技術,采用IEEE802.15.4協(xié)議。其特點是近距離、低復雜度、自組織、低功耗、低數(shù)據(jù)速率、低成本。主要適合用于自動控制和遠程控制領域,可以嵌入各種設備。
串口通信是工業(yè)監(jiān)控系統(tǒng)中至關重要的環(huán)節(jié),主要采用基于RS232的串口開發(fā)。目前在Windows下實現(xiàn)串口通信主要有3種方式[1]:1)利用 MSComm控件串口通信編程;2)利用win32 API函數(shù)來實現(xiàn);3)利用CSerialPort類進行串口編程。本系統(tǒng)采用MSComm控件進行開發(fā)是因為它是Microsoft公司提供的簡化Windows下串行通信編程的ActiveX控件,通過串行端口發(fā)送和接收數(shù)據(jù),VC為其提供了使用RS232進行數(shù)據(jù)通信的所有協(xié)議,并提供了標準的事件處理函數(shù)和過程,軟件開發(fā)人員可以方便地通過屬性和方法的設置進行串口通信。
本系統(tǒng)由硬件系統(tǒng)與軟件系統(tǒng)組成。下位機采用ZigBee模塊進行數(shù)據(jù)的發(fā)送與接收,上位機采用VC++6.0開發(fā)軟件。如圖1所示。ZigBee模塊將車輛信息、站臺信息無線發(fā)送,避免了布線的麻煩。與其配套的上位機軟件是一個擁有良好界面的數(shù)據(jù)監(jiān)控和存儲中心。下位機主要完成數(shù)據(jù)的采集與發(fā)送,上位機完成數(shù)據(jù)分析與存儲。本系統(tǒng)將ZigBee模塊安裝到公交車上,通過ZigBee模塊的無線通信功能將車輛信息與到站信息經(jīng)由網(wǎng)關節(jié)點最終通過串口傳送給上位機,由界面直觀顯示給調(diào)入人員。并將車輛ID、線路名固定地寫入到ZigBee模塊中,發(fā)送數(shù)據(jù)時就將這些信息發(fā)送給其他ZigBee模塊;公交站牌上同樣也安裝ZigBee模塊,當其接收到公交車輛上的節(jié)點模塊發(fā)送的數(shù)據(jù)時,就將自己的站臺號加入該模塊的信息中并轉發(fā)給其他站牌節(jié)點模塊,判斷該發(fā)送信息是公交車輛上節(jié)點模塊發(fā)送還是站牌節(jié)點模塊發(fā)送,如果是公交車輛節(jié)點模塊發(fā)送的信息,判斷站臺號信息是否已經(jīng)加入到該模塊中,如果已經(jīng)加入就將其轉發(fā)給網(wǎng)關節(jié)點;如果未加入站臺號信息,就將自身的站臺號信息加入其中。如果是站牌節(jié)點模塊發(fā)送的數(shù)據(jù),就將其轉發(fā)給網(wǎng)關節(jié)點,網(wǎng)關節(jié)點匯集信息后將其通過串口傳輸給上位機,上位機程序將信息進行解碼后顯示給調(diào)度人員。

圖1 系統(tǒng)總體結構圖Fig.1 Overall structure diagram of system
主要進行數(shù)據(jù)的傳輸,對所收到的數(shù)據(jù)進行處理、分析、存儲。這里,下位機單片機將車輛ID、線路名、站臺號的十六進制碼傳輸給計算機,上位機需將這些字碼解碼后展示給調(diào)度人員。
在進行串口數(shù)據(jù)傳輸時,必須制定通信協(xié)議[2]。通過對系統(tǒng)的分析,幀格式為無奇偶校驗位,8位數(shù)據(jù)位,1位停止位,波特率為38 400 B/s幀格式如圖2所示。

圖2 系統(tǒng)幀格式Fig.2 Frame of system
為實現(xiàn)下位機數(shù)據(jù)能夠傳輸?shù)缴衔粰C上,本程序采用MSComm控件進行軟件開發(fā),MSComm控件提供了多種屬性,通過使用這些屬性,能夠方便地進行開發(fā)[3]。
數(shù)據(jù)接收模塊流程圖如圖3所示。
1)打開串口。使用 PortOpen()函數(shù);2)初始化串口,設置串口參數(shù);3)建立串口通信事件。通信控件提供了2種處理串口通信的方法:查詢法和事件驅使法。本系統(tǒng)中,采用事件驅使法實現(xiàn),當發(fā)生通信事件或錯誤時,將觸發(fā)OnComm事件。用戶將在OnComm事件中添加代碼,實現(xiàn)想要的功能。部分代碼如下:

圖3 數(shù)據(jù)接收模塊流程圖Fig.3 Flow chart of data receiver module

4)關閉串口。
數(shù)據(jù)從下位機傳過來后,需要進行分析、轉換等操作,從而得到所需的數(shù)據(jù)[4]。將數(shù)據(jù)按照規(guī)定的幀格式傳輸,每幀包含3個數(shù)據(jù),分別為車輛ID、線路名、站臺號,以十六進制形式表示。ZigBee[7]終端節(jié)點儲存的數(shù)據(jù)包含固定字節(jié)的車輛ID、線路名,而站臺號初始設為00x,當安裝在站牌上的ZigBee路由節(jié)點接收到數(shù)據(jù)后,判斷站臺號數(shù)據(jù)位是否為00x,如果是則認為該數(shù)據(jù)是由終端節(jié)點發(fā)送,在該位將自己的站臺號加入后轉發(fā)給其他節(jié)點;如果不是則認為該幀已經(jīng)加入了其他站臺號,轉發(fā)數(shù)據(jù)即可。
上位機接收到數(shù)據(jù)后,分離出其中的數(shù)據(jù)位,將車輛ID、線路名、站臺號依次取出其中的值,進行數(shù)據(jù)類型轉換后保存到數(shù)據(jù)庫中。數(shù)據(jù)處理模塊的流程圖如圖4所示。

圖4 數(shù)據(jù)處理模塊流程圖Fig.4 Flow chart of data processing module
完成對數(shù)據(jù)的實時監(jiān)控,將車輛到站信息直觀地顯示給調(diào)度人員,同時能夠對車輛信息、線路信息進行管理。調(diào)度人員還能查詢每天車輛的行進路線,從而對公交司機的考勤進行管理,如圖5所示。

圖5 系統(tǒng)主界面Fig.5 Main interface of system
為了方便數(shù)據(jù)的查詢,采用access數(shù)據(jù)庫作為存儲數(shù)據(jù)的工具。VC提供了多種方法連接數(shù)據(jù)庫,這里采用ADO連接方法[5]。ADO(ActiveX Data Objects)是一個用于存取數(shù)據(jù)源的COM組件,它提供了編程語言和統(tǒng)一數(shù)據(jù)訪問方式OLE DB的一個中間層。允許開發(fā)人員編寫訪問數(shù)據(jù)的代碼而不用關心數(shù)據(jù)庫是如何實現(xiàn)的。本系統(tǒng)采用ADO類連接數(shù)據(jù)庫,具體方法如下:
1)建立數(shù)據(jù)庫 在access里創(chuàng)建數(shù)據(jù)庫Bus.mdb,分別建立 4張表:BusT、LineT、GetDataT、TS。BusT 表中字段如下:ID(車輛 ID)、Name(線路名)、Stnum(站臺數(shù))。LineT 表中字段如下:lname(線路名)、sID(站臺號)、sname(站臺名)。GetDataT表中字段如下:bID(車輛 ID)、bNO(線路名)、LID(站臺名)、Ctime(車輛到達時間)、TS(趟數(shù))。
2)添加對ADO數(shù)據(jù)庫的支持 在文件stdafx.h中添加#import"c:program filescommon filessystemadomsado15.dll"no_namespace rename("EOF","adoEOF"),實現(xiàn) ADO 類的導入[6]。在數(shù)據(jù)處理函數(shù)中OnOnCommMscomm()完成對接收到的數(shù)據(jù)及接收到的時間存入數(shù)據(jù)庫的操作,在儲存數(shù)據(jù)時,通過對信息的過濾,將發(fā)送多條相同的信息只取出第一條,其余信息過濾掉。將公交車從起點到終點定位一趟,計算公交車當日一共跑了幾趟,從而對公交司機進行考核。部分代碼如下:

本系統(tǒng)能夠及時地將車輛信息與道路信息顯示給調(diào)度人員,從而對行車狀況進行及時的掌握與調(diào)控。經(jīng)過調(diào)試,該系統(tǒng)能夠將數(shù)據(jù)穩(wěn)定地傳輸?shù)缴衔粰C,方便進行監(jiān)控,其數(shù)據(jù)庫管理也具有良好的操作。根據(jù)相關顯示的信息,調(diào)度人員能夠對車輛進行及時調(diào)控與調(diào)度,具有一定的應用價值。
[1]龔建偉,熊光明.Visual C++/Turbo C串口通信編程實踐[M].北京:電子工業(yè)出版社,2004.
[2]謝維成,楊加國.單片機原理與應用及C51程序設計[M].2版.北京:清華大學出版社,2009.
[3]金衛(wèi)民.VC下利用串口進行數(shù)據(jù)通訊的研究[J].計算機工程與設計,2003,24(12):120-122.JIN Wei-ming.Research of data communication by using RS232 in VC[J].Computer Engineering and Design,2003,24(12):120-122.
[4]李現(xiàn)勇.Visual C++串口通信技術與工程實踐[M].北京:人民郵電出版社,2002.
[5]王莉,陽春華.基于VC++的串口通信設計及其應用[J].控制工程,2004,11(S1):89-92.WANG Li,YANG Chun-hua.Design of serial communication based on C++and its application[J].Control Engineering of China,2004,11(S1):89-92.
[6]宋坤,劉銳寧,李偉明.VC++開發(fā)技術大全[M].北京:人民郵電出版社,2007.
[7]陳孟元,凌有鑄,王冠凌,等.基于ZigBee技術的廣播電視授時無線網(wǎng)絡系統(tǒng)設計[J].工業(yè)儀表與自動化裝置 ,2010(1):18-20.CHEN Meng-yuan,LING You-zhu,WANG Gua-nling,et al.Design on broadcast television time wireless network system based on ZigBee technology[J].Industrial Instrumentation&Automation,2010(1):18-20.