久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標(biāo)題: CAN總線通信系統(tǒng)上位機(jī)通信軟件的設(shè)計(jì)開發(fā)教程 [打印本頁(yè)]

作者: HLXHLX    時(shí)間: 2018-8-2 14:53
標(biāo)題: CAN總線通信系統(tǒng)上位機(jī)通信軟件的設(shè)計(jì)開發(fā)教程
用VS2010開發(fā)CAN總線上位機(jī)的教程
目   次
1              緒論
1.1              研究背景
1.2              研究目的和意義
1.3              國(guó)內(nèi)外發(fā)展現(xiàn)狀
1.4              論文結(jié)構(gòu)安排
2              CAN總線協(xié)議分析
2.1              CAN-bus 規(guī)范V2.0 版本
2.2              CAN控制器SJA1000
2.3              本章小結(jié)
3              開發(fā)環(huán)境介紹
3.1              開發(fā)環(huán)境
3.2              CANUSB—Ⅰ/Ⅱ智能CAN接口卡
3.3              本章小結(jié)
4              CAN通信軟件設(shè)計(jì)
4.1              驅(qū)動(dòng)程序安裝
4.2              CAN接口卡函數(shù)庫(kù)說(shuō)明
4.3              界面設(shè)計(jì)
4.4              軟件功能實(shí)現(xiàn)
4.5              本章小結(jié)
5              測(cè)試及發(fā)布
5.1              軟件功能測(cè)試
5.2              程序發(fā)布
5.3              本章小結(jié)
結(jié)論
致謝
參考文獻(xiàn)

           
1          緒論
現(xiàn)場(chǎng)總線,就是應(yīng)用于工業(yè)現(xiàn)場(chǎng),采用總線方式連接多個(gè)設(shè)備,用于傳輸工業(yè)現(xiàn)場(chǎng)各種數(shù)據(jù)的一類通信系統(tǒng)[1]。CAN(Controller Area Network)總線是現(xiàn)場(chǎng)總線的一個(gè)分支,因其具有很高的可靠性和性能價(jià)格比,已經(jīng)成為國(guó)際標(biāo)準(zhǔn),在工業(yè)過(guò)程監(jiān)控設(shè)備的互連方面得到廣泛應(yīng)用,受到工業(yè)界的廣泛重視,并已被公認(rèn)為幾種最有前途的現(xiàn)場(chǎng)總線之一。
1.1      研究背景
隨著計(jì)算機(jī)硬件、軟件技術(shù)及集成電路技術(shù)的迅速發(fā)展,工業(yè)控制系統(tǒng)已成為計(jì)算機(jī)技術(shù)應(yīng)用領(lǐng)域中最具活力的一個(gè)分支,并取得了巨大進(jìn)步。由于對(duì)系統(tǒng)可靠性和靈活性的高要求,工業(yè)控制系統(tǒng)的發(fā)展主要表現(xiàn)為:控制多元化,系統(tǒng)面向分散化,即負(fù)載分散、功能分散、危險(xiǎn)分散和地域分散。分散式工業(yè)控制系統(tǒng)就是為適應(yīng)這種需要而發(fā)展起來(lái)的。這類系統(tǒng)是以微型機(jī)為核心,將5C技術(shù)——Computer(計(jì)算機(jī)技術(shù))、Control(自動(dòng)控制技術(shù))、Communication(通信技術(shù))、CRT(顯示技術(shù))和Change(轉(zhuǎn)換技術(shù))緊密結(jié)合的產(chǎn)物。它在適應(yīng)范圍、可擴(kuò)展性、可維護(hù)性以及抗故障能力等方面,較之分散型儀表控制系統(tǒng)和集中型計(jì)算機(jī)控制系統(tǒng)都具有明顯的優(yōu)越性。典型的分散式控制系統(tǒng)有現(xiàn)場(chǎng)設(shè)備、接口與計(jì)算設(shè)備以及通信設(shè)備組成,現(xiàn)場(chǎng)總線(Field bus)就是在這種背景下產(chǎn)生的[2]。
1.2      研究目的和意義
從19世紀(jì)發(fā)明汽車以來(lái),人們就一直在乘坐的舒適性、安全性和操控性方面不停地對(duì)其進(jìn)行改革和創(chuàng)新,車上的電子設(shè)備也越來(lái)越多。這些電子設(shè)備大多是需要協(xié)同工作的,這就要求各部件之間能互相通信[1]。
為了解決汽車通信問(wèn)題,CAN—bus應(yīng)運(yùn)而生,憑借可靠、實(shí)時(shí)、經(jīng)濟(jì)和靈活的特點(diǎn),CAN總線很快在其他行業(yè)得到廣泛應(yīng)用,特別是在工業(yè)控制領(lǐng)域更是如魚得水。現(xiàn)在CAN—bus總線已經(jīng)成為全球范圍內(nèi)最重要的現(xiàn)場(chǎng)總線之一,甚至引領(lǐng)著現(xiàn)場(chǎng)總線的發(fā)展。
工業(yè)控制系統(tǒng)涉及眾多軟、硬件模塊,給程序的設(shè)計(jì)和調(diào)試帶來(lái)一定難度。尤其作為上、下位機(jī)間聯(lián)系紐帶的CAN總線通信部分,一旦在整個(gè)系統(tǒng)運(yùn)行期間發(fā)生問(wèn)題,若沒有良好的人機(jī)界面和測(cè)試手段,將很難及時(shí)準(zhǔn)確地找到并排除故障。同樣,在控制系統(tǒng)的研制過(guò)程中,為了盡可能地減少故障和縮小故障范圍,也應(yīng)設(shè)計(jì)相應(yīng)的測(cè)試軟件來(lái)具體負(fù)責(zé)CAN總線通信及接口部分的調(diào)試、運(yùn)行任務(wù)。故此,本課題就如何利用VC設(shè)計(jì)CAN總線測(cè)試軟件進(jìn)行介紹。
1.3      國(guó)內(nèi)外發(fā)展現(xiàn)狀
自從Bosch與Intel公司于1986年正式發(fā)布CAN—bus通信方式,寶馬(BMW)公司很快于1989年推出第一款使用CAN—bus通信的汽車,從此  CAN—bus開始了其輝煌的歷程:(1)1990年,奔馳公司發(fā)布了第一輛使用CAN—bus的轎車,現(xiàn)在幾乎每一輛新生產(chǎn)的汽車均裝配有CAN—bus網(wǎng)絡(luò);(2)1993年,CAN—bus總線被制定成為國(guó)際標(biāo)準(zhǔn)ISO11898(高速應(yīng)用)和ISO11519(低速應(yīng)用);(3)1994年,歐洲成立了CiA廠商協(xié)會(huì),美洲成立了ODVA廠商協(xié)會(huì),專門支持CAN—bus總線的兩大應(yīng)用層協(xié)議——CANopen協(xié)議與DeviceNet協(xié)議[3]。
在CiA的努力推廣下,CAN技術(shù)在汽車電子控制系統(tǒng)、電梯控制系統(tǒng)、安全監(jiān)控系統(tǒng)、醫(yī)療儀器、紡織機(jī)械、船舶運(yùn)輸?shù)确矫婢玫搅藦V泛的應(yīng)用。現(xiàn)已有400多家公司加入了CiA,CiA已成為全球應(yīng)用CAN技術(shù)的權(quán)威。
國(guó)內(nèi)在CAN總線方面的研究和應(yīng)用于國(guó)外相比還存在明顯的差距,體現(xiàn)在兩個(gè)方面:(1)國(guó)內(nèi)在自主研究和開發(fā)汽車電子CAN網(wǎng)絡(luò)方面尚處于試驗(yàn)和起步階段,國(guó)內(nèi)絕大部分的汽車還沒有采用汽車總線設(shè)計(jì);(2)國(guó)內(nèi)汽車合資企業(yè)不少已采用CAN總線技術(shù),但核心技術(shù)掌握在外商手中。為順應(yīng)世界汽車工業(yè)發(fā)展的趨勢(shì),我國(guó)也相應(yīng)加強(qiáng)了對(duì)CAN總線的研究,并開發(fā)具有自主知識(shí)產(chǎn)權(quán)的CAN總線產(chǎn)品。
CAN技術(shù)已應(yīng)用于家用電器和智能樓宇以及小區(qū)建設(shè)中。隨著無(wú)線技術(shù)的完善和將無(wú)線技術(shù)應(yīng)用到CAN總線系統(tǒng)中研究的不斷深入,可以樂(lè)觀地預(yù)計(jì),未來(lái)CAN總線技術(shù)的應(yīng)用將無(wú)處不在,虛擬的CAN總線即將誕生[5]。
1.4      論文結(jié)構(gòu)安排
本文第一章介紹了CAN總線的研究背景和國(guó)內(nèi)外發(fā)展現(xiàn)狀,并介紹本課題研究的目的和意義。第二章簡(jiǎn)單介紹了CAN總線通信規(guī)范和SJA1000控制器。第三章簡(jiǎn)單介紹了開發(fā)環(huán)境和CAN接口卡。第四章詳細(xì)介紹了軟件的設(shè)計(jì)過(guò)程,包括驅(qū)動(dòng)安裝、接口卡函數(shù)庫(kù)說(shuō)明、界面設(shè)計(jì)、功能分析與設(shè)計(jì)。第五章介紹了軟件的測(cè)試及程序的發(fā)布。
2          CAN總線協(xié)議分析2.1      CAN-bus 規(guī)范V2.0 版本
CAN 規(guī)范技術(shù)規(guī)范由兩部分組成:
• A 部分:CAN 的報(bào)文格式說(shuō)明(按CAN1.2 規(guī)范定義)。
• B 部分:標(biāo)準(zhǔn)格式和擴(kuò)展格式的說(shuō)明。
2.1.1      CAN的分層結(jié)構(gòu)
在CAN V2.0A里,CAN被細(xì)分為三個(gè)層次:對(duì)象層、傳輸層、物理層。
而在PartB中,CAN被細(xì)分為兩個(gè)層次:數(shù)據(jù)鏈路層(邏輯鏈路控制子層LLC、媒體訪問(wèn)控制子層MAC)、物理層。
2.1.2      報(bào)文傳輸
(1)幀類型
報(bào)文傳輸由5種類型的幀所表示和控制,它們分別是數(shù)據(jù)幀、遠(yuǎn)程幀、錯(cuò)誤幀、過(guò)載幀和幀間隔,其用途如表2.1所列。

