精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

英創(chuàng)信息技術(shù)CAN接口COM組件在WinCE平臺(tái)上的應(yīng)用

英創(chuàng)信息技術(shù) ? 來源:英創(chuàng)信息技術(shù) ? 作者:英創(chuàng)信息技術(shù) ? 2019-11-12 10:11 ? 次閱讀

控制器局域網(wǎng)(CAN)是一個(gè)串行、異步、多主的通信協(xié)議,它以其高性能、高可靠性以及靈活的設(shè)計(jì)受到人們的重視,應(yīng)用越來越廣泛。英創(chuàng)公司的ARM9工控主板如EM9161,EM9260等均支持CAN總線接口,并實(shí)現(xiàn)了基于Windows CE規(guī)范的流式驅(qū)動(dòng)程序(Stream Device Driver),對(duì)于大多數(shù)基于C/C++開發(fā)環(huán)境的應(yīng)用,英創(chuàng)公司以靜態(tài)庫can_api.lib形式提供了相應(yīng)接口函數(shù),客戶通過相應(yīng)的API函數(shù)即可完成對(duì)CAN接口的操作。但對(duì)于使用像C#這樣高級(jí)語言的應(yīng)用,由于一般不支持靜態(tài)庫的調(diào)用,因此需要新的方法來解決這個(gè)問題。我們目前采用的基本方法是在該靜態(tài)庫的基礎(chǔ)上,針對(duì)CAN通訊接口的數(shù)據(jù)收發(fā)以及對(duì)出錯(cuò)情況監(jiān)測的應(yīng)用,封裝一個(gè)基于CAN通訊接口應(yīng)用的COM組件,該組件中提供了一套更為簡潔的接口方法函數(shù),可以方便多種開發(fā)工具的調(diào)用,如:C#、VB、LabView等。使用時(shí)客戶只需在系統(tǒng)中一次性注冊(cè)該組件,并在應(yīng)用程序中引用對(duì)應(yīng)的DLL或TLB文件,就能方便使用其相應(yīng)的接口方法函數(shù)了。

本文介紹的基于英創(chuàng)工控主板CAN通訊接口的COM組件提供五個(gè)接口方法函數(shù):打開CAN接口,關(guān)閉CAN接口,向CAN接口寫數(shù)據(jù),從CAN接口讀取數(shù)據(jù)以及讀取接口錯(cuò)誤代碼。客戶方調(diào)用COM組件打開CAN接口后,COM組件服務(wù)器便在組件內(nèi)部創(chuàng)建兩個(gè)線程,一個(gè)用于接收CAN接口數(shù)據(jù),一個(gè)用于CAN通訊錯(cuò)誤處理。數(shù)據(jù)接收線程里通過WaitForSingleObject來等待CAN接口的接收事件發(fā)生,當(dāng)CAN接口收到數(shù)據(jù)后,將數(shù)據(jù)放入指定的接收數(shù)據(jù)緩存中,客戶通過調(diào)用讀數(shù)據(jù)函數(shù),將數(shù)據(jù)從緩存中讀出。后面會(huì)對(duì)各函數(shù)做詳細(xì)的說明。

1、數(shù)組作為組件參數(shù)

作為通信類組件,數(shù)組常常作為接口方法函數(shù)參數(shù)傳遞,以交換數(shù)據(jù),COM 組件是運(yùn)行在分布式環(huán)境中的,對(duì)于一個(gè)組件程序(DLL或EXE),使用者可能是在本機(jī)的某個(gè)進(jìn)程內(nèi)加載組件(INPROC_SERVER),也可能是從另一個(gè)進(jìn)程中調(diào)用組件的進(jìn)程(LOCAL_SERVER),也可能是在這臺(tái)計(jì)算機(jī)上調(diào)用遠(yuǎn)程計(jì)算機(jī)上的組件(REMOTE_SERVER),同時(shí),組件也可能是跨語言調(diào)用的,因此對(duì)于將數(shù)組作為組件參數(shù)傳遞時(shí)與我們常用的參數(shù)傳遞方法有較大區(qū)別。

