英創(chuàng)ARM9工控主板的一個(gè)很大的特色就是提供了標(biāo)準(zhǔn)的CAN總線通訊接口,客戶可以方便地在工業(yè)現(xiàn)場(chǎng)、汽車、船舶等等領(lǐng)域進(jìn)行CAN通信應(yīng)用。由于英創(chuàng)ARM9嵌入式主板采用WinCE操作系統(tǒng),很多客戶都選擇了界面友好、開發(fā)便利的C#語言(使用Visual Studio 2005.NET集成開發(fā)環(huán)境);以往用戶在使用C#操作控制CAN總線的時(shí)候,是使用英創(chuàng)提供的動(dòng)態(tài)鏈接庫,采用傳統(tǒng)的DllImport方法,首先在程序開始的地方來進(jìn)行函數(shù)申明,然后才能在程序中進(jìn)行調(diào)用;而這個(gè)動(dòng)態(tài)鏈接庫里面函數(shù)的EntryPoint由于系統(tǒng)的原因,往往是一個(gè)古怪的名字,而且英創(chuàng)每次在進(jìn)行動(dòng)態(tài)鏈接庫的升級(jí)后,這個(gè)EntryPoint的名字就可能發(fā)生變化,這對(duì)用戶程序的可維護(hù)性帶來極大的不便。為了解決這個(gè)問題,英創(chuàng)公司現(xiàn)在提供了操作CAN總線的COM組件接口;用戶只需要在目標(biāo)平臺(tái)上進(jìn)行組件注冊(cè),然后在C#程序開發(fā)的時(shí)候,對(duì)該COM組件添加引用,即可在程序里面自由地通過對(duì)象操作來使用函數(shù),而不必去費(fèi)心地進(jìn)行函數(shù)申明的工作。下面我們就以EM9000嵌入式主板為實(shí)例,在C#使用COM組件接口操作CAN總線作一個(gè)說明:
1、在目標(biāo)嵌入式主板上進(jìn)行COM組件注冊(cè)
CAN COM組件的核心文件就是英創(chuàng)提供的ComCAN.dll動(dòng)態(tài)鏈接庫文件,首先需要將它在目標(biāo)嵌入式工控主板上注冊(cè)。用戶可以使用Visual Studio Remote Tools提供的“遠(yuǎn)程文件查看器”連接目標(biāo)嵌入式工控主板,并將英創(chuàng)提供的ComCAN.dll和REGSVR32.exe這兩個(gè)文件下載到目標(biāo)主板的Flash存儲(chǔ)器上去(這里假設(shè)下載到EM9000的NOR Flash)。然后在開發(fā)主機(jī)PC上使用Telnet連接目標(biāo)工控主板(如圖),進(jìn)入放置剛才下載這兩個(gè)文件的Flash存儲(chǔ)器目錄,運(yùn)行:
REGSVR32 ComCAN.dll
即可完成COM組件注冊(cè)。
2、在C#工程中添加COM組件引用
接下來可以進(jìn)入C# COM組件開發(fā)。首先將ComCAN.dll文件復(fù)制到用戶的C#工程目錄下,然后在Visual Studio 2005.NET集成開發(fā)環(huán)境中打開用戶工程。為了使用CAN總線COM組件,必須為該工程添加外部引用;用戶可在集成開發(fā)環(huán)境的右側(cè)的“解決方案資源管理器”中找到“引用”,對(duì)其單擊鼠標(biāo)右鍵,然后單擊“添加引用”(如圖)。
在彈出的“添加引用”對(duì)話框中,選擇“瀏覽”選項(xiàng)卡,并在你的工程目錄下找到你剛才復(fù)制過來的ComCAN.dll文件,選擇它,并單擊“確定”。
這時(shí),你已經(jīng)完成了添加工程中的COM組件的引用工作,這時(shí),你可以在集成開發(fā)環(huán)境的右側(cè)的“解決方案資源管理器”中看到了一個(gè)名稱為ComCANLib的引用,同時(shí),ComCAN.dll也加入到了你的工程中(如圖)。
3、在應(yīng)用程序開發(fā)中使用CAN COM組件
首先,為了使應(yīng)用程序能直接調(diào)用相關(guān)的類和函數(shù),必須在程序的起始using語句中添加:
using ComCANLib;
程序中對(duì)于CAN總線的操作完全圍繞CoCANClass這個(gè)類來進(jìn)行的。用戶可以首先定義CAN總線操作的類的對(duì)象實(shí)體,然后通過對(duì)對(duì)象里面的方法(函數(shù))來進(jìn)行所需要的操作。CoCANClass所定義的對(duì)象只有5個(gè)函數(shù)方法,使用此5個(gè)函數(shù)方法,就可以實(shí)現(xiàn)CAN總線的啟動(dòng)、發(fā)送、接收、結(jié)束、提示出錯(cuò)等工作。下面大致做一些講解:
(1) 定義類的對(duì)象
CoCANClass EM9000_CAN = new CoCANClass(); //定義CAN對(duì)象實(shí)例
(2) 使用對(duì)象的方法函數(shù)
英創(chuàng)在《CAN接口COM組件在WinCE平臺(tái)上的實(shí)現(xiàn)》一文中提供了CAN COM組件的方法函數(shù)列表,里面詳細(xì)羅列了各種方法函數(shù)的使用,以及相應(yīng)的注意事項(xiàng),用戶在進(jìn)行CAN開發(fā)之前應(yīng)該詳細(xì)閱讀該文章。由于該COM組件是用C++來編寫的,所以,這個(gè)列表里面的函數(shù)形式以及變量是以C++的方式來標(biāo)注的;由于部分函數(shù)存在指針參數(shù),同時(shí),部分變量類型在C#語言里面的使用存在變化,所以我們下面以示例的形式來進(jìn)行函數(shù)說明(舉例中所使用的類對(duì)象已經(jīng)在上文中定義):
StartCAN(/*[in]*/ UINT canNo, /*[in]*/ UCHAR baud, /*[in]*/ BYTE
acceptanceFilter[9],/*[in]*/BYTE size,/*[out,retval]*/BOOL *pBool )
打開指定CAN接口的函數(shù),在C#中,我們一般按照如下示例的方式來使用:
int Start_status = EM9000_CAN.StartCAN(Port_No, BaudrateSerialno, ACCFilter, 9);
實(shí)際在C#中使用的時(shí)候,只有4個(gè)變量(變量的意義請(qǐng)參考《CAN接口COM組件在WinCE平臺(tái)上的實(shí)現(xiàn)》一文),返回值是一個(gè)C++的BOOL變量,而在C#中,是沒有BOOL變量的(只有bool),所以,這里處理成一個(gè)int變量,為1為真,為0為假。
WriteCAN(/*[in]*/ BYTE buf[13], /*[in]*/ DWORD bufLen,
/*[out,retval]*/ BOOL *pBool )
向CAN總線發(fā)送數(shù)據(jù)的函數(shù),在C#中,我們一般按照如下示例的方式來使用:
int sResult = EM9000_CAN.WriteCAN(TxBuf, dlen);
參數(shù)TxBuf是一個(gè)長度為13的byte數(shù)組(所發(fā)送的幀),dlen是數(shù)據(jù)包的總長度(uint數(shù)據(jù)類型)。返回值是一個(gè)C++的BOOL變量,這里處理成一個(gè)int變量,為1為真,為0為假。
ReadCAN( /*[out]*/ BYTE buf[13], /*[out,retval]*/ BOOL *pBool )
接收CAN總線數(shù)據(jù)的函數(shù),在C#中,我們一般按照如下示例的方式來使用:
int rResult = EM9000_CAN.ReadCAN(RxBuf);
參數(shù)RxBuf是一個(gè)長度為13的byte數(shù)組(所接收的幀)。返回值是一個(gè)C++的BOOL變量,這里處理成一個(gè)int變量,為1為真,為0為假。
GetErrorCode(/*[out]*/ DWORD *ECCRegCode,/*[out]*/ DWORD
errorArray[16], /*[out,retval]*/ int *errorCount)
獲取通訊錯(cuò)誤代碼的函數(shù),帶有一個(gè)返回輸入值的指針變量,我們是按照如下示例的方法在進(jìn)行使用:
uint eccRegcod = 0; //初始化可以隨意設(shè)置一個(gè)值
uint[] errorArray = new uint[16];
int errorCount = EM9000_CAN.GetErrorCode(out eccRegcod, errorArray);
注意eccRegcod由C++的指針變成了一個(gè)out變量,它將返回CAN接口中錯(cuò)誤代碼捕捉寄存器的值;errorArray是最近16次的CAN接口通訊錯(cuò)誤編碼的uint數(shù)組;方法函數(shù)的返回值是一個(gè)int變量errorCount,它就返回總錯(cuò)誤的次數(shù)。
StopCAN( )
關(guān)閉CAN通訊接口。
用戶還可以參考英創(chuàng)提供的C# CAN總線COM組件例程,進(jìn)行實(shí)際的應(yīng)用開發(fā)。
-
嵌入式主板
+關(guān)注
關(guān)注
7文章
6085瀏覽量
35296
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論