表2.1 幀的類型及用途

幀類型

幀用途

數(shù)據(jù)幀

用于發(fā)送節(jié)點(diǎn)向接受節(jié)點(diǎn)傳送數(shù)據(jù),是使用最多的幀類型

遠(yuǎn)程幀

用于接受節(jié)點(diǎn)向某個(gè)發(fā)送節(jié)點(diǎn)請(qǐng)求數(shù)據(jù)

錯(cuò)誤幀

用于檢測(cè)出通信錯(cuò)誤(如校驗(yàn)錯(cuò)誤)時(shí)向其他節(jié)點(diǎn)發(fā)送通知

過(guò)載幀

用以在先行的和后續(xù)的數(shù)據(jù)幀(或遠(yuǎn)程幀)之間提供一附加的延時(shí)

幀間隔

用于將數(shù)據(jù)幀和遠(yuǎn)程幀與前面的幀分離開來(lái)

1) 數(shù)據(jù)幀
數(shù)據(jù)幀由7 個(gè)不同的位場(chǎng)組成:幀起始、仲裁場(chǎng)、控制場(chǎng)、數(shù)據(jù)場(chǎng)、CRC 場(chǎng)、應(yīng)答場(chǎng)、幀結(jié)尾。數(shù)據(jù)幀各段的功能如表2.2所列。

表2.2 數(shù)據(jù)幀各段的功能

段名

段長(zhǎng)度/位

說(shuō)明

幀起始

1

表示數(shù)據(jù)幀開始,由單個(gè)顯性位構(gòu)成,在總線空閑時(shí)才允許發(fā)送

仲裁場(chǎng)

標(biāo)準(zhǔn)幀

12

表示該幀的優(yōu)先級(jí),由11位ID碼和1位遠(yuǎn)程幀標(biāo)志位(RTR)組成

擴(kuò)展幀

32

表示該幀的優(yōu)先級(jí),由29位ID碼、1位替代遠(yuǎn)程幀請(qǐng)求位(SRR)、1位標(biāo)志位擴(kuò)展位(IDE)和1位遠(yuǎn)程幀標(biāo)志位(RTR)組成

控制場(chǎng)

6

表示數(shù)據(jù)段數(shù)據(jù)長(zhǎng)度的編碼和保留位

數(shù)據(jù)場(chǎng)

0—8

數(shù)據(jù)內(nèi)容,每字節(jié)為8位,具體字節(jié)數(shù)在控制段中體現(xiàn)

CRC場(chǎng)

16

檢查幀的傳輸錯(cuò)誤,范圍包括從幀起始到數(shù)據(jù)段的所有內(nèi)容(不包括填充位)

ACK場(chǎng)

2

其他接受節(jié)點(diǎn)確認(rèn)該幀被正常接收

幀結(jié)束

7

表示數(shù)據(jù)幀結(jié)束