C語言中,通常用數(shù)組名作為函數(shù)參數(shù)。如下例程,求10次得分的總和。

int Sum( int array[10] )

{

int i, sum;

for( sum =0, i = 0;i《10; i++ )

sum += array[i];

return( sum );

}

main( )

{

int sum;

int score[10] = {75,80,81,76,75,86,90,77,80,81};

sum = Sum( score );

}

例中array是主調(diào)函數(shù)中的實(shí)參數(shù)組名,在被調(diào)函數(shù)中聲明了形參數(shù)組,且大小為10,但實(shí)現(xiàn)上,在形參中指定數(shù)組大小不起任何作用,因?yàn)閿?shù)組名作為實(shí)參傳遞時(shí),僅是把實(shí)參數(shù)組的起始地址傳遞給形參數(shù)據(jù),所以被調(diào)函數(shù)也可以聲明成如下形式:Sum( int array[ ] )或Sum( int *array )。

在COM組件中,缺省情況下,指針參數(shù)總是被假設(shè)為指向單個(gè)實(shí)例的指針,而不是數(shù)組,在參數(shù)中傳遞一個(gè)數(shù)據(jù)最簡單的方法是使用固定數(shù)組技術(shù),也就是在參數(shù)中指名數(shù)組維數(shù)信息。假設(shè)Sum為一組件接口方法函數(shù),則其接口就應(yīng)該描述為:HRESULT Sum( [in] int array[10] )。然而,當(dāng)你自己用C++寫一個(gè)COM組件程序(dll形式),然后再用C++來本地調(diào)用(準(zhǔn)確的說是套間內(nèi)調(diào)用)這個(gè)組件是,也可以將接口方法描述為:HRESULT Sum( [in] int array[] )或HRESULT Sum( [in] int *array),并且程序也能得到正常的運(yùn)行結(jié)果,但這樣的接口方法描述存在兩個(gè)問題:1、當(dāng)用C#引用組件的DLL或TLB時(shí),array會(huì)被認(rèn)為是個(gè)指針,而在C#中聲明的數(shù)組,數(shù)組名不能作為實(shí)參傳遞。2、當(dāng)這個(gè)方法函數(shù)是跨套間調(diào)用時(shí),接口代理僅會(huì)將array[0]的值解析出來,通過COM的RPC通信協(xié)議將數(shù)據(jù)發(fā)送到COM服務(wù)器存根,此時(shí)在接口方法內(nèi)再操作其它array元素將出錯(cuò)。所以正確的接口描述應(yīng)該是HRESULT Sum( [in] int array[10] ),接口代理總是在OPRC請(qǐng)求消息中分配10*sizeof(int)個(gè)字節(jié)空間,將后把10個(gè)元素一起拷貝到消息中,一旦服務(wù)器收到些ORPC請(qǐng)求消息,接口存根直接用接收到的緩沖區(qū)作為函數(shù)的參數(shù)。

固定數(shù)組是最簡單,最緊湊,執(zhí)行效率最高的數(shù)據(jù)表示形式,除了固定數(shù)組外,還可以采用可變數(shù)組、開放數(shù)組、安全數(shù)組等作為組件方法函數(shù)參數(shù)來傳遞一個(gè)數(shù)組,在本例中,由于CAN協(xié)議規(guī)定了一幀數(shù)據(jù)最多不會(huì)超過13個(gè)字節(jié)長度,因此采用13個(gè)字節(jié)的固定數(shù)組是一個(gè)較好的選擇。對(duì)于其它類型數(shù)組請(qǐng)參考相應(yīng)資料

2、CAN組件接口方法函數(shù)

(1)StartCAN( /*[in]*/ UINT canNo, /*[in]*/ UCHAR baud, /*[in]*/ BYTE acceptanceFilter[9],

/*[in]*/ BYTE size, /*[out,retval]*/ BOOL *pBool )

