專利名稱::面向設(shè)備的編程技術(shù)與方法
技術(shù)領(lǐng)域:
:本發(fā)明屬于嵌入式系統(tǒng)軟件領(lǐng)域,更具體地說是涉及嵌入式系統(tǒng)面向設(shè)備的編程技術(shù)與方法,包括軟件編程方法、應(yīng)用程序編程接口、驅(qū)動程序編程接口和通訊協(xié)議。
背景技術(shù):
:嵌入式系統(tǒng)與通用計算機(jī)系統(tǒng)同源,可是因為應(yīng)用領(lǐng)域和研發(fā)人員的不同,嵌入式系統(tǒng)很早就走向相對獨立的發(fā)展道路,其編程模式與通用計算機(jī)系統(tǒng)有較大的區(qū)別。一般來說,嵌入式系統(tǒng)傳統(tǒng)編程模式有面向寄存器的編程模式、面向API的編程模式、面向端口的編程模式等,其中面向寄存器的編程模式仍然占主導(dǎo)地位。所謂面向寄存器的編程就是軟件直接操作硬件提供的編程接口來編寫嵌入式軟件。目前,本地硬件提供的編程接口大多數(shù)為寄存器,映射到軟件能夠直接訪問的1/0空間或Memory空間,至于遠(yuǎn)程硬件,一般需要通過本地的硬件通訊接口來訪問,而這個本地的硬件通訊接口也是需要編程的,它也有寄存器。所以,一般來說,對于所有硬件的訪問,都是按照特定順序?qū)σ粋€或多個寄存器進(jìn)行編程。因此這種編程方式就稱為面向寄存器的編程。面向寄存器的編程模式非常麻煩,效率低下,不是人人都能勝任的。為了方便嵌入式軟件的編寫,有些公司編寫了軟件把硬件屏蔽起來形成API,其它軟件則通過API接口訪問硬件。這種通過第三方軟件提供的接口來訪問硬件的編程模式就是面向API的編程模式。面向API的編程模式只需要對硬件細(xì)節(jié)有大概的了解即可,但需要對API手冊進(jìn)行詳細(xì)的閱讀才能開發(fā)。而不同系統(tǒng)的API可能完全不同,換一種系統(tǒng),開發(fā)人員需要重新熟悉新的API,并且,不同系統(tǒng)的API功能和性能差異極大,對開發(fā)人員的要求也有較大的差別。面向端口編程是PLC(可編程邏輯控制器)的編程模式。PLC把所有硬件都虛擬成端口,通過對端口的讀寫完成對硬件的控制。PLC最初是為了替代繼電器編程,對于復(fù)雜程序的支持還是比較弱,對于遠(yuǎn)程硬件的支持也比較弱(主要是支持PLC廠商自己的配件)。傳統(tǒng)編程模式對比各種嵌入式系統(tǒng)傳統(tǒng)的編程模式各自有各的特點,總結(jié)見表1。傳統(tǒng)編程模式的困境嵌入式系統(tǒng)的歷史幾乎和通用計算機(jī)系統(tǒng)的歷史一樣長。最初,嵌入式系統(tǒng)都是獨立工作的。傳統(tǒng)的編程模式都是面向獨立的微控制器(微處理器),操作的硬件都是本地硬件。隨著時間的推移,嵌入式系統(tǒng)由獨立工作走向了網(wǎng)絡(luò)控制,典型的系統(tǒng)就是集散控制系統(tǒng),此時,嵌入式系統(tǒng)的編程模式依然是面向獨立的微控制器(微處理器)。要把這些嵌入式系統(tǒng)組成網(wǎng)絡(luò),需要為所有控制器增加兼容的通訊接口硬件,并設(shè)計兼容的通訊協(xié)議。而且,每個系統(tǒng)需要對硬件通訊接口進(jìn)行編程、對通訊協(xié)議編程后才可能組成網(wǎng)絡(luò)。這個設(shè)計無疑是復(fù)雜的。對于聯(lián)網(wǎng)的控制系統(tǒng),傳統(tǒng)編程模式的對比見表2?,F(xiàn)在,組網(wǎng)的范圍更加廣泛,不但需要本地組網(wǎng),還需要遠(yuǎn)程組網(wǎng),不但控制設(shè)備之間需要互連,控制設(shè)備與普通計算機(jī)之間還需要互連,以及不同廠商的設(shè)備之間也要互連,這些要求無疑更加劇了系統(tǒng)編程的復(fù)雜性。針對目前嵌入式系統(tǒng)設(shè)計的困境,提出"面向設(shè)備的編程"這一個概念,讓研發(fā)人員不需要考慮硬件細(xì)節(jié)和網(wǎng)絡(luò)細(xì)節(jié),使用同一種方式操作本地硬件和遠(yuǎn)程硬件。與傳統(tǒng)編程模式不同,面向設(shè)備的編程模式把所有通過網(wǎng)絡(luò)連接的嵌入式系統(tǒng)和計算機(jī)作為一個整體考慮,研發(fā)人員只需要知道設(shè)備地址和設(shè)備內(nèi)端口地址的分配即可,不需要知道設(shè)備如何連接到系統(tǒng),可以通過有限的幾個函數(shù)操作設(shè)備。
發(fā)明內(nèi)容—、基本概念(1)設(shè)備設(shè)備是主控器與它可直接訪問的本地硬件。主控器一般包括微控制器、微處理器、DSP、FPGA等。(2)設(shè)備地址設(shè)備地址是設(shè)備在整個系統(tǒng)中的唯一標(biāo)識,只要設(shè)備在系統(tǒng)中,無論設(shè)備在那里,都可以通過設(shè)備地址訪問它,設(shè)備地址是一個32位的無符號整數(shù)。(3)主控設(shè)備所謂主控設(shè)備,是一個與被控設(shè)備相對而言的設(shè)備。主控設(shè)備是處于主導(dǎo)地位、控制其它的設(shè)備。(4)被控設(shè)備被控設(shè)備是接受主控設(shè)備控制的設(shè)備。(5)混合設(shè)備如果一個設(shè)備即需要控制別的設(shè)備又可接受別的設(shè)備控制,它就是混合設(shè)備。(6)端口端口是虛擬內(nèi)存,對某一個特定端口的讀寫可實現(xiàn)設(shè)備的特定功能。被控設(shè)備具有端口,主控設(shè)備不具備端口。(7)端口地址端口地址是端口在設(shè)備內(nèi)的唯一標(biāo)識,端口地址是一個32位無符號整數(shù)。(8)端口組端口組是具有同樣屬性的連續(xù)端口的組合。二、技術(shù)特點(1)使用ANSIC編程,將來可能增加編程語言支持。(2)編程接口統(tǒng)一,無論操作設(shè)備的什么功能,都使用有限的幾個函數(shù)操作。(3)編程不區(qū)分遠(yuǎn)程設(shè)備和本地硬件,系統(tǒng)保留一個系統(tǒng)地址(符號AW_L0CAL_ADDR,值0x00000000)用于識別本地設(shè)備,用這個地址操作的就是本地設(shè)備。這樣,設(shè)備可以使用同樣的接口訪問本地硬件和遠(yuǎn)程設(shè)備。(4)多協(xié)議多網(wǎng)絡(luò)支持默認(rèn)協(xié)議計劃支持RS232、RS485、RS422、以太網(wǎng)、CAN、USB等網(wǎng)絡(luò)。計劃支持ModeBus、iCAN、CAN0pen、DeviceNet、J1939、DMX512、MVB等協(xié)議與網(wǎng)絡(luò),用戶還可以通過多協(xié)議接口增加特定的協(xié)議。(5)協(xié)議及鏈路自動動態(tài)匹配研發(fā)人員只需要知道設(shè)備的地址就可以編程,而不需關(guān)心主控設(shè)備與被控設(shè)備之間的網(wǎng)絡(luò)與協(xié)議匹配問題。系統(tǒng)會自動選擇兩者均支持(并且當(dāng)前網(wǎng)絡(luò)結(jié)構(gòu)支持)的協(xié)議。如果網(wǎng)絡(luò)結(jié)構(gòu)發(fā)生變化,系統(tǒng)會再次主動選擇協(xié)議。這些過程都是透明的,研發(fā)人員無需關(guān)心。(6)與操作系統(tǒng)無關(guān)本系統(tǒng)使用ANSIC編程,可以移植到所有常見的嵌入式操作系統(tǒng)和PC操作系統(tǒng)中。(7)與CPU體系結(jié)構(gòu)無關(guān)本系統(tǒng)使用ANSIC編程,可以移植到常見的CPU體系結(jié)構(gòu)中。(8)提供被控設(shè)備編程接口用戶可以通過這個接口實現(xiàn)接入特定的被控設(shè)備。面向設(shè)備的編程把所有用網(wǎng)絡(luò)連接起來的嵌入式系統(tǒng)作為一個整體來考慮,依據(jù)其在系統(tǒng)中的作用,把嵌入式系統(tǒng)分為主控設(shè)備和被控設(shè)備兩類。當(dāng)然,一個嵌入式系統(tǒng)可能即是主控設(shè)備,又是被控設(shè)備,這可以把它看做兩個邏輯設(shè)備。這樣,整個系統(tǒng)中只有主控設(shè)備和被控設(shè)備兩個部分。主控設(shè)備是整個系統(tǒng)的核心,用于整個系統(tǒng)或子系統(tǒng)的邏輯控制或人機(jī)接口。通常的,主控設(shè)備并不直接控制被控對象。在面向設(shè)備的編程中,"協(xié)議及鏈路自動動態(tài)匹配"在主控設(shè)備中實現(xiàn),因此主控設(shè)備比較復(fù)雜。被控設(shè)備是直接控制對象的,數(shù)目眾多。為簡化被控設(shè)備的設(shè)計和減低成本,面向設(shè)備的編程中被控設(shè)備設(shè)計成"被動應(yīng)答"方式工作,沒有"協(xié)議及鏈路自動動態(tài)匹配"過程,也不會主動聯(lián)系主控設(shè)備。主控設(shè)備通過遠(yuǎn)程調(diào)用來控制被控設(shè)備。每當(dāng)主控設(shè)備調(diào)用面向設(shè)備的編程的主機(jī)接口核心函數(shù)時,對應(yīng)的被控設(shè)備執(zhí)行相應(yīng)的函數(shù)。被控設(shè)備的函數(shù)執(zhí)行完畢后,把返回值和執(zhí)行結(jié)果反饋給主控設(shè)備,主控設(shè)備獲得執(zhí)行結(jié)果,函數(shù)返回。主控設(shè)備與被控設(shè)備的遠(yuǎn)程函數(shù)調(diào)用關(guān)系。他們每一對函數(shù)的返回值類型都是一樣的,參數(shù)也十分相似,只是主控設(shè)備多一個用于指明被控設(shè)備的參數(shù)。三、發(fā)明的效果面向設(shè)備的編程模式是由面向API的編程方式和面向端口的編程方式集合發(fā)展而來的,具有兩者的優(yōu)點,避免了各自的缺點,同時極大地增強(qiáng)了組網(wǎng)能力。這里假定需要開發(fā)控制遠(yuǎn)程蜂鳴器的嵌入式系統(tǒng),其開發(fā)流程見圖1。圖1的左邊是開發(fā)步驟,右邊是對應(yīng)的系統(tǒng)結(jié)構(gòu)。通過查看遠(yuǎn)程設(shè)備圖,得知蜂鳴器的端口地址為0xllll,寫1為鳴叫,寫0為停止鳴叫,程序代碼如程序清單1所示。程序清單1面向設(shè)備的編程控制遠(yuǎn)程設(shè)備的蜂鳴器鳴叫intmain(void){Targetlnit();/*目標(biāo)板初始化*/while(l)(awWrite(0x05,0x1111,0);/*BEEP停止蜂鳴*/awWrite(AW_L0CAL_ADDR,0x00001000,50);/*等待時間間隔*/awWrite(0x05,0x1111,1);/*BEEP蜂鳴*/awWrite(AW_L0CAL_ADDR,0x00001000,50);/*等待時間間隔*/}return0;}可以看出,這種編程模式非常簡單。面向設(shè)備編程模式與傳統(tǒng)編程模式的對比見表3。圖1面向設(shè)備的編程技術(shù)與方法組成框圖圖2面向設(shè)備的編程基本硬件框圖圖3面向設(shè)備的編程步驟圖4ARP表中存在遠(yuǎn)程設(shè)備圖5ARP請求添加設(shè)備圖6主控設(shè)備訪問遠(yuǎn)程設(shè)備圖7應(yīng)答返回具體實施例方式—、總體設(shè)計思想面向設(shè)備的編程把所有用網(wǎng)絡(luò)連接起來的嵌入式系統(tǒng)作為一個整體來考慮,依據(jù)其在系統(tǒng)中的作用,把嵌入式系統(tǒng)分為主控設(shè)備和被控設(shè)備兩類。當(dāng)然,一個嵌入式系統(tǒng)可能即是主控設(shè)備,又是被控設(shè)備,這可以把它看做兩個邏輯設(shè)備。這樣,整個系統(tǒng)中只有主控設(shè)備和被控設(shè)備兩個部分。主控設(shè)備是整個系統(tǒng)的核心,用于整個系統(tǒng)或子系統(tǒng)的邏輯控制或人機(jī)接口。通常的,主控設(shè)備并不直接控制被控對象。在面向設(shè)備的編程中,"協(xié)議及鏈路自動動態(tài)匹配"在主控設(shè)備中實現(xiàn),因此主控設(shè)備比較復(fù)雜。被控設(shè)備是直接控制對象的,數(shù)目眾多。為簡化被控設(shè)備的設(shè)計和減低成本,面向設(shè)備的編程中被控設(shè)備設(shè)計成"被動應(yīng)答"方式工作,沒有"協(xié)議及鏈路自動動態(tài)匹配"過程,也不會主動聯(lián)系主控設(shè)備。主控設(shè)備通過遠(yuǎn)程調(diào)用來控制被控設(shè)備。每當(dāng)主控設(shè)備調(diào)用面向設(shè)備的編程的主機(jī)接口核心函數(shù)時,對應(yīng)的被控設(shè)備執(zhí)行相應(yīng)的函數(shù)。被控設(shè)備的函數(shù)執(zhí)行完畢后,把返回值和執(zhí)行結(jié)果反饋給主控設(shè)備,主控設(shè)備獲得執(zhí)行結(jié)果,函數(shù)返回。主控設(shè)備與被控設(shè)備的遠(yuǎn)程函數(shù)調(diào)用關(guān)系見表4。他們每一對函數(shù)的返回值類型都是一樣的,參數(shù)也十分相似,只是主控設(shè)備多一個用于指明被控設(shè)備的參數(shù)。二、基本框圖面向設(shè)備的編程的基本框圖見圖3。由圖3可知,面向設(shè)備的編程主控設(shè)備由應(yīng)用程序、設(shè)備搜索引擎、協(xié)議驅(qū)動管理、協(xié)議驅(qū)動和物理鏈路組成。而被控設(shè)備由初始化程序、設(shè)備端口管理層、端口組管理層、協(xié)議驅(qū)動、硬件驅(qū)動、物理硬件和物理鏈路組成。三、一般處理流程圖4-圖7為主控設(shè)備訪問遠(yuǎn)程設(shè)備中函數(shù)awRead()的一般處理流程,主控設(shè)備首先查找ARP表,如果ARP表中存有被控設(shè)備信息,調(diào)用被控設(shè)備函數(shù)開始執(zhí)行,如圖4所示。如果ARP表中不存在此遠(yuǎn)程設(shè)備的情況,則需要請求添加此設(shè)備,如圖5所示。在遠(yuǎn)程設(shè)備添加成功后,調(diào)用被控設(shè)備函數(shù)開始執(zhí)行,如圖6所示。為程序處理完的應(yīng)答返回,如圖7所示。函數(shù)awWrite()、函數(shù)awReadEx()禾口函數(shù)awWriteEx()的處理流程與函數(shù)awRead()相似,這里不再給出。四、用戶編程接口(l)端口屬性每一個端口都有自己的屬性。目前,端口由兩個子屬性組成,分別是讀寫屬性和端口位寬,下面分別介紹。1.讀寫屬性端口的讀寫屬性用于控制端口的讀寫模式,目前具有兩種模式a.10模式10模式用符號AW_I0_M0DE表示。對10模式端口進(jìn)行多數(shù)據(jù)讀寫操作時,端口地址不會增加。操作的是同一個端口。b.內(nèi)存模式內(nèi)存模式用符號AW—MEMARY—MODE表示。對內(nèi)存模式端口進(jìn)行多數(shù)據(jù)讀寫操作時,端口地址會增加。操作的是連續(xù)端口。2.位寬屬性端口的位寬屬性用于控制端口的位寬,目前具有四種模式分別為字節(jié)寬度(8位)、雙字節(jié)寬度(16位)、字寬度(32位)和位寬度(1位)。他們分別使用符號AW_BYTE_N0DE、AW_DBYTE_N0DE、AW_W0RD_N0DE、AW_BIT_N0DE表示。(2)返回值除了函數(shù)awAddressGet()和函數(shù)awTick()夕卜,面向設(shè)備的編程的其它函數(shù)均遵守同樣的返回值規(guī)則1.返回值為32位有符號整數(shù);2.返回值為負(fù)數(shù)時,函數(shù)執(zhí)行不正確;3.返回值大于等于O為函數(shù)執(zhí)行正確。一般情況,返回值大于O時,表示完成的數(shù)據(jù)個數(shù)。函數(shù)返回值的詳細(xì)情況見表5。隨著面向設(shè)備的編程的升級,返回值的數(shù)目可能會增加。(3)主控設(shè)備編程接口(核心編程接口)這是一般用戶使用的接口,也是最常用的API。這部分有4個函數(shù),分別是awRead()、awWrite()、awReadEx()禾口awWriteEx()。其中函數(shù)awRead()禾口awWrite()是對指定設(shè)備的指定端口用默認(rèn)的方式讀寫,讀寫的數(shù)據(jù)都會轉(zhuǎn)化為32位無符號數(shù)。而awReadEx()和awWriteEx()用于一次對端口讀寫多個數(shù)據(jù),需要指定讀寫模式,這個模式還必須與端口的模式一致。這幾個函數(shù)的詳細(xì)介紹請參考表6至表9。(4)被控設(shè)備編程接口在設(shè)計一個控制系統(tǒng)時,被控設(shè)備一般會選擇標(biāo)準(zhǔn)設(shè)備,不需要用戶編程。如果使用非標(biāo)準(zhǔn)的被控設(shè)備,就需要進(jìn)行產(chǎn)品研發(fā)。從圖1.6可以看出,被控設(shè)備的應(yīng)用程序僅僅是初始化而已。如果用戶選擇本公司(廣州致遠(yuǎn)電子有限公司)的半成品模塊,大多數(shù)情況也無需開發(fā),只需要通過向?qū)?PC機(jī)程序)配置需要的功能就可以生成需要的代碼。如果這些半成品模塊不能完全滿足系統(tǒng)需求,就要進(jìn)行研發(fā)。被控設(shè)備要給主控設(shè)備提供端口,所以被控設(shè)備接口主要是端口的管理。面向設(shè)備的編程被控設(shè)備的任何一個端口都從屬于某個端口組,這樣對端口的管理就轉(zhuǎn)換成對端口組的管理。被控設(shè)備的研發(fā)就是設(shè)計這些端口組。AnyWhere中定義了端口組信息結(jié)構(gòu)體,其定義見程序清單2。程序清單2端口組信息structawDevicelnfo{INT32UulAddrStart;/*開始端口地址*/INT32UulLen;/*端口組地址長度*/INT8UucWidth;/*端口寬度*/INT8UucProp;/*端口屬性*/INT8UucRemoteEn;/*遠(yuǎn)程訪問許可*/INT8UucMaxDelay;/*最長延時*//*構(gòu)造函數(shù)*/INT32S(氺pfuncCreate)(conststructawDevicelnfo氺pdiThis);/*析構(gòu)函數(shù)*/INT32SOpf皿cDel)(conststructawDeviceInfo*pdiThis);/*讀端口數(shù)據(jù)*/INT32S(氺pfuncRead)(conststructawDevicelnfo氺pdiThis,INT32Uus0ffSet,INT16UusLen,void氺pvData);/*寫端口數(shù)據(jù)*/INT32S(氺pfuncWrite)(conststructawDevicelnfo氺pdiThis,INT32Uus0ffSet,INT16UusLen,void氺pvData);};typedefstructawDevicelnfoAW_DEVICE_INF0;從程序清單2可以看出,端口組信息結(jié)構(gòu)體具有10個成員,分別是ulAddrStart、ulLen、ucWidth、ucProp、ucRemoteEn、ucMaxDelay、pf皿cCreate、pf皿cDel、pf皿cRead禾口pfuncWrite,下面分別介紹ulAddrStart:端口組的開始地址,大于等于這個端口地址且小于(ulAddrStart+ulLen)的端口地址屬于這個端口組;ulLen:端口組地址的長度,也就是端口組端口的個數(shù);ucWidth:端口的寬度,可選值為AW_BYTE_N0DE、AW_DBYTE_N0DE、AW_W0RD_N0DE和AW_BIT_N0DE(參考7.4(1)小節(jié));ucProp:端口屬性,可選值為AW_I0_M0DE和AW_MEMARY_M0DE(參考7.4(1)小節(jié));ucRemoteEn:遠(yuǎn)程訪問許可,為TRUE時允許遠(yuǎn)程主控設(shè)備訪問這個端口組,否則只允許本地設(shè)備通過地址AWJDCAL—ADDR(0)訪問;ucMaxDelay:最長延時,用于指示本端口組讀寫一個端口的最長延時;pf皿cCreate:函數(shù)指針,端口組被創(chuàng)建時被調(diào)用,其唯一的參數(shù)為指向自己端口組信息的結(jié)構(gòu)體變量的指針。其返回值參考7.4(2)節(jié);pf皿cDel:函數(shù)指針,端口組刪除時被調(diào)用,其唯一的參數(shù)為指向自己端口組信息結(jié)構(gòu)體變量的指針。其返回值參考7.4(2)節(jié);pf皿cRead:函數(shù)指針,讀端口組某個或多個端口時被調(diào)用,其參數(shù)和返回值參考表10;(5)初始化接口面向設(shè)備的編程需要初始化后才能使用。初始化代碼大多數(shù)通過向?qū)?PC機(jī)程序)生成,一般不需要用戶關(guān)心。面向設(shè)備的編程的初始化接口有6個函數(shù),分別為awlnit()、awAddressSet()、awAddressGet()、awRemoteDrivesAdd()、awRemoteDrivesDel()禾口awTick()。其中函數(shù)awlnit()是必須調(diào)用的,調(diào)用了這個函數(shù)后,調(diào)用其它函數(shù)才會有效,其它函數(shù)可以在調(diào)用函數(shù)awlnit()后任何時間調(diào)用。一般情況,函數(shù)awAddressSet()、awRemoteDrivesAdd()會在初始化時調(diào)用,而函數(shù)awAddressGet()和awRemoteDrivesDel()是與它們相對應(yīng)的函數(shù)。至于函數(shù)awTick(),它是需要周期性調(diào)用的函數(shù),正常使用看不見它。這些函數(shù)請參考表14至表19。五、主控設(shè)備通訊協(xié)議驅(qū)動編程接口[ono](1)驅(qū)動程序信息由表1.17可知,驅(qū)動信息由一個結(jié)構(gòu)體AW_DRIVER_INFO_BASE保存,它定義見程序清單3。程序清單3網(wǎng)絡(luò)協(xié)議驅(qū)動信息structawDriverlnfoBase{/*構(gòu)造函數(shù)*/INT32S(氺pfuncCreate)(structawDriverlnfoBase氺pdiThis);/*析構(gòu)函數(shù)*/INT32SOpf皿cDel)(structawDriverlnfoBas一diThis);/*查看指定設(shè)備否否在本網(wǎng)絡(luò)中*/INT32S(郵f獄Arp)(structawDriverlnfoBas一diThis,INT32UulDevice);/*讀端口數(shù)據(jù)*/INT32S(*pfuncRead)(structawDriverlnfoBase氺pdiThis,INT32UulDevice,INT32UulAddr,INT16UusLen,void氺pvData,INT8UucMod);/*寫端口數(shù)據(jù)*/INT32S(*pfuncWrite)(structawDriverInfoBase*pdiThis,INT32UulDevice,INT32UulAddr,INT16UusLen,void氺pvData,INT8UucMocO;INT16UusTtls;/*在ARP表中保留的時間*/INT16UusMtu;/*網(wǎng)絡(luò)幀的有效數(shù)據(jù)大小*/};typedefstructaw_driver_info_baseAW_DRIVER_INFO_BASE;從程序清單2.l可以看出,協(xié)議驅(qū)動信息結(jié)構(gòu)體具有7個成員,分別是pfuncCreate、pfuncDel、pfuncArp、pfuncRead、pfuncWrite、usTtls禾口usMtu,下面分另U介紹pf皿cCreate:函數(shù)指針,增加協(xié)議驅(qū)動程序時被調(diào)用,其唯一的參數(shù)為指向自己的驅(qū)動信息結(jié)構(gòu)體變量的指針。其返回值參考表1.5;pfuncDel:函數(shù)指針,刪除協(xié)議驅(qū)動程序時被調(diào)用,其唯一的參數(shù)為指向自己的驅(qū)動信息結(jié)構(gòu)體變量的指針。其返回值參考表1.5;pf皿cArp:函數(shù)指針,用于在本驅(qū)動所管理的網(wǎng)絡(luò)中搜索指定的設(shè)備,其參數(shù)和返回值參考表20;pf皿cRead:函數(shù)指針,用于讀本驅(qū)動支持的網(wǎng)絡(luò)上的被控設(shè)置,其參數(shù)和返回值參考表21;pf皿cWrite:函數(shù)指針,用于寫本驅(qū)動支持的網(wǎng)絡(luò)上的被控設(shè)置,其參數(shù)和返回值參考表22;usTtls:用于表示本驅(qū)動在ARP表(設(shè)備與驅(qū)動對照表)中的生存時間,以調(diào)用函數(shù)awTick()的周期為單位;usMtu:—個網(wǎng)絡(luò)幀可以負(fù)荷的有效數(shù)據(jù)數(shù)(以字節(jié)為單位),不包括設(shè)備號、端口號、協(xié)議添加數(shù)據(jù)等。pf皿cWrite:函數(shù)指針,寫端口組某個或多個端口時被調(diào)用,其參數(shù)和返回值參考表ll。用戶定義好端口組后,就可以調(diào)用函數(shù)awDeviceAdd()增加一個端口組,然后這些端口就可以使用了。與函數(shù)awDeviceAdd()對應(yīng),面向設(shè)備的編程還有一個函數(shù)awDeviceDel(),它為刪除一個端口組,其詳細(xì)說明見表13。(2)構(gòu)造驅(qū)動自身的信息結(jié)構(gòu)體驅(qū)動程序信息結(jié)構(gòu)體僅保存基本的面向設(shè)備的編程需要的驅(qū)動程序信息,沒有預(yù)留保存驅(qū)動程序自身信息的成員。如果驅(qū)動程序需要添加自己的成員,可以參照程序清單4所示的方法定義自身的信息結(jié)構(gòu)體,只需要在調(diào)用函數(shù)awRemoteDrivesAdd()(參考表1.17)和函數(shù)awRemoteDrivesDel()(參考表1.18)時進(jìn)行一下強(qiáng)制指針轉(zhuǎn)換即可。當(dāng)然,驅(qū)動程序使用pdiThis指針時(參考表20、表21和表22)需要反向轉(zhuǎn)換。程序清單4構(gòu)造驅(qū)動自身的信息結(jié)構(gòu)體必structxxxx_driver_info{AW_DRIVER_INFO_BASEdiblnfo;*面向設(shè)備的編程需要的驅(qū)動信息,須是第一個成員*//*以下添加驅(qū)動程序自己的成員*};typedefxxxx_driver_infoXXXX_DRIVER_INFO;(3)設(shè)備地址映射由表1.17可知,驅(qū)動信息由一個結(jié)構(gòu)體AW_DRIVER_INFO_BASE保存,它定義見程序清單3。(4)設(shè)備地址映射用戶通訊協(xié)議的設(shè)備地址范圍和表示方式與面向設(shè)備的編程不一定相同。如果不相同,需要把用戶通訊協(xié)議的設(shè)備地址映射到面向設(shè)備的編程地址。為了不與其它協(xié)議的地址沖突,一般需要初始化或動態(tài)指定映射關(guān)系,而不是在代碼中寫死。這個映射關(guān)系可以在驅(qū)動自身的信息結(jié)構(gòu)體中添加成員指定。(5)使用ARP表簡化動態(tài)地址映射ARP表中有一個8字節(jié)的成員保留給驅(qū)動程序,驅(qū)動程序可以任意使用。一般來說,當(dāng)驅(qū)動程序無法實現(xiàn)靜態(tài)的地址映射關(guān)系時(如TCP/IP協(xié)議),可以用它來保存動態(tài)的地址映射關(guān)系。面向設(shè)備的編程使用兩個函數(shù)用于設(shè)置和獲得ARP表的這個成員,分別是函數(shù)awArpRsvdSet()和函數(shù)awArpRsvdGet()。函數(shù)awArpRsvdSet()用于設(shè)置設(shè)備地址與Rsvd(協(xié)議的物理地址)的對應(yīng)關(guān)系,而函數(shù)awArpRsvdGet()用于獲得這個對應(yīng)關(guān)系。這兩個函數(shù)請參考表23和表24。六、被控設(shè)備通訊協(xié)議驅(qū)動編程接口(1)概述被控設(shè)備設(shè)計成被動應(yīng)答方式,數(shù)據(jù)幀從哪里來就將反饋的數(shù)據(jù)幀發(fā)送回哪里去。對于主控設(shè)備的協(xié)議驅(qū)動來說,有三個發(fā)送函數(shù)pfuncArp()、pf皿cRead()和pf皿cWrite(),因此,被控設(shè)備的協(xié)議驅(qū)動主要是處理三種數(shù)據(jù)幀。(2)驅(qū)動程序信息結(jié)構(gòu)體因為沒有驅(qū)動管理器,正常來說,被控設(shè)備不需要驅(qū)動程序信息結(jié)構(gòu)體,不過為了兼容主控設(shè)備,被控設(shè)備的驅(qū)動程序信息結(jié)構(gòu)體與主控設(shè)備的驅(qū)動程序信息結(jié)構(gòu)體一樣。由于沒有驅(qū)動管理器,成員pfuncArp、pfuncRead和pfuncWrite均為NULL,成員usTtls和usMtu也可以任意賦值。其它部分與主控設(shè)備一致。(3)端口地址轉(zhuǎn)換協(xié)議的設(shè)備拱功能分配的方式與面向設(shè)備的編程可能不同,如ModBus分為線圈地址和寄存器地址,需要把他們映射到面向設(shè)備的編程地址,者可以在驅(qū)動程序信息就結(jié)構(gòu)體中增加成員來實現(xiàn)。(4)ARP幀被控設(shè)備接收到ARP幀后,需要把ARP幀中的設(shè)備地址信息提取出來,然后與本機(jī)設(shè)備地址比較,如果相同,則回復(fù)主控設(shè)備,說明自己就是目標(biāo)設(shè)備。獲得本機(jī)設(shè)備地址可11以通過調(diào)用函數(shù)awAddressGet()獲得(參考表16)。當(dāng)然,如果協(xié)議的地址空間與面向設(shè)備的編程地址空間不一致,則需要地址轉(zhuǎn)換后才比較。(5)read幀接收到read幀,主控設(shè)備可能調(diào)用了函數(shù)awRead0,也可能調(diào)用了函數(shù)awReadEx()(參考表21)。如果主控設(shè)備調(diào)用了函數(shù)awRead(),被控設(shè)備需要調(diào)用函數(shù)awDeviceRead()。如果主控設(shè)備調(diào)用了函數(shù)awReadEx0,被控設(shè)備需要調(diào)用函數(shù)awDeviceReadEx()。函數(shù)awDeviceRead()的具體說明見表25;函數(shù)awDeviceReadEx()的具體說明見表26。當(dāng)函數(shù)awDeviceRead()或函數(shù)awDeviceReadEx()返回后,驅(qū)動需要把讀到的數(shù)據(jù)和返回值通過同樣的網(wǎng)絡(luò)接口發(fā)送給主控設(shè)備。值得注意的是,接收到read幀也需要判斷一下設(shè)備地址是否是自身地址。(6)write幀接收到write幀,主控設(shè)備可能調(diào)用了函數(shù)awwrite(),也可能調(diào)用了函數(shù)awWriteEx()(參考表9)。如果主控設(shè)備調(diào)用了函數(shù)awwrite(),被控設(shè)備需要調(diào)用函數(shù)awDeviceWrite()。如果主控設(shè)備調(diào)用了函數(shù)awWriteEx(),被控設(shè)備需要調(diào)用函數(shù)awDeviceWriteEx()。函數(shù)awDeviceWrite()的具體說明見表27;函數(shù)awDeviceWriteEx()的具體說明見表28。當(dāng)函數(shù)awDeviceRead()或函數(shù)awDeviceReadEx()返回后,驅(qū)動需要把讀到的數(shù)據(jù)和返回值通過同樣的網(wǎng)絡(luò)接口發(fā)送給主控設(shè)備。值得注意的是,接收到read幀也需要判斷一下設(shè)備地址是否是本身。七、默認(rèn)通訊協(xié)議(1)默認(rèn)通訊協(xié)議通訊流程面向設(shè)備的編程默認(rèn)協(xié)議使用鎖步方式工作,即主控設(shè)備發(fā)送一個命令幀,然后等待被控設(shè)備一個回復(fù)幀。如果在規(guī)定的時間內(nèi)主控設(shè)備沒有得到正確的回復(fù)幀,則進(jìn)行錯誤處理。否則準(zhǔn)備下一次通訊過程。(2)默認(rèn)協(xié)議幀結(jié)構(gòu)程默認(rèn)協(xié)議所有數(shù)據(jù)以大端方式存儲。本小節(jié)所述的幀格式中,第0字節(jié)為第一個發(fā)送的字節(jié),第1字節(jié)為第二個發(fā)送的字節(jié),以此類推。1.幀結(jié)構(gòu)面向設(shè)備的編程默認(rèn)協(xié)議幀由3部分組成幀頭、幀數(shù)據(jù)和幀校驗。其中幀頭最先發(fā)送,幀校驗最后發(fā)送,示意如下<table>tableseeoriginaldocumentpage12</column></row><table>2.幀頭面向設(shè)備的編程默認(rèn)協(xié)議幀頭為16個字節(jié),具體含義如下<table>tableseeoriginaldocumentpage13</column></row><table>J1假設(shè)—GucBuf為幀的起始位置,usLen為保存幀的長度的變量,則從幀頭獲得幀長度的代碼如下usLen=((AW_ZY_PACKET_HARD*)_GucBuf)->usPacketLen;ntohs(usLen);假設(shè)_GucBuf為幀的起始位置,ulDevice為保存幀的源地址的變量,則從幀頭獲得源地址的代碼如下ulDevice=((AW_ZY_PACKET_HARD*)_GucBuf)->ulSrcAddr;ntohl(ulDevice);3.校驗面向設(shè)備的編程默認(rèn)協(xié)議幀采取16位crc校驗,校驗數(shù)據(jù)放在幀的最后。Crc校驗的表達(dá)式為x~16+x~12+x~5+x~0。4.ARP幀ARP幀的幀代碼為0x00,僅包含幀頭和幀校驗部分。5.ARP回復(fù)幀ARP回復(fù)幀的幀代碼為0x80,僅包含幀頭和幀校驗部分。6.Read幀Read幀的幀代碼為0x01,長度為24,幀結(jié)構(gòu)如下<table>tableseeoriginaldocumentpage13</column></row><table>7.Read回復(fù)幀Read幀的幀代碼為0x81,長度不定,幀結(jié)構(gòu)如下<table>tableseeoriginaldocumentpage13</column></row><table>Write幀的幀代碼為0x02,長度不定,幀結(jié)構(gòu)如下<table>tableseeoriginaldocumentpage14</column></row><table>8.Write回復(fù)幀Write幀的幀代碼為0x82,長度為22字節(jié),幀結(jié)構(gòu)如下<table>tableseeoriginaldocumentpage14</column></row><table>(3)底層驅(qū)動信息結(jié)構(gòu)體面向設(shè)備的編程默認(rèn)協(xié)議底層驅(qū)動具有自己的驅(qū)動信息結(jié)構(gòu)體,其定義見程序清單5。程序清單5默認(rèn)協(xié)議底層驅(qū)動信息默認(rèn)協(xié)議驅(qū)動信息structawZyDriverlnfo{AW_DRIVER_INFO_BASEdiblnfo;/*驅(qū)動信息*//*構(gòu)造函數(shù)*/INT32S(*pfuncCreate)(structawZyDriverInfo*pdiThis);/*析構(gòu)函數(shù)*/INT32S(*pfuncDel)(structawZyDriverInfo*pdiThis);/*發(fā)送數(shù)據(jù)包*/INT32S(*pfuncSend)(structawZyDriverInfo*pdiThis,INT32UulDevice,INT8U*pucDatal,INT16UusLenl,I腦U氺pucData2,INT16UusLen2,INT8UucCrc[2]);unsignedintuiReviceDelay;/氺等H接收延遲時I'司氺/};typedefstructawZyDriverlnfoAW—ZY—DRIVER—INFO;從程序清單5可以看出,協(xié)議驅(qū)動信息結(jié)構(gòu)體具有5個成員,分別是diblnfo、pf皿cCreate、pf皿cDel、pf皿cSend、uiReviceDelay,下面分別介紹diblnfo:結(jié)構(gòu)體變量,面向設(shè)備的編程驅(qū)動信息結(jié)構(gòu)體變量,用于驅(qū)動程序管理;pf皿cCreate:函數(shù)指針,增加默認(rèn)協(xié)議驅(qū)動程序時被調(diào)用,其唯一的參數(shù)為指向自己的驅(qū)動信息結(jié)構(gòu)體變量的指針;pfuncDel:函數(shù)指針,刪除默認(rèn)協(xié)議驅(qū)動程序時被調(diào)用,其唯一的參數(shù)為指向自己的驅(qū)動信息結(jié)構(gòu)體變量的指針;pf皿cSend::函數(shù)指針,用于發(fā)送一個數(shù)據(jù)幀,參考表29;uiReviceDelay:變量,用于指示從發(fā)送數(shù)據(jù)幀到接收回復(fù)數(shù)據(jù)幀的最大間隔。(4)發(fā)送數(shù)據(jù)幀發(fā)送數(shù)據(jù)幀的示意代碼見程序清單6。程序清單6發(fā)送數(shù)據(jù)幀示意代碼INT32SpfuncSend(AW_ZY_DRIVER_INFO*pdiThis,INT32UulDevice,INT8U*pucDatal,INT16UusLenl,INT8U*pucData2,INT16UusLen2,INT8UucCrc[2])I腦U承pucData;INT16UusLen;if(pdiThis==NULL){ret證-AW—PA廳ETER—ERR;if(pucDatal==亂U{ret證-AW—PA廳ETER—ERR;if(usLenl==0){ret證-AW—PA廳ETER—ERR;if(pucData2==NUli&&usLen2!=0){ret證-AW—PA廳ETER—ERR;if(pucData2!=NUli&&usLen2==0){ret證一AWPARAMETERERR;~發(fā)送數(shù)據(jù)緩沖區(qū)*/~發(fā)送數(shù)據(jù)長度*/114/30頁/*傳輸數(shù)據(jù)*/if(ulDevice==AW_BROADCAST_ADDR){/*廣播地址*/目標(biāo)地址=廣播地址;}else{目標(biāo)地址=地址映射表[ulDevice];}usLen=(INT16U)(usLenl+usLen2+sizeof(INT8U)*2);pucData=(INT8,)awHeapMalloc(usLen);if(pucData==亂U{return-AW_NO_MEMARY;}memcpy(pucData,pucDatal,usLenl);memcpy(pucData+usLenl,pucData2,usLen2)5memcpy(pucData+usLenl+usLen2,ucCrc,sizeof(INT8U)氺2);send(目標(biāo)地址,pucData,usLen);/*向"目標(biāo)地址"發(fā)送長度為usLen的數(shù)據(jù)幀*/awHeapFree(pucData);if(pucData2!=NULL){awHeapFree(pucData2);/*發(fā)送成功釋放空間*/}returnAW—0K;}(5)接收數(shù)據(jù)幀—般用線程來處理接收到的數(shù)據(jù)幀,這個線程的示意代碼見程序清單7。程序清單7接收數(shù)據(jù)幀處理staticvoid—awXXXZyThread(void氺pvData){AW_ZY_DRIVER_INF0*pdiInfo;INT8U*pucBuf;INT16UusTmpl;pdilnfo=(AW_ZY_DRIVER_INF0*)pvData;while(l)(pucBuf=awHeapMalloc(數(shù)據(jù)幀長度);if(pucBuf==NULL){awThreadDelay(l);continue;}if(recv(pucBuf)==成功){/*接收數(shù)據(jù)幀成功*/if(awZyPacketCheck(pdilnfo,(AW_ZY_PACKET_HARD*)pucBuf)==16AW—OK){awZyRevice(pdilnfo,(AW_ZY_PACKET_HARD*)pucBuf);}else{awHeapFree(pucBuf);}}}}八、具體應(yīng)用面向設(shè)備的編程技術(shù)與方法已經(jīng)在廣州致遠(yuǎn)電子有限公司的EPC-266x和EPC-296x工控主板上應(yīng)用,并逐步有序的推廣到公司大部分嵌入式產(chǎn)品中。EPC-266x和EPC_296x是廣州致遠(yuǎn)電子有限公司開發(fā)的基于32位ARM處理器LPC2460的可擴(kuò)展的嵌入式工控主板,產(chǎn)品兼容AnyWhere軟件平臺,機(jī)械結(jié)構(gòu)尺寸遵循PC/104相關(guān)規(guī)范,提供MiniISA總線接口。EPC_266x具有資源豐富、內(nèi)存容量大、接口齊全、功耗低、可靠性高等特點。預(yù)裝正版PC/OS-II操作系統(tǒng),并內(nèi)置TCP/IP協(xié)議、iCAN協(xié)議(EPC-296x)、USB2.0Host協(xié)議、FAT32文件管理系統(tǒng)等,EPC-266x可實現(xiàn)遠(yuǎn)程在線固件升級。EPC-266x工控主板和EPC-296x工控主板可在-40。C+85。C寬溫度范圍內(nèi)穩(wěn)定工作,滿足工業(yè)級產(chǎn)品的各種應(yīng)用要求。EPC-266x工控主板和EPC-296x工控主板主要應(yīng)用于工業(yè)控制自動化、煤炭或石油產(chǎn)品稅控系統(tǒng)、小區(qū)門禁安防管理、大型車庫管理系統(tǒng)、交通控制系統(tǒng)、環(huán)境數(shù)據(jù)記錄、通信協(xié)議轉(zhuǎn)換器等領(lǐng)域中。表1傳統(tǒng)編程模式對照表研發(fā)方式基于寄存器基于API基于端口研發(fā)周期長較長較短代碼量大較小較小維護(hù)工作復(fù)雜比較簡單簡單移植難度大比較方便僅限于PLC研發(fā)難度高較高低功能與靈活性高較高低對研發(fā)人員的要求高較高低17<table>tableseeoriginaldocumentpage18</column></row><table><table>tableseeoriginaldocumentpage19</column></row><table><table>tableseeoriginaldocumentpage20</column></row><table>函數(shù)名稱awWrite輸入?yún)?shù)ulDevice:設(shè)備地址ulAddr:端口地址ulData:寫入的數(shù)據(jù)輸出參數(shù)無返回值A(chǔ)W_0K:成功負(fù)數(shù)錯誤,參考表5特殊說明無表8awReadEx函數(shù)名稱awReadEx函數(shù)原型INT32SawReadEx(INT32UulDevice,INT32UulAddr,INT16UusLen,void氺pvData,INT8UucMod)功能描述擴(kuò)展端口讀輸入?yún)?shù)ulDevice:設(shè)備地址ulAddr:端口地址usLen:數(shù)據(jù)數(shù)目ucMod:讀寫模式與端口位寬的或輸出參數(shù)pvData:讀到的數(shù)據(jù)返回值>=0:完成的數(shù)據(jù)數(shù)目負(fù)數(shù)錯誤,參考表5特殊說明ucMod必須與端口的實際屬性一致表9awWriteEx21<table>tableseeoriginaldocumentpage22</column></row><table>函數(shù)名稱pf皿cRead特殊說明無表llpfuncWrite函數(shù)名稱pf皿cWrite函數(shù)原型INT32SpfuncWrite(constAW_DEVICE_INF0*pdiThis,INT32Uus0ffSet,INT16UusLen,void氺pvData)功能描述寫端口組內(nèi)端口時調(diào)用的函數(shù),完成實際的寫操作輸入?yún)?shù)pdiThis:端口組屬性usOffSet:端口偏移,為端口地址-ulAddrStartusLen:以端口寬度為單位的讀寫長度pvData::寫入的數(shù)據(jù)輸出參數(shù)無返回值>=0:完成的數(shù)據(jù)數(shù)目負(fù)數(shù)錯誤,參考表5特殊說明無表12awDeviceAdd函數(shù)名稱awDeviceAdd函數(shù)原型INT32SawDeviceAdd(constAW_DEVICE_INF0*padiinfo)功能描述增加端口組輸入?yún)?shù)padiinfo:端口組屬性23函數(shù)名稱awDeviceAdd輸出參數(shù)無返回值A(chǔ)W_0K:成功負(fù)數(shù)錯誤,參考表5特殊說明無表13awDeviceDel函數(shù)名稱awDeviceDel函數(shù)原型INT32SawDeviceDel(constAW_DEVICE_INF0*padiinfo)功能描述刪除端口組輸入?yún)?shù)padiinfo:端口組屬性輸出參數(shù)無返回值A(chǔ)W_0K:成功負(fù)數(shù)錯誤,參考表5特殊說明無表14awlnit函數(shù)名稱awlnit函數(shù)原型INT32SawInit(void)功能描述面向設(shè)備的編程初始化輸入?yún)?shù)無輸出參數(shù)無返回值A(chǔ)W—OK:成功負(fù)數(shù)錯誤,參考表5特殊說明必須調(diào)用此函數(shù)后才能使用面向設(shè)備的編程24表15awAddressSet<table>tableseeoriginaldocumentpage25</column></row><table>表16awAddressGet<table>tableseeoriginaldocumentpage25</column></row><table>表17awRemoteDrivesAdd<table>tableseeoriginaldocumentpage25</column></row><table><table>tableseeoriginaldocumentpage26</column></row><table><table>tableseeoriginaldocumentpage27</column></row><table>表20pf皿cArp<table>tableseeoriginaldocumentpage27</column></row><table>表21pfuncRead<table>tableseeoriginaldocumentpage27</column></row><table>函數(shù)名稱pfuncRead功能描述讀指定端口數(shù)據(jù)當(dāng)usLen==l腿ucMod==0,ucMod為端口默認(rèn)值,pvData指向4字節(jié)整數(shù)(注4字節(jié)整數(shù)取決于本地大小端模式)。其它情況usLen和ucMod必須為有效值輸入?yún)?shù)pdiThis:本驅(qū)動屬性ulDevice:設(shè)備地址ulAddr:端口地址usLen:以字節(jié)為單位的數(shù)據(jù)長度,O為端口默認(rèn)長度ucMod:讀寫模式,參考7.4(1)小節(jié)輸出參數(shù)pvData::讀到的數(shù)據(jù)返回值>=0:完成的數(shù)據(jù)數(shù)目負(fù)數(shù)錯誤,參考表5特殊說明無表22pfuncWrite函數(shù)名稱pfuncWrite函數(shù)原型INT32SpfuncWrite(AW—DRIVER—INFO—BASE*pdiThis,INT32UulDevice,INT32UulAddr,INT16UusLen,void氺pvData,INT8UucMod;i功能描述讀指定端口數(shù)據(jù)當(dāng)usLen==l腿ucMod==0,ucMod為端口默認(rèn)值,pvData指向4字節(jié)整數(shù)(注4字節(jié)整數(shù)取決于本地大小端模式)。其它情況usLen和ucMod必須為有效值輸入?yún)?shù)pdiThis:本驅(qū)動屬性ulDevice:設(shè)備地址ulAddr:端口地址pvData:數(shù)據(jù)緩沖區(qū)usLen:以字節(jié)為單位的數(shù)據(jù)長度,O為端口默認(rèn)長度ucMod:讀寫模式,參考7.4(1)小節(jié)28<table>tableseeoriginaldocumentpage29</column></row><table>表23awArpRsvdSet<table>tableseeoriginaldocumentpage29</column></row><table>表24awArpRsvdGet<table>tableseeoriginaldocumentpage29</column></row><table><table>tableseeoriginaldocumentpage30</column></row><table>表27awDeviceWrite函數(shù)名稱awDeviceWrite函數(shù)原型INT32SawDeviceWrite(INT32UulAddr,INT32UulData)功能描述被控設(shè)備端口寫輸入?yún)?shù)ulAddr:端口地址ulData:寫入的數(shù)據(jù)輸出參數(shù)無返回值A(chǔ)W_0K:成功負(fù)數(shù)錯誤,參考表5特殊說明無表28awDeviceWriteEx函數(shù)名稱awDeviceWriteEx函數(shù)原型INT32SawDeviceWriteEx(INT32UulAddr,INT16UusLen,void氺pvData,INT8UucMod;i功能描述被控設(shè)備擴(kuò)展端口寫輸入?yún)?shù)ulAddr:端口地址usLen:數(shù)據(jù)數(shù)目ulData:數(shù)據(jù)ucMod:讀寫模式與端口位寬的或輸出參數(shù)無返回值>=0:完成的數(shù)據(jù)數(shù)目負(fù)數(shù)錯誤,參考表531函數(shù)名稱awDeviceWriteEx特殊說明iicMod必須與端口的實際屬性一致表29pfuncSend函數(shù)名稱pf皿cSend函數(shù)原型INT32SpfuncSend(AW_ZY_DRIVER_INF0*pdiThis,INT32UulDevice,INT8U*pucDatal,INT16UusLenl,INT8U*pucData2,INT16UusLen2,INT8UucCrc[2])功能描述默認(rèn)協(xié)議底層驅(qū)動發(fā)送數(shù)據(jù)幀輸入?yún)?shù)pdiThis:默認(rèn)協(xié)議底層驅(qū)動信息ulDevice:設(shè)備地址pucDatal:第一段數(shù)據(jù)usLenl:以字節(jié)為單位的第一段數(shù)據(jù)長度pucData2:第二段數(shù)據(jù)usLen2:以字節(jié)為單位的第二段數(shù)據(jù)長度ucCrc:crc校驗輸出參數(shù)無返回值>=0:完成的數(shù)據(jù)數(shù)目負(fù)數(shù)錯誤,參考表5特殊說明3權(quán)利要求面向設(shè)備的編程技術(shù)與方法,把所有用網(wǎng)絡(luò)連接起來的嵌入式系統(tǒng)作為一個整體來考慮,嵌入式系統(tǒng)包括主控設(shè)備(1)、被控設(shè)備(2)和混合設(shè)備(3),其特征在于以設(shè)備地址(4)唯一識別設(shè)備,設(shè)備地址與通訊協(xié)議無關(guān),以端口地址(5)唯一識別設(shè)備的內(nèi)部功能。設(shè)備地址和端口地址兩者共同確定網(wǎng)絡(luò)中設(shè)備的特定功能,對設(shè)備地址和端口地址的讀寫操作就可以控制網(wǎng)絡(luò)中特定功能,編程方法與操作系統(tǒng)和硬件平臺無關(guān)。其中主控設(shè)備(1),是處于主導(dǎo)地位、控制其它的設(shè)備。被控設(shè)備(2),是接受主控設(shè)備控制的設(shè)備?;旌显O(shè)備(3),是一個既可控制別的設(shè)備,又可接受別的設(shè)備控制的設(shè)備。設(shè)備地址(4),用32位無符號數(shù)表示。端口地址(5),用32位無符號數(shù)表示。2.根據(jù)權(quán)利要求1所述的面向設(shè)備的編程方法,其特征在于所述編程方法的應(yīng)用程序編程接口包含但不限于所有的接口函數(shù)(6)、結(jié)構(gòu)體定義(7)和宏定義(8)。3.根據(jù)權(quán)利要求2所述的面向設(shè)備的編程方法,其特征在于所述編程方法的應(yīng)用程序編程接口包含端口屬性和返回值定義。4.根據(jù)權(quán)利要求2所述的面向設(shè)備的編程方法,其特征在于所述編程方法的應(yīng)用程序編程接口包含主控設(shè)備和被控設(shè)備編程接口。5.根據(jù)權(quán)利要求2所述的面向設(shè)備的編程方法,其特征在于所述編程方法的應(yīng)用程序編程接口包含主控設(shè)備通訊協(xié)議驅(qū)動編程接口。6.根據(jù)權(quán)利要求2所述的面向設(shè)備的編程方法,其特征在于所述編程方法的應(yīng)用程序編程接口包含被控設(shè)備通訊協(xié)議驅(qū)動編程接口。7.根據(jù)權(quán)利要求2所述的面向設(shè)備的編程方法,其特征在于所述編程方法的應(yīng)用程序編程接口包含默認(rèn)通訊協(xié)議的驅(qū)動編程接口。8.根據(jù)權(quán)利要求1所述的面向設(shè)備的編程方法,其特征在于所述編程方法的默認(rèn)通訊協(xié)議(9),包含但不限于工作模式和數(shù)據(jù)幀結(jié)構(gòu)。9.根據(jù)權(quán)利要求1所述的面向設(shè)備的編程方法,其特征在于所述編程方法的多協(xié)議多網(wǎng)絡(luò)支持技術(shù)(10)。10.根據(jù)權(quán)利要求1所述的面向設(shè)備的編程方法,其特征在于所述編程方法的協(xié)議及鏈路自動動態(tài)匹配技術(shù)(11)。全文摘要本發(fā)明屬于嵌入式系統(tǒng)軟件領(lǐng)域,涉及嵌入式系統(tǒng)面向設(shè)備的編程技術(shù)與方法,包括軟件編程方法、應(yīng)用程序編程接口、驅(qū)動程序編程接口和通訊協(xié)議。目的在于,既提供了一個革命性的嵌入式系統(tǒng)編程思想,并且提供了其實現(xiàn)方法。本發(fā)明公開了一種編程思想和實現(xiàn)方法,包含編程思想、應(yīng)用程序編程接口、默認(rèn)通訊協(xié)議、多協(xié)議多網(wǎng)絡(luò)支持技術(shù)、協(xié)議及鏈路自動動態(tài)匹配技術(shù),其特征在于用設(shè)備地址和端口地址共同唯一識別整個網(wǎng)路或系統(tǒng)中特定的功能,并包含端口屬性定義、返回值定義、主控設(shè)備編程接口、被控設(shè)備編程接口、主控設(shè)備通訊協(xié)議驅(qū)動編程接口、被控設(shè)備通訊協(xié)議驅(qū)動編程接口、默認(rèn)通訊協(xié)議的驅(qū)動編程接口、默認(rèn)通訊協(xié)議工作模式、默認(rèn)通訊協(xié)議工作模式幀結(jié)構(gòu)等。文檔編號G06F9/44GK101702119SQ20091004235公開日2010年5月5日申請日期2009年9月1日優(yōu)先權(quán)日2009年9月1日發(fā)明者周立功申請人:廣州致遠(yuǎn)電子有限公司