2) 遠(yuǎn)程幀
遠(yuǎn)程幀由6 個(gè)不同的位場(chǎng)組成:幀起始、仲裁場(chǎng)、控制場(chǎng)、CRC 場(chǎng)、應(yīng)答場(chǎng)、幀結(jié)尾。
3) 錯(cuò)誤幀
錯(cuò)誤幀由兩個(gè)不同的場(chǎng)組成。第一個(gè)場(chǎng)用作為不同站提供的錯(cuò)誤標(biāo)志的疊加。第二個(gè)場(chǎng)是錯(cuò)誤界定符。錯(cuò)誤標(biāo)志有兩種形式,主動(dòng)錯(cuò)誤標(biāo)志和被動(dòng)錯(cuò)誤標(biāo)志。錯(cuò)誤界定符包括8 個(gè)“隱性”的位。
4) 過(guò)載幀
過(guò)載幀包括兩個(gè)位場(chǎng):過(guò)載標(biāo)志和過(guò)載界定符。
5) 幀間空間
數(shù)據(jù)幀(或遠(yuǎn)程幀)與其前面幀的隔離是通過(guò)幀間空間實(shí)現(xiàn)的,無(wú)論其前面的幀為何類型(數(shù)據(jù)幀、遠(yuǎn)程幀、錯(cuò)誤幀、過(guò)載幀)。所不同的是,過(guò)載幀與錯(cuò)誤幀之前沒有幀間空間,多個(gè)過(guò)載幀之間也不是由幀間空間隔離的。
(2)發(fā)送器/接收器的定義
發(fā)送器:產(chǎn)生報(bào)文的單元被稱之為報(bào)文的“發(fā)送器”。此單元保持作為報(bào)文發(fā)送器直到總線出現(xiàn)空閑或此單元失去仲裁為止。
接收器:如果有一單元不作為報(bào)文的發(fā)送器并且總線也不空閑,則這一單元就被稱之為報(bào)文的“接收器”。
2.1.3      報(bào)文檢驗(yàn)
校驗(yàn)報(bào)文是否有效的時(shí)間點(diǎn),對(duì)于發(fā)送器與接收器是各不相同的。
對(duì)于發(fā)送器:如果直到幀的末尾位均沒有錯(cuò)誤,則此報(bào)文對(duì)于發(fā)送器有效。如果報(bào)文破損,則報(bào)文會(huì)根據(jù)優(yōu)先權(quán)自動(dòng)重發(fā)。為了能夠和其他信息競(jìng)爭(zhēng)總線,重新傳輸必須在總線空閑時(shí)啟動(dòng)。
對(duì)于接收器:如果直到一最后的位(除了幀末尾位)均沒有錯(cuò)誤,則報(bào)文對(duì)于接收器有效。
2.1.4      編碼
位流編碼:幀的部分,諸如幀起始、仲裁場(chǎng)、控制場(chǎng)、數(shù)據(jù)場(chǎng)以及CRC序列,均通過(guò)位填充的方法編碼。
數(shù)據(jù)幀或遠(yuǎn)程幀(CRC界定符、應(yīng)答場(chǎng)和幀末尾)的剩余位場(chǎng)形式相同,不填充。錯(cuò)誤幀和過(guò)載幀的形式也相同,但并不通過(guò)位填充的方法進(jìn)行編碼。
報(bào)文里的位流采用不歸零編碼(NRZ),這就是說(shuō),在整個(gè)位時(shí)間里,位電平要么為“顯性”,要么為“隱性”。
2.1.5      錯(cuò)誤處理
錯(cuò)誤檢測(cè):有5種不同的錯(cuò)誤類型(這5種錯(cuò)誤不會(huì)相互排斥):位錯(cuò)誤、填充錯(cuò)誤、CRC錯(cuò)誤、形式錯(cuò)誤、應(yīng)答錯(cuò)誤
錯(cuò)誤標(biāo)志:檢測(cè)到錯(cuò)誤條件的站通過(guò)發(fā)送錯(cuò)誤標(biāo)志指示錯(cuò)誤。
2.1.6      故障界定
至于故障界定,單元的狀態(tài)可能為以下三種之一:
錯(cuò)誤主動(dòng):可以正常地參與總線通訊并在錯(cuò)誤被檢測(cè)到時(shí)發(fā)出主動(dòng)錯(cuò)誤標(biāo)志。
錯(cuò)誤被動(dòng):不允許發(fā)送主動(dòng)錯(cuò)誤標(biāo)志。
總線關(guān)閉:不允許在總線上有任何的影響(比如,關(guān)閉輸出驅(qū)動(dòng)器)。
2.1.7      位定時(shí)要求
標(biāo)稱位速率:標(biāo)稱位速率為一理想的發(fā)送器在沒有重新同步的情況下每秒發(fā)送的位數(shù)量。
標(biāo)稱位時(shí)間:標(biāo)稱位時(shí)間=1/標(biāo)稱位速率
可以把標(biāo)稱位時(shí)間劃分成幾個(gè)不重疊的時(shí)間片段,它們是:同步段、傳播時(shí)間段、相位緩沖段1、相位緩沖段2。
2.1.8      報(bào)文濾波
在CAN2.0B中,還增加了有關(guān)報(bào)文濾波的定義。
報(bào)文濾波取決于整個(gè)識(shí)別符。允許在報(bào)文濾波中將任何的識(shí)別符位設(shè)置為“不考慮”的可選屏蔽寄存器,可以選擇多組的識(shí)別符,使之被映射到隸屬的接收緩沖器里。
如果使用屏蔽寄存器,它的每一個(gè)位必須是可編程的,即,他們能夠被允許或禁止報(bào)文濾波。屏蔽寄存器的長(zhǎng)度可以包含整個(gè)識(shí)別符,也可以包含部分的識(shí)別符。
2.1.9      振蕩器容差
由于給定的最大的振蕩器,其容差為1.58%,因此憑經(jīng)驗(yàn)可將陶瓷諧振器使用在傳輸率高達(dá)125kbit/s的應(yīng)用罩。
為了滿足CAN協(xié)議的整個(gè)總線速度范圍,需要使用晶振。具有最高振蕩準(zhǔn)確度要求的芯片,決定了其他節(jié)點(diǎn)的振蕩準(zhǔn)確度。
2.2      CAN控制器SJA1000
下位機(jī)的CAN總線網(wǎng)絡(luò)接口使用Philips公司的SJA1000芯片,SJA1000是一個(gè)獨(dú)立的CAN控制器,具有一系列先進(jìn)的功能,適合于多種應(yīng)用,特別在系統(tǒng)優(yōu)化、診斷和維護(hù)方面非常重要。
SJA1000具有完成CAN總線通信協(xié)議所要求的全部特性,它與獨(dú)立CAN總線控制的PCA82C200完全兼容,并有支持CAN2.0B協(xié)議、擴(kuò)展接收緩沖器、增強(qiáng)錯(cuò)誤處理能力和增強(qiáng)驗(yàn)收濾波功能等新增功能。
SJA1000可以直接進(jìn)行CAN總線互聯(lián),而PC機(jī)作為上位機(jī),是通過(guò)USB電纜連接到CAN接口卡上的,這里我們使用的是普創(chuàng)電子的CANUSB—Ⅱ工業(yè)級(jí)雙路智能接口卡。該接口卡中的CAN總線數(shù)據(jù)收發(fā)也是由SJA1000CAN控制器和82C250CAN收發(fā)器完成的,主機(jī)通過(guò)USB電纜來(lái)訪問(wèn)CAN控制器,從而實(shí)現(xiàn)數(shù)據(jù)通信。
2.3      本章小結(jié)
本章主要介紹了CAN總線通信系統(tǒng)上位機(jī)通信軟件的設(shè)計(jì)所涉及的基本知識(shí),包括CAN—bus規(guī)范和CAN控制器SJA1000,有了這些知識(shí),才能保證軟件設(shè)計(jì)得以順利開展。
3          開發(fā)環(huán)境介紹3.1      開發(fā)環(huán)境
CAN總線通信系統(tǒng)上位機(jī)通信軟件的設(shè)計(jì)應(yīng)具有直觀的窗口外觀,豐富、人性化的友好界面,便于操作和維護(hù)。而Visual C++6.0編譯器提供了強(qiáng)大的輔助工具集,利用這些工具可以很方便的設(shè)計(jì)出本課題所要求的應(yīng)用程序。
利用Visual C++6.0開發(fā)應(yīng)用程序時(shí),主要有兩種方法,一種是利用Windows本身提供的API函數(shù)編程,另一種是直接使用Miscrosoft提供的MFC類庫(kù)編程。本課題使用的是MFC類庫(kù)編程。
MFC類庫(kù)是由Microsoft公司提供的用來(lái)編寫Windows應(yīng)用程序的C++類集合,在該類集合封裝了Windows大部分編程對(duì)象和與它們相關(guān)的操作。MFC為用戶提供了一個(gè)Windows環(huán)境下的應(yīng)用程序框架和創(chuàng)建應(yīng)用程序的組件,使用這個(gè)應(yīng)用程序框架和組件,可以輕松地編寫出各種不同的應(yīng)用程序。
在Visual C++6.0中,可以利用MFC AppWizard應(yīng)用程序向?qū)Э焖俚貏?chuàng)建一個(gè)標(biāo)準(zhǔn)的Windows應(yīng)用程序框架,只需在此基礎(chǔ)上添加實(shí)現(xiàn)特定功能的程序代碼就能編寫出相應(yīng)的Windows應(yīng)用程序。該應(yīng)用程序框架類型中包含了三種最基本、最常用的應(yīng)用程序類型:?jiǎn)挝臋n、多文檔和基于對(duì)話框的應(yīng)用程序。基于對(duì)話框應(yīng)用程序功能簡(jiǎn)單、結(jié)構(gòu)緊湊,執(zhí)行速度快,程序源代碼少,開發(fā)調(diào)試容易,符合本課題需求,故本課題采用基于對(duì)話框應(yīng)用程序。
3.2      CANUSB—Ⅰ/Ⅱ智能CAN接口卡3.2.1      產(chǎn)品概述
CANUSB—Ⅰ/Ⅱ智能CAN接口卡兼容USB1.1和USB2.0總線,帶有1路/2路CAN接口的工業(yè)級(jí)智能型CAN數(shù)據(jù)接口卡。采用CANUSB—Ⅰ/Ⅱ智能CAN接口卡,PC可以通過(guò)USB總線連接至CAN網(wǎng)絡(luò),構(gòu)成實(shí)驗(yàn)室、工業(yè)控制、智能小區(qū)等CAN網(wǎng)絡(luò)領(lǐng)域中數(shù)據(jù)處理、數(shù)據(jù)采集。
CANUSB—Ⅰ/Ⅱ智能CAN接口卡是CAN產(chǎn)品開發(fā)、CAN數(shù)據(jù)分析的強(qiáng)大工具;同時(shí),具有體積小、即插即用等特點(diǎn),也是便攜式系統(tǒng)用戶的最佳選擇。
3.2.2      智能CAN接口卡硬件接口描述
CANUSB—Ⅰ/Ⅱ智能CAN接口卡集成2路CAN通道,每一路通道都是獨(dú)立的,可以用于連接一個(gè)CAN—bus網(wǎng)絡(luò)或者CAN—bus接口的設(shè)備。CANUSB—Ⅰ/Ⅱ智能CAN接口卡布局如下:

圖3.1 CANUSB—Ⅰ/Ⅱ智能CAN接口卡外圍端子

2路CAN—bus通道由1個(gè)10Pin接線端子引出,接線端子的引腳詳細(xì)定義如下表所示:

表3.1 CANUSB—Ⅰ/Ⅱ接口卡的CAN—bus信號(hào)分配

引腳

端口

名稱

功能

1

CAN1

CANL1

CANL1信號(hào)線

2

R1-

終端電阻(內(nèi)部連接到CANL1)

3

PG

屏蔽線

4

R1+

終端電阻(內(nèi)部連接到CANH1)

5

CANH1

CANH1信號(hào)線

6

CAN0

CANL0

CANL0信號(hào)線

7

R0-

終端電阻(內(nèi)部連接到CANL0)

8

PG

屏蔽線

9

R0+

終端電阻(內(nèi)部連接到CANH0)

10

CANH0

CANH0信號(hào)線

3.3      本章小結(jié)
本章介紹了CAN總線通信系統(tǒng)上位機(jī)通信軟件的開發(fā)環(huán)境和CANUSB—Ⅰ/Ⅱ智能CAN接口卡。為了獲得直觀的窗口外觀,豐富、人性化的友好界面,本課題利用Visual C++6.0下的MFC類庫(kù)開發(fā)程序。
4          CAN通信軟件設(shè)計(jì)4.1      驅(qū)動(dòng)程序安裝
CANUSB—Ⅰ/Ⅱ智能CAN接口卡使用USB直接供電并提供智能驅(qū)動(dòng)安裝包,安裝步驟如下:
點(diǎn)擊產(chǎn)品光盤的“\CANUSB\Drivers”目錄下的安裝包安裝驅(qū)動(dòng);
將CANUSB—Ⅰ/Ⅱ智能CAN接口卡通過(guò)USB電纜連接到計(jì)算機(jī),提示發(fā)現(xiàn)新硬件,選擇自動(dòng)安裝軟件即可。
4.2      CAN接口卡函數(shù)庫(kù)說(shuō)明4.2.1      函數(shù)庫(kù)數(shù)據(jù)結(jié)構(gòu)定義
(1)初始化CAN數(shù)據(jù)類型
typedef struct _INIT_CONFIG
{   DWORD  AccCode;//驗(yàn)收碼
DWORD  AccMask;//屏蔽碼
DWORD  Reserved;//保留
UCHAR  Filter;//濾波方式
UCHAR  Baudrate;//波特率
UCHAR  Mode;//模式

} VCI_INIT_CONFIG,*PVCI_INIT_CONFIG;

(2)CAN信息幀的數(shù)據(jù)類型
typedef struct _VCI_CAN_OBJ

{  BYTE CANIndex;//接受的數(shù)據(jù)幀來(lái)自哪個(gè)通道 =0時(shí)CAN0通道 =1時(shí)CAN1通道

DWORD ID;//報(bào)文ID

BYTE SendType;//發(fā)送幀類型,=0時(shí)為正常發(fā)送,=1時(shí)為自發(fā)自收,只有在此幀為發(fā)送幀時(shí)有意義。

BYTE ExternFlag;//是否是擴(kuò)展幀

BYTE RemoteFlag;//是否是遠(yuǎn)程幀

BYTE DataLen; //數(shù)據(jù)長(zhǎng)度(<=8,即Data的長(zhǎng)度

BYTE Data[8]; //報(bào)文的數(shù)據(jù)

}VCI_CAN_OBJ,*PVCI_CAN_OBJ;
4.2.2      接口函數(shù)說(shuō)明
①BOOL __stdcall VCI_OpenDevice(DWORD DevIndex);//打開設(shè)備
②BOOL __stdcall VCI_CloseDevice(DWORD DevIndex);//關(guān)閉設(shè)備
③BOOL __stdcall VCI_InitCAN(DWORD DevIndex,DWORD CANIndex,PVCI_INIT_CONFIG InitConfig);//初始化CAN
④BOOL __stdcall VCI_StartCAN(DWORD DevIndex ,DWORD CANIndex);//啟動(dòng)CAN設(shè)備
⑤BOOL __stdcall VCI_ResetCAN(DWORD DevIndex ,DWORD CANIndex);//復(fù)位CAN設(shè)備
⑥BOOL __stdcall VCI_Transmit(DWORD DevIndex ,DWORD CANIndex, VCI_CAN_OBJ *SendData );//發(fā)送一幀數(shù)據(jù)
⑦DWORD __stdcall VCI_Receive(DWORD DevIndex ,PVCI_CAN_OBJ pReceive , DWORD Len , DWORD WaitTime);//接收數(shù)據(jù)
⑧BOOL __stdcall VCI_ReadDevSn(DWORD DevIndex, PCHAR DevSn);//讀取序列號(hào)
其中:
DevIndex  設(shè)備索引號(hào),有一個(gè)設(shè)備時(shí)索引號(hào)為0,有兩個(gè)可以為0或1;

     CANIndex  第幾路CAN;

      InitConfig  初始化參數(shù)結(jié)構(gòu);
      SendData指向信息幀結(jié)構(gòu)體;
      pReceive用來(lái)接收的數(shù)據(jù)幀結(jié)構(gòu)體數(shù)組的首指針;
      Len       讀取多少幀的數(shù)據(jù);
      WaitTime  =0時(shí)為無(wú)限等待;>0時(shí)等待超時(shí)時(shí)間,以毫秒為單位;
      DevSn  序列號(hào);
      返回值  為1表示操作成功,0表示操作失敗;
4.2.3      接口函數(shù)庫(kù)使用方法
首先,把庫(kù)函數(shù)文件都放在工作目錄下。總共有四個(gè)文件CAN_TO_USB.h,CAN_TO_USB.lib,SiUSBXp.dll,CAN_TO_USB.dll。
VC調(diào)用動(dòng)態(tài)庫(kù)的方法:
(1)在.cpp中包含CAN_TO_USB.h頭文件;
(2)在工程文件中加入CAN_TO_USB.lib文件。
4.2.4      接口函數(shù)庫(kù)使用流程

圖4.1  接口函數(shù)庫(kù)使用流程