功能描述:打開指定CAN接口。

參數(shù)說明:

/*[in]*/ UINT canNo 設(shè)置要打開的CAN接口號(hào)

canNo =1 :主板上帶的CAN接口

=2 :通過ISA總線擴(kuò)展的CAN接口

/*[in]*/ UCHAR baud 設(shè)置通訊波特率

baud = 0 :10Kbps 1 :20Kbps 2 :50bps

3 :100bps 4 :125Kbps 5 :250Kbps

6 :500bps 7:1Mbps

/*[in]*/BYTE acceptanceFilter[9] 根據(jù)通訊報(bào)文格式定義過濾器的配置,定義為9個(gè)字節(jié)的過濾器,其中前4個(gè)字節(jié)用于定義過濾器的接收碼,后4個(gè)字節(jié)用于定義過濾器的接收屏蔽碼,最后一個(gè)字節(jié)用于定義選擇單/雙濾波模式。

acceptanceFilter[8] = 0:雙濾波

= 1:單濾波

/*[in]*/BYTE size定義的過濾器的大小(應(yīng)該設(shè)置為9)

/*[out,retval]*/BOOL *pBool CAN接口打開成功/失敗標(biāo)志

TRUE:CAN接口打開成功

FALSE:CAN接口打開失敗

(2)WriteCAN(/*[in]*/ BYTE buf[13], /*[in]*/ DWORD bufLen, /*[out,retval]*/ BOOL *pBool )

功能描述:向CAN接口寫數(shù)據(jù)

參數(shù)說明:

/*[in]*/ BYTE buf[13] 準(zhǔn)備通過CAN接口發(fā)送的數(shù)據(jù)包

/*[in]*/ DWORD bufLen 發(fā)送數(shù)據(jù)包長度

/*[out,retval]*/ BOOL *pBool 數(shù)據(jù)發(fā)送成功/失敗標(biāo)志

TRUE:數(shù)據(jù)發(fā)送成功

FALSE:數(shù)據(jù)發(fā)送失敗

(3)ReadCAN( /*[out]*/ BYTE buf[13], /*[out,retval]*/ BOOL *pBool )

功能描述:從接收緩存中讀取一幀CAN接口數(shù)據(jù)

參數(shù)說明:

/*[out]*/ BYTE buf[13] 數(shù)據(jù)接收緩存(緩存區(qū)需大于13個(gè)字節(jié))

/*[out,retval]*/ BOOL *pBool CAN接口是否有數(shù)據(jù)標(biāo)志

TRUE:CAN接口收到數(shù)據(jù)(返回值為TRUE時(shí)需再次調(diào)用本函數(shù),直到返回值FLASH,以將數(shù)據(jù)全部讀出)

FALSE:CAN接口沒有收到數(shù)據(jù)

(4)GetErrorCode(/*[out]*/ DWORD *ECCRegCode,/*[out]*/ DWORD errorArray[16],

/*[out,retval]*/ int *errorCount)

功能描述:得到錯(cuò)誤代碼

參數(shù)說明:

/*[out]*/ DWORD *ECCRegCode CAN接口中錯(cuò)誤代碼捕捉寄存器的值

/*[out]*/ DWORD errorArray[16] 最近16次的CAN接口通訊錯(cuò)誤編碼(緩存區(qū)需大于16個(gè)字節(jié))

/*[out,retval]*/ int *errorCount 總錯(cuò)誤次數(shù)

(5)StopCAN( )

功能描述:關(guān)閉CAN通訊接口

3、CAN組件調(diào)用

在使用COM組件之前需要注冊(cè)組件,COM組件的注冊(cè)過程請(qǐng)參考本網(wǎng)站相關(guān)文章或參考相應(yīng)書籍,這里不再贅述。下面是在EVC中調(diào)用CAN組件接口方法函數(shù)的一些程序片段。

//從Program ID得到Class ID