4.3      界面設(shè)計(jì)
CAN總線通信系統(tǒng)上位機(jī)通信軟件的設(shè)計(jì)目標(biāo)是對(duì)CAN總線的運(yùn)行狀態(tài)和通信能力進(jìn)行有效的測(cè)試,要求能正確識(shí)別CAN設(shè)備并打開CAN通道,可封裝CAN報(bào)文進(jìn)行發(fā)送,可接收CAN數(shù)據(jù)幀,并能對(duì)數(shù)據(jù)幀進(jìn)行解析,在數(shù)據(jù)列表中顯示報(bào)文的相關(guān)參數(shù)信息(如:幀ID、幀格式、幀類型、DLC值以及幀數(shù)據(jù)等參數(shù)),并具有過(guò)濾功能。具體有以下幾個(gè)功能模塊:設(shè)備連接、設(shè)備啟動(dòng)、設(shè)備復(fù)位、幀封裝與發(fā)送、幀接收與解析以及清除顯示。
4.3.1      界面布局設(shè)計(jì)
打開MFC App Wizard(exe)創(chuàng)建一個(gè)基于對(duì)話框的應(yīng)用程序,項(xiàng)目名為Test。打開對(duì)話框,按照軟件功能要求用控件編輯器添加相應(yīng)控件,設(shè)置控件屬性,打開類向?qū)В瑸榻缑嫔细骺丶砑訉?duì)應(yīng)的成員變量。設(shè)計(jì)完成后的界面如圖3所示。表4.1列出了CAN0通道各個(gè)控件屬性及成員變量的設(shè)置。

圖4.2  CAN總線通信系統(tǒng)上位機(jī)通信軟件界面設(shè)計(jì)

表4.1  CAN0通道控件屬性及成員變量的設(shè)置

控件名

控件ID

標(biāo)題

變量類型

變量名

靜態(tài)文本

IDC_STATIC

設(shè)備序號(hào)

組合框

IDC_COMBO_DEVINDEX

CComboBox

m_ComboDevindex

按鈕

IDC_BUTTON_CONNECT0

連接

按鈕

IDC_BUTTON_CONNECT1

啟動(dòng)通道

按鈕

IDC_BUTTON_RESETCAN0

復(fù)位CAN

按鈕

IDC_BUTTON_SEND0

發(fā)送

按鈕

IDC_BUTTON_CLEAR0

清除顯示

組框

IDC_STATIC

初始化CAN0參數(shù)

靜態(tài)文本

IDC_STATIC

濾波方式:

組合框

IDC_COMBO_FILTERTYPE0

CComboBox

m_ComboFilterType0

靜態(tài)文本

IDC_STATIC

波特率:

組合框

IDC_COMBO_BAUDRATE0

CComboBox

m_ComboBaudrate

靜態(tài)文本

IDC_STATIC

模式:

組合框

IDC_COMBO_MODE0

CComboBox

m_ComboMode0

靜態(tài)文本

IDC_STATIC

屏蔽碼:源節(jié)點(diǎn):0x

編輯框

IDC_EDIT_MASK0

CString

m_EditMask0

靜態(tài)文本

IDC_STATIC

目的節(jié)點(diǎn):0x

編輯框

IDC_EDIT_MASKM0

CString

m_EditMaskM0

靜態(tài)文本

IDC_STATIC

響應(yīng)標(biāo)示符:

組合框

IDC_COMBO_MASKX0

CComboBox

m_ComboMaskX0

靜態(tài)文本

IDC_STATIC

功能碼:0x

編輯框

IDC_EDIT_MASKG0

CString

m_EditMaskG0

靜態(tài)文本

IDC_STATIC

資源節(jié)點(diǎn)編號(hào):0x

編輯框

IDC_EDIT_MASKZ0

CString

m_EditMaskZ0

靜態(tài)文本

IDC_STATIC

驗(yàn)收碼:源節(jié)點(diǎn):0x

編輯框

IDC_EDIT_CODE0

CString

m_EditCode0

靜態(tài)文本

IDC_STATIC

目的節(jié)點(diǎn):0x

編輯框

IDC_EDIT_CODEM0

CString

m_EditCodeM0

靜態(tài)文本

IDC_STATIC

響應(yīng)標(biāo)示符:

組合框

IDC_COMBO_CODEX0

CComboBox

m_ComboCodeX0

靜態(tài)文本

IDC_STATIC

功能碼:0x

編輯框

IDC_EDIT_CODEG0

CString

m_EditCodeG0

靜態(tài)文本

IDC_STATIC

資源節(jié)點(diǎn)編號(hào):0x

編輯框

IDC_EDIT_CODEZ0

CString

m_EditCodeZ0

靜態(tài)文本

IDC_STATIC

發(fā)送數(shù)據(jù)幀

靜態(tài)文本

IDC_STATIC

發(fā)送格式:

組合框

IDC_COMBO_SENDTYPE0

CComboBox

m_ComboSendType0

靜態(tài)文本

IDC_STATIC

幀類型:

組合框

IDC_COMBO_SENDFRAMETYPE0

CComboBox

m_ComboSendFrmType0

靜態(tài)文本

IDC_STATIC

幀格式:

組合框

IDC_COMBO_SENDFRAMEFORMAT0

CComboBox

m_ComboSendFrmFmt0

靜態(tài)文本

IDC_STATIC

數(shù)據(jù)

編輯框

IDC_EDIT_SENDDATA0

CString

m_EditSendData0

靜態(tài)文本

IDC_STATIC

幀ID:源節(jié)點(diǎn):0x

編輯框

IDC_EDIT_SENDFRAMEID0

CString

m_EditSendFrmID0

靜態(tài)文本

IDC_STATIC

目的節(jié)點(diǎn):0x

編輯框

IDC_EDIT_SENDFRAMEIDM0

CString

m_EditSendFrmIDM0

靜態(tài)文本

IDC_STATIC

響應(yīng)標(biāo)示符:

組合框

IDC_COMBO_SENDFRAMEIDX0

CComboBox

m_ComboSendFrmIDX0

靜態(tài)文本

IDC_STATIC

功能碼:0x

編輯框

IDC_EDIT_SENDFRAMEIDG0

CString

m_EditSendFrmIDG0

靜態(tài)文本

IDC_STATIC

資源節(jié)點(diǎn)編號(hào):0x

編輯框

IDC_EDIT_SENDFRAMEIDZ0

CString

m_EditSendFrmIDZ0

組框

IDC_STATIC

信息

列表框

IDC_LIST_INFO0

CListBox

m_ListInfo0

CAN1通道各個(gè)控件屬性及成員變量設(shè)置同CAN0通道,就不再贅述。
4.3.2      對(duì)話框初始化
在CTestDlg類的OnInitDialog()函數(shù)中添加代碼, 在對(duì)話框初始化的時(shí)候被調(diào)用,響應(yīng)WM_INITDIALOG消息,用于完成除基本的創(chuàng)建之外的額外的初始化工作。將額外的初始化代碼在這個(gè)函數(shù)中實(shí)現(xiàn)。
(1)組合框初始化
組合框的設(shè)置以控件IDC_COMBO_FILTERTYPE0為例。要求控件IDC_COMBO_FILTERTYPE0能下拉顯示兩種濾波方式:?jiǎn)螢V波和雙濾波,默認(rèn)顯示單濾波。故在OnInitDialog()函數(shù)中添加以下代碼:
//濾波方式的添加
m_ComboFilterType0.AddString("單濾波");
m_ComboFilterType0.AddString("雙濾波");
//設(shè)置第0行內(nèi)容為顯示的內(nèi)容,即濾波方式默認(rèn)為單濾波
m_ComboFilterType0.SetCurSel(0);
其他組合框以相同方式按要求設(shè)置。
(2)編輯框初始化
編輯框的設(shè)置以控件IDC_EDIT_MASK0為例。控件IDC_EDIT_MASK0顯示的是屏蔽碼的源節(jié)點(diǎn),默認(rèn)顯示“ff”。故在OnInitDialog()函數(shù)中添加以下代碼:
m_EditMask0="ff";
其他編輯框以相同方式按要求設(shè)置。
(3)要求啟動(dòng)時(shí)CAN默認(rèn)未連接,未啟動(dòng),故在OnInitDialog()函數(shù)中添加以下代碼:
bConnectCAN=FALSE; //啟動(dòng)時(shí)CAN默認(rèn)未連接
bStartCAN=FALSE; //啟動(dòng)時(shí)CAN默認(rèn)關(guān)閉
(4)要求設(shè)備未連接時(shí)不能啟動(dòng)設(shè)備,默認(rèn)禁用啟動(dòng)通道按鈕,故在OnInitDialog()函數(shù)中添加以下代碼:
GetDlgItem(IDC_BUTTON_CONNECT1)->EnableWindow(FALSE);
(5)更新對(duì)話框內(nèi)容,把變量中的數(shù)據(jù)輸出到控件,故在OnInitDialog()函數(shù)中添加以下代碼:
  UpdateData(false);
4.4      軟件功能實(shí)現(xiàn)4.4.1      設(shè)備連接
要求點(diǎn)擊“連接”按鈕,上位機(jī)通信軟件與CANUSB—Ⅰ/Ⅱ智能CAN接口卡連接,并且顯示連接成功與否。若連接失敗,彈出警告框“打開設(shè)備失敗!”,若連接成功,分別在列表框IDC_LIST_INFO0和IDC_LIST_INFO1顯示“CAN0連接成功”“CAN1連接成功”。
在TestDlg.h頭文件里添加變量:
public:
  int m_devnum;   //設(shè)備序號(hào)
int m_cannum;   //can通道編號(hào)
  void CAN0ShowInfo(CString str, int code);//CAN0接收顯示控制函數(shù)
雙擊“連接”按鈕,系統(tǒng)自動(dòng)添加消息響應(yīng)函數(shù)OnButtonConnect0(),添加代碼,實(shí)現(xiàn)用戶單擊“連接”按鈕,完成設(shè)備的連接功能。
定義初始化CAN的數(shù)據(jù)類型的結(jié)構(gòu)體:VCI_INIT_CONFIG init_config;
如果CAN已經(jīng)打開,調(diào)用VCI_CloseDevice(m_devnum)函數(shù)關(guān)閉設(shè)備。調(diào)用GetCurSel()函數(shù)獲取設(shè)備序號(hào):devnum=m_ComboDevindex.GetCurSel();
如果(VCI_OpenDevice(devnum))==0,則設(shè)備打開失敗,調(diào)用MessageBox函數(shù)彈出消息框,警告“打開設(shè)備失敗!”,否則CAN0和CAN1連接成功,分別在列表框IDC_LIST_INFO0和IDC_LIST_INFO1顯示。
此時(shí),按鈕IDC_BUTTON_CONNECT0的標(biāo)題“連接”變?yōu)椤皵嚅_”,“啟動(dòng)通道”按鈕變?yōu)橛行В侍砑右韵麓a:
GetDlgItem(IDC_BUTTON_CONNECT0)->SetWindowText("斷開");
GetDlgItem(IDC_BUTTON_CONNECT1)->EnableWindow(TRUE);

圖4.3  設(shè)備連接流程圖

4.4.2      設(shè)備啟動(dòng)
要求點(diǎn)擊“啟動(dòng)通道”按鈕,CAN0通道和CAN1通道同時(shí)啟動(dòng),并顯示啟動(dòng)成功與否。若啟動(dòng)通道失敗,彈出消息框,發(fā)出警告,若啟動(dòng)通道成功,分別在列表框IDC_LIST_INFO0和IDC_LIST_INFO1顯示“CAN0啟動(dòng)成功”“CAN1啟動(dòng)成功”。
雙擊“啟動(dòng)通道”按鈕,系統(tǒng)自動(dòng)添加消息響應(yīng)函數(shù)OnButtonConnect1(),添加代碼,實(shí)現(xiàn)用戶單擊“啟動(dòng)通道”按鈕,完成通道CAN0和CAN1的啟動(dòng)功能。
如果VCI_InitCAN(m_devnum,0,&init_config)!=true,則通道CAN0初始化失敗,如果VCI_InitCAN(m_devnum,1,&init_config)!=true,則通道CAN1初始化失敗,并立即調(diào)用VCI_CloseDevice(m_devnum)函數(shù),關(guān)閉設(shè)備
如果VCI_StartCAN(m_devnum,0)!=true,則通道CAN0啟動(dòng)失敗,如果VCI_StartCAN(m_devnum,1)!=true,則通道CAN1啟動(dòng)失敗,并立即調(diào)用VCI_CloseDevice(m_devnum)函數(shù),關(guān)閉設(shè)備。如果通道CAN0和CAN1啟動(dòng)成功,則禁用啟動(dòng)通道按鈕:
GetDlgItem(IDC_BUTTON_CONNECT1)->EnableWindow(FALSE);

圖4.4  設(shè)備啟動(dòng)流程圖

4.4.3      設(shè)備復(fù)位
要求點(diǎn)擊“復(fù)位CAN0”按鈕,復(fù)位通道CAN0,點(diǎn)擊“復(fù)位CAN1”按鈕,復(fù)位通道CAN1,成功則分別在列表框IDC_LIST_INFO0和IDC_LIST_INFO1顯示“復(fù)位成功”,失敗則列表框IDC_LIST_INFO0和IDC_LIST_INFO1顯示“復(fù)位失敗”。
CAN0通道:
雙擊“復(fù)位CAN0”按鈕,系統(tǒng)自動(dòng)添加消息響應(yīng)函數(shù)OnButtonResetcan0(),添加代碼,實(shí)現(xiàn)用戶單擊“復(fù)位CAN0”按鈕,完成通道CAN0的復(fù)位功能。
如果VCI_ResetCAN(m_devnum,0)==1,則復(fù)位成功,否則,復(fù)位失敗,將結(jié)果顯示在列表框IDC_LIST_INFO0內(nèi)。
CAN1通道的復(fù)位功能設(shè)置如CAN0通道,在此就不再贅述。

圖4.5  CAN0通道復(fù)位流程圖

4.4.4      幀封裝與發(fā)送
(1)幀封裝
報(bào)文標(biāo)識(shí)符指定了數(shù)據(jù)通訊中的源節(jié)點(diǎn) MACID 和目標(biāo)節(jié)點(diǎn)MACID,并指示了報(bào)文的功能以及所要訪問(wèn)的資源節(jié)點(diǎn)。報(bào)文標(biāo)識(shí)符被分為SrcMACID (源節(jié)點(diǎn)地址)、DestMACID(目標(biāo)節(jié)點(diǎn)地址)、ACK 位、FuncID(功能碼)和Source ID(資源節(jié)點(diǎn)地址)5 個(gè)部分,如表4.2示。

表4.2 iCAN標(biāo)識(shí)符分配

幀標(biāo)識(shí)符

ID28

ID27

ID26——ID21

ID20

ID19

ID18——ID13

00

SrcMACID

(源節(jié)點(diǎn)地址)

00

DestMACID

(目標(biāo)節(jié)點(diǎn)地址)

ID12

ID11——ID8

ID7——ID0

RTR

ACK

FUNC ID(功能碼)

SourceID(資源節(jié)點(diǎn)地址)

0

SrcMACID (源節(jié)點(diǎn)地址):發(fā)送iCAN 報(bào)文的節(jié)點(diǎn)地址,占用標(biāo)識(shí)符位ID28~ID21,SrcMACID 的高2 位固定為0,數(shù)值范圍為0x00-0x3F。
DestMACID (目標(biāo)節(jié)點(diǎn)地址):接收iCAN 報(bào)文節(jié)點(diǎn)地址,占用標(biāo)識(shí)符位ID20~ID13,DestMACID 的高2 位固定為0,數(shù)值范圍為0x00-0x3F。當(dāng)DestMACID 的值為0xFF時(shí),表示本次發(fā)送的幀是廣播幀。
ACK(相應(yīng)標(biāo)識(shí)符):分配1 位,占用標(biāo)識(shí)符位ID12。該位用于區(qū)分幀類型為命令幀還是響應(yīng)幀,并說(shuō)明是否需要應(yīng)答本幀。