hr = CLSIDFromProgID( OLESTR( ‘ ComCAN.CoCAN ’ ), &clsid );

if( FAILED( hr ) )

{

return -1;

}

//從Class ID得到ICoSerial接口指針

hr = CoCreateInstance( clsid, NULL, CLSCTX_INPROC_SERVER, __uuidof(ICoCAN ),

( void** )&pICoCAN );

if( FAILED( hr ))

{

return -1;

}

//打開CAN接口

//過濾器設(shè)置

Filter[0] = 0; // ACR0

Filter[1] = 0x5f; // ACR1

Filter[2] = 0; // ACR2

Filter[3] = 0x1f; // ACR3

Filter[4] = 0xff; // AMR0

Filter[5] = 0xff; // AMR1

Filter[6] = 0xff; // AMR2

Filter[7] = 0xff; // AMR3

Filter[8] = DUAL_FILTER_MODE; // 設(shè)置濾波器模式

Baud = CAN_TIMING_250K; // 波特率:250Kbps

CanNo = 1;

bResult = pICoCAN-》StartCAN( CanNo, Baud, (BYTE*)Filter, 9 );

if( !bResult )

return -1;

//數(shù)據(jù)接收和發(fā)送

while( TURE )

{

bResult = pICoCAN-》ReadCAN( (BYTE*)buf );

if( bResult )

{

dLen = buf[0]&0x0f;

if( buf[0]&0x80 ) // 擴(kuò)展幀

{

pICoCAN-》WriteCAN( (BYTE*)buf, dLen+5 );

}

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

{

pICoCAN-》WriteCAN( (BYTE*)buf, dLen+3 );

}

}

Sleep( 10 );

}

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • WINDOWS
    +關(guān)注

    關(guān)注

    3

    文章

    3526

    瀏覽量

    88449
  • 嵌入式主板
    +關(guān)注

    關(guān)注

    7

    文章

    6085

    瀏覽量

    35225
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    創(chuàng)WinCE主板CAN接口數(shù)據(jù)接收性能測試

      創(chuàng)公司嵌入式主板產(chǎn)品中,高端的335x主板系列及低端的ESM9287主板均可支持2路CAN總線標(biāo)準(zhǔn)接口。本文提供CE
    發(fā)表于 09-19 11:15

    創(chuàng)信息技術(shù)CAN接口COM組件C#語言領(lǐng)域應(yīng)用

     創(chuàng)ARM9工控主板的一個(gè)很大的特色就是提供了標(biāo)準(zhǔn)的CAN總線通訊接口,客戶可以方便地工業(yè)現(xiàn)場、汽車、船舶等等領(lǐng)域進(jìn)行
    的頭像 發(fā)表于 11-12 10:34 ?2417次閱讀
    <b class='flag-5'>英</b><b class='flag-5'>創(chuàng)</b><b class='flag-5'>信息技術(shù)</b><b class='flag-5'>CAN</b><b class='flag-5'>接口</b><b class='flag-5'>COM</b><b class='flag-5'>組件</b><b class='flag-5'>在</b>C#語言領(lǐng)域應(yīng)用

    創(chuàng)信息技術(shù)工控主板EM9360的GPIO介紹

    創(chuàng)公司的ARM9工控主板產(chǎn)品 EM9360是一款預(yù)裝WinCE操作系統(tǒng),以多種通訊接口、支持各種擴(kuò)展為其技術(shù)特色。EM9360的板載的3路
    的頭像 發(fā)表于 11-14 09:34 ?2370次閱讀

    創(chuàng)信息技術(shù)C#使用COM組件接口進(jìn)行串口操作介紹

    通訊的時(shí)候,往往是需要對(duì)RTS進(jìn)行設(shè)置的。為了解決這個(gè)問題,創(chuàng)公司現(xiàn)在提供了操作串口的COM組件接口;用戶只需要在目標(biāo)
    的頭像 發(fā)表于 11-14 09:37 ?2267次閱讀
    <b class='flag-5'>英</b><b class='flag-5'>創(chuàng)</b><b class='flag-5'>信息技術(shù)</b>C#使用<b class='flag-5'>COM</b><b class='flag-5'>組件</b><b class='flag-5'>接口</b>進(jìn)行串口操作介紹

    創(chuàng)信息技術(shù)如何實(shí)現(xiàn)WinCE系統(tǒng)中USB設(shè)備自動(dòng)檢測概述

    創(chuàng)公司ARM9系列工控主板預(yù)裝正版WinCE操作系統(tǒng),提供標(biāo)準(zhǔn)USB接口,本文介紹如何在應(yīng)用程序中判斷USB存儲(chǔ)設(shè)備的插入和移出操作。
    的頭像 發(fā)表于 11-18 09:44 ?1365次閱讀
    <b class='flag-5'>英</b><b class='flag-5'>創(chuàng)</b><b class='flag-5'>信息技術(shù)</b>如何實(shí)現(xiàn)<b class='flag-5'>WinCE</b>系統(tǒng)中USB設(shè)備自動(dòng)檢測概述

    創(chuàng)信息技術(shù)WinCE工控主板的數(shù)據(jù)庫配置簡介

    。由于創(chuàng)公司的產(chǎn)品處于不斷發(fā)展之中,WinCE不斷的發(fā)展之中,導(dǎo)致不同型號(hào)的產(chǎn)品中存在配置的數(shù)據(jù)庫的情況有所不同,本文的主要目的是詳
    的頭像 發(fā)表于 01-14 11:35 ?1434次閱讀

    創(chuàng)信息技術(shù)嵌入式系統(tǒng)設(shè)備驅(qū)動(dòng)接口的C#編程

    的驅(qū)動(dòng)程序,用戶只需直接調(diào)用相應(yīng)的接口函數(shù)即可實(shí)現(xiàn)。 使用C#進(jìn)行應(yīng)用程序開發(fā)時(shí),由于C#無法使用C++的靜態(tài)庫函數(shù),對(duì)于一些流式驅(qū)動(dòng)設(shè)備,比如ISA,GPIO,WDT,CAN,SPI,IRQ等,沒有封裝好的庫函數(shù)可操作,如果
    的頭像 發(fā)表于 01-15 11:29 ?1274次閱讀

    創(chuàng)信息技術(shù)WinCE遠(yuǎn)程桌面介紹

    創(chuàng)公司WinCE系列工控主板,即可以支持多種格式的單色點(diǎn)陣液晶,也可以支持從320240到1024768的各種分辨率的彩色TFT LCD,借助WinCE強(qiáng)大的GUI,用戶可以很容易的
    的頭像 發(fā)表于 01-16 10:24 ?2897次閱讀
    <b class='flag-5'>英</b><b class='flag-5'>創(chuàng)</b><b class='flag-5'>信息技術(shù)</b><b class='flag-5'>WinCE</b>遠(yuǎn)程桌面介紹

    創(chuàng)信息技術(shù)WinCE平臺(tái)下通過系統(tǒng)異常信息定位程序bug位置

    使用基于WINCE平臺(tái)創(chuàng)系列工控主板進(jìn)行應(yīng)用程序開發(fā)時(shí),當(dāng)程序產(chǎn)生異常退出,CE操作系統(tǒng)將通過調(diào)試串口打印類似如下錯(cuò)誤信息。根據(jù)這些
    的頭像 發(fā)表于 01-17 11:14 ?1290次閱讀
    <b class='flag-5'>英</b><b class='flag-5'>創(chuàng)</b><b class='flag-5'>信息技術(shù)</b><b class='flag-5'>WinCE</b><b class='flag-5'>平臺(tái)</b>下通過系統(tǒng)異常<b class='flag-5'>信息</b>定位程序bug位置

    創(chuàng)信息技術(shù)WinCE主板CAN接口數(shù)據(jù)接收性能測試介紹

    創(chuàng)公司嵌入式主板產(chǎn)品中,高端的335x主板系列及低端的ESM9287主板均可支持2路CAN總線標(biāo)準(zhǔn)接口。本文提供CE
    的頭像 發(fā)表于 02-04 11:39 ?1478次閱讀
    <b class='flag-5'>英</b><b class='flag-5'>創(chuàng)</b><b class='flag-5'>信息技術(shù)</b><b class='flag-5'>WinCE</b>主板<b class='flag-5'>CAN</b><b class='flag-5'>接口</b>數(shù)據(jù)接收性能測試介紹

    創(chuàng)信息技術(shù)CAN驅(qū)動(dòng)接口調(diào)用方法及說明

    時(shí)間,單位ms。 BusErrorReport :錯(cuò)誤幀上報(bào)標(biāo)記,0:不上報(bào),1:上報(bào)錯(cuò)誤幀 設(shè)置程序可以連接創(chuàng)工程師獲得。 CAN打開及關(guān)閉 打開關(guān)閉采用標(biāo)準(zhǔn)的流式設(shè)備驅(qū)動(dòng)接口Cr
    的頭像 發(fā)表于 02-05 10:26 ?1346次閱讀
    <b class='flag-5'>英</b><b class='flag-5'>創(chuàng)</b><b class='flag-5'>信息技術(shù)</b>新<b class='flag-5'>CAN</b>驅(qū)動(dòng)<b class='flag-5'>接口</b>調(diào)用方法及說明

    創(chuàng)信息技術(shù)WinCE主板與STM32多功能模塊通訊介紹

    ,STM32F103RCT6通過其USB Device接口創(chuàng)工控主板連接通訊,STM32WinCE系統(tǒng)中被當(dāng)做一個(gè)串口設(shè)備,
    的頭像 發(fā)表于 02-06 11:12 ?2043次閱讀

    創(chuàng)信息技術(shù)WinCE6系統(tǒng)CEDB故障分析介紹

    導(dǎo)致的。直到近期,創(chuàng)公司通過大量實(shí)驗(yàn),找到了觸發(fā)CEDB故障的原因。本文將介紹我們的實(shí)驗(yàn)結(jié)果,為防止CEDB故障,希望客戶注意: 使用WINCE6平臺(tái)的客戶,在產(chǎn)品發(fā)布時(shí)請(qǐng)使用rel
    的頭像 發(fā)表于 02-07 10:30 ?1041次閱讀
    <b class='flag-5'>英</b><b class='flag-5'>創(chuàng)</b><b class='flag-5'>信息技術(shù)</b><b class='flag-5'>WinCE</b>6系統(tǒng)CEDB故障分析介紹

    創(chuàng)信息技術(shù)WinCE平臺(tái)高速WiFi實(shí)現(xiàn)方法

    配套使用,實(shí)現(xiàn)高速WiFi通訊,模塊支持應(yīng)用程序WinSock編程。創(chuàng)工控主板是通過mini PCIe上的USB接口來操作ETA6210模塊的。實(shí)際應(yīng)用中,ETA6210是插在客戶
    的頭像 發(fā)表于 02-07 10:39 ?1641次閱讀

    創(chuàng)信息技術(shù)WinCE文件系統(tǒng)測試及故障分析簡介

    WINCE文件系統(tǒng)的偶發(fā)故障一直是WINCE系統(tǒng)最為棘手的問題,盡管出現(xiàn)故障的幾率不高,但對(duì)設(shè)備的穩(wěn)定運(yùn)行造成嚴(yán)重影響。為了保證基于WinCE的嵌入式系統(tǒng)能穩(wěn)定可靠運(yùn)行,
    的頭像 發(fā)表于 02-07 11:15 ?1422次閱讀
    <b class='flag-5'>英</b><b class='flag-5'>創(chuàng)</b><b class='flag-5'>信息技術(shù)</b><b class='flag-5'>WinCE</b>文件系統(tǒng)測試及故障分析簡介