表4.3相應(yīng)標(biāo)志位

ACK

含義

0

用于命令幀,本幀需要應(yīng)答,但對(duì)于廣播幀,此值無(wú)意義

1

用于響應(yīng)幀,本幀不需要應(yīng)答;或不需要應(yīng)答的命令幀(如廣播幀)

FunctionID(功能碼):分配4 位,占用標(biāo)識(shí)符位ID11~ID8,功能碼用于指示iCAN 報(bào)文需要實(shí)現(xiàn)的功能,接收?qǐng)?bào)文的節(jié)點(diǎn)根據(jù)報(bào)文中的功能碼進(jìn)行相應(yīng)的處理。
Source ID(資源節(jié)點(diǎn)地址):用于指示所要訪問(wèn)的從站內(nèi)部資源的起始地址,分配8 位,占用標(biāo)識(shí)符位ID7~ID0。
分別輸入源節(jié)點(diǎn)、目的節(jié)點(diǎn)、響應(yīng)標(biāo)示符、功能碼、資源節(jié)點(diǎn)地址,要求對(duì)報(bào)文進(jìn)行封裝后發(fā)送。
以源節(jié)點(diǎn)為例,占用標(biāo)識(shí)符位ID28~ID21,故處理程序如下:
memcpy(&szFrameID[0],(LPCTSTR)m_EditSendFrmID0,m_EditSendFrmID0.GetLength());//拷貝m_EditSendFrmID0所指內(nèi)存內(nèi)容到&szFrameID[0]所指的內(nèi)存地址上
CAN0strtodata((unsigned char*)szFrameID,&FrameID[0],1,0);//字符串轉(zhuǎn)換為數(shù)據(jù)串
ExtendID |= (FrameID[0]&0x3f)<<21;//左移21位
其他以相同方式處理,報(bào)文就封裝在FrameID[0]中。
(2)發(fā)送
要求點(diǎn)擊“發(fā)送”按鈕,發(fā)送數(shù)據(jù),結(jié)果分別顯示在列表框IDC_LIST_INFO0和IDC_LIST_INFO1內(nèi)。
CAN0通道:
雙擊“發(fā)送”按鈕,系統(tǒng)自動(dòng)添加消息響應(yīng)函數(shù)OnButtonSend0(),添加代碼,實(shí)現(xiàn)用戶單擊“發(fā)送”按鈕,完成發(fā)送通道CAN0數(shù)據(jù)的功能。
如果bStartCAN==FALSE,則通道未啟動(dòng),不能發(fā)送數(shù)據(jù),彈出消息框,警告“請(qǐng)啟動(dòng)設(shè)備!”。
調(diào)用VCI_Transmit(m_devnum,0,&frameinfo)函數(shù)判斷發(fā)送狀態(tài),如果為真,則發(fā)送成功,在列表框IDC_LIST_INFO0內(nèi)顯示封裝好的幀ID和“設(shè)備0 通道CAN0 發(fā)送成功”,否則顯示“設(shè)備0 通道CAN0 發(fā)送失敗”。
CAN1通道的發(fā)送功能設(shè)置同CAN0通道,在此就不再贅述。

圖4.6  CAN0通道發(fā)送流程

4.4.5      幀接收與解析
(1)接收
要求CAN0和CAN1通道能接收到對(duì)方通道或自己發(fā)出的數(shù)據(jù)。
CAN0通道:
在TestDlg.h頭文件里定義CAN0接收線程執(zhí)行函數(shù):
static UINT CAN0ReceiveThread(void *param);
在TestDlg.cpp內(nèi)添加CAN0接收線程執(zhí)行函數(shù)
UINT CTestDlg::CAN0ReceiveThread(void *param){}并在其中添加代碼,完成數(shù)據(jù)接收功能。
定義CAN信息幀數(shù)據(jù)類型的結(jié)構(gòu)體:VCI_CAN_OBJ frameinfo[50];
獲取序列號(hào):bSn=VCI_ReadDevSn(dlg->m_devnum,DevSn);
獲取數(shù)據(jù)長(zhǎng)度:Len=VCI_Receive(dlg->m_devnum,frameinfo,50,200);
如果Len<=0,則沒有接收到數(shù)據(jù),否則,接收到數(shù)據(jù)。
如果frameinfo.CANIndex==0,則CAN0通道接收數(shù)據(jù),否則,CAN1通道接收數(shù)據(jù)。如果frameinfo.ExternFlag==0,則幀類型為標(biāo)準(zhǔn)幀,否則,為擴(kuò)展幀。如果frameinfo.RemoteFlag==0,則幀格式為數(shù)據(jù)幀,否則,為遠(yuǎn)程幀。

圖4.7  CAN0接收數(shù)據(jù)流程圖

(2)幀解析
  • 源節(jié)點(diǎn)封裝后的幀ID右移21位輸出的即為源節(jié)點(diǎn),程序如下:
tmpstr.Format("源節(jié)點(diǎn):%02x ",(frameinfo.ID>>21)&0x3f);
  • 目的節(jié)點(diǎn):封裝后的幀ID右移13位輸出的即為目的節(jié)點(diǎn),程序如下:
tmpstr.Format(" 目的節(jié)點(diǎn):%02x ",(frameinfo.ID>>13)&0x3f);
  • 響應(yīng)標(biāo)示符:封裝后的幀ID右移12位輸出的即為響應(yīng)標(biāo)示符如果為1則為響應(yīng)幀,為0則為命令幀,程序如下:
if((frameinfo.ID>>12)&0x01)
              str+=" 響應(yīng)幀";
else            
              str+=" 命令幀";
  • 功能碼:封裝后的幀ID右移8位輸出的即為功能碼,程序如下:
tmpstr.Format("  function ID:%02x  ",(frameinfo.ID>>8)&0x0f);
  • 資源節(jié)點(diǎn)編號(hào):封裝后的幀ID最后8位即為功能碼,程序如下:
tmpstr.Format("  source ID:%02x  ",frameinfo.ID&0xff);

圖4.8  幀解析效果圖

4.4.6      清除顯示
要求點(diǎn)擊“清除顯示”按鈕,列表框IDC_LIST_INFO0和IDC_LIST_INFO1內(nèi)的內(nèi)容全部清除。
CAN0通道:
雙擊“清除顯示”按鈕,系統(tǒng)自動(dòng)添加消息響應(yīng)函數(shù)OnButton Clear0(),添加代碼,實(shí)現(xiàn)用戶單擊“清除顯示”按鈕,完成列表框IDC_LIST_INFO0內(nèi)的內(nèi)容全部清除功能。
添加以下代碼,清除CAN0列表顯示項(xiàng):
m_ListInfo0.ResetContent();
4.5      本章小結(jié)
本章具體介紹了CAN通信軟件的設(shè)計(jì),第一部分介紹了CANUSB—Ⅰ/Ⅱ智能CAN接口卡的驅(qū)動(dòng)安裝方法;第二部分介紹了CAN接口卡函數(shù)庫(kù);第三部分介紹了軟件的界面設(shè)計(jì),包括界面的布局、控件屬性及成員變量的設(shè)置,和對(duì)話框的初始化;第四部分詳細(xì)介紹了軟件功能的實(shí)現(xiàn),包括設(shè)備連接、啟動(dòng)、復(fù)位、幀封裝與發(fā)送、幀接收與解析和清除顯示六個(gè)部分功能的實(shí)現(xiàn)方法。
5          測(cè)試及發(fā)布5.1      軟件功能測(cè)試
將CANUSB—Ⅰ/Ⅱ智能CAN接口卡連至PC的USB接口槽,運(yùn)行上位機(jī)軟件,測(cè)試功能。
5.1.1      基本功能測(cè)試
執(zhí)行程序,如圖輸入數(shù)據(jù),測(cè)試各項(xiàng)功能是否能正常運(yùn)行。

圖5.1  程序軟件功能測(cè)試

經(jīng)測(cè)試,各項(xiàng)功能運(yùn)行正常。
5.1.2      非法輸入限制
對(duì)于編輯框,若輸入非法字符,則彈出消息框“非法字符,請(qǐng)重新輸入!”的警告,如下圖所示:

圖5.2  非法輸入警告

5.2      程序發(fā)布
一個(gè)程序除了.exe以外,還需要用到很多其他外部資源,這樣程序使用起來(lái)很不方便,程序打包就是將這些所有資源放到一個(gè)安裝程序中,這樣只要下載并運(yùn)行這個(gè)安裝程序,就可以讓安裝程序釋放目標(biāo)程序及所有這些資源,方便使用。
Inno Setup是一個(gè)免費(fèi)的安裝制作軟件,小巧、簡(jiǎn)便、精美是其最大的特點(diǎn)。用Inno Setup對(duì)已經(jīng)制作好的工程進(jìn)行打包步驟如下:
  • 將已經(jīng)調(diào)試完成的工程,生成發(fā)行版(release);
  • 安裝好Inno Setup Compiler漢化版,啟動(dòng)軟件,使用腳本設(shè)計(jì)向?qū)?/font>創(chuàng)建一個(gè)新腳本文件完成安裝程序的制作,過(guò)程如下圖所示:

圖5.3  應(yīng)用程序信息

圖5.4  應(yīng)用程序文件夾

圖5.5  應(yīng)用程序文件

圖5.6  應(yīng)用程序圖標(biāo)

圖5.7  應(yīng)用程序文檔

圖5.8  安裝語(yǔ)言

圖5.9  編譯設(shè)置

圖5.10  Inno Setup 預(yù)處理器

圖5.11  完成向?qū)?/font>

圖5.12  編譯腳本

  • 雙擊Setup圖標(biāo),進(jìn)行嘗試安裝,安裝成功后,在開始菜單欄出現(xiàn)運(yùn)行和卸載快捷方式可以運(yùn)行軟件和卸載軟件

圖5.13  安裝成功效果圖

5.3      本章小結(jié)
本章對(duì)已經(jīng)編寫完成的程序進(jìn)行功能測(cè)試,主要測(cè)試連接設(shè)備、啟動(dòng)通道、復(fù)位、發(fā)送和接收功能,并能實(shí)現(xiàn)幀的封裝和解析,測(cè)試無(wú)誤后進(jìn)行程序發(fā)布,方便使用。

結(jié)論


畢業(yè)設(shè)計(jì)是本科學(xué)習(xí)階段一次非常難得的理論與實(shí)際相結(jié)合的機(jī)會(huì),通過(guò)這次CAN總線通信系統(tǒng)上位機(jī)通信軟件的設(shè)計(jì),我從對(duì)CAN總線相關(guān)技術(shù)一無(wú)所知到有了一點(diǎn)了解,鞏固了曾經(jīng)學(xué)過(guò)的知識(shí),鍛煉了理論與實(shí)際結(jié)合解決實(shí)際問(wèn)題的能力,同時(shí)也提高了我查閱文獻(xiàn)資料的能力,使自己有了全方位的提高,豐富了自己的經(jīng)驗(yàn)。
本文主要完成了以下的研究:
1、對(duì)CAN總線的研究背景、發(fā)展現(xiàn)狀及本課題的研究目的和意義進(jìn)行了論述。
2、簡(jiǎn)單分析了CAN2.0協(xié)議和CAN控制器SJA1000。
3、介紹了本課題的開發(fā)環(huán)境和CANUSBⅠ/Ⅱ只能CAN接口卡。
4、基于VC++設(shè)計(jì)CAN通信軟件,并實(shí)現(xiàn)了以下功能:
①正確識(shí)別CAN設(shè)備并打開CAN通道;
②可封裝CAN報(bào)文進(jìn)行發(fā)送;
③可接收CAN數(shù)據(jù)幀,并能對(duì)接收的數(shù)據(jù)幀進(jìn)行解析:在數(shù)據(jù)列表中顯示報(bào)文的相關(guān)參數(shù)信息(如:幀ID、幀格式、幀類型、DLC值以及幀數(shù)據(jù)等參數(shù));
④具有過(guò)濾功能,可不顯示指定的協(xié)議幀。
5、對(duì)軟件功能進(jìn)行測(cè)試,并發(fā)布軟件。

由于自身水平所限,畢業(yè)設(shè)計(jì)必定還有很多不足和欠缺考慮的地方,也感到自身知識(shí)的貧乏,希望在日后的努力中能夠更加完善。



致謝


本人的畢業(yè)設(shè)計(jì)一直是在李艷老師的悉心指導(dǎo)下進(jìn)行的。李老師治學(xué)嚴(yán)謹(jǐn),要求嚴(yán)格,學(xué)識(shí)淵博,為人親切。從課題的選定、方案的確定、實(shí)際的設(shè)計(jì)到論文的寫作,李老師都給予了無(wú)微不至的關(guān)懷。在整個(gè)畢業(yè)設(shè)計(jì)過(guò)程中,李艷老師時(shí)時(shí)以高標(biāo)準(zhǔn)要求,嚴(yán)格安排時(shí)間,并為我指明大方向,使我少走很多彎路。在遇到問(wèn)題時(shí),李艷老師也耐心指導(dǎo),循循善誘,讓我能夠獨(dú)立思考,順利地完成我的畢業(yè)設(shè)計(jì)。在此表示誠(chéng)摯的感謝和由衷的敬意。
此外,我還要感謝許多同學(xué)在整個(gè)過(guò)程中的幫助和配合。
最后,再次對(duì)關(guān)心、幫助我的老師同學(xué)表示衷心的感謝!

完整的Word格式文檔51黑下載地址:
CAN總線通信系統(tǒng)上位機(jī)通信軟件的設(shè)計(jì).doc (842 KB, 下載次數(shù): 113)


作者: HLXHLX    時(shí)間: 2018-8-2 15:13
這個(gè)可以
作者: ybj86    時(shí)間: 2018-9-15 07:19
不錯(cuò)的東西,正好需要
作者: anun    時(shí)間: 2020-6-1 23:25
好東西!收了!
作者: laoduan818    時(shí)間: 2020-11-27 11:32
最近正好在開發(fā)can通信上位機(jī)軟件




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 国产成人网 | 女同久久另类99精品国产 | 日韩视频三区 | 日韩精品在线网站 | 亚洲美女网站 | 日韩欧美国产电影 | 国产精品久久久久久52avav | 日本福利一区 | 国产电影精品久久 | 国产亚洲精品精品国产亚洲综合 | 欧美在线a| av一级久久 | 亚洲精品久久久久中文字幕欢迎你 | 2019天天干天天操 | av入口| 一区视频 | 久久精品亚洲一区二区三区浴池 | 看一级毛片 | 伊人久操 | 国产在线麻豆精品入口 | 国产精品免费一区二区三区四区 | 国产精品视频一区二区三区不卡 | 在线中文字幕视频 | 久久久久久久久淑女av国产精品 | 久久高清 | 亚洲精品国产电影 | 午夜爽爽爽男女免费观看影院 | 久久综合九色综合欧美狠狠 | 久草免费在线视频 | 日韩视频免费看 | 国产欧美一区二区三区在线看 | 丁香综合 | 男女国产视频 | 91视频网址 | 亚洲第一视频网 | 欧美色专区 | 亚洲香蕉 | 日韩中文字幕在线观看视频 | 国产精品久久久久久中文字 | 久草视频观看 | 日韩中文字幕网 |