英創公司的ARM9工控主板產品均預裝了Windows CE5.0操作系統,支持包括EVC、C#、VB、LabView等多種開發工具。作為工業控制領域的嵌入模塊,客戶的應用程序往往對系統的底層調用較多,相對于其它語言,C++具有強大的硬件控制能力和很高執行效率,因此我們提供的示例程序和軟件方面的技術支持均集中在C++方面。而C#、.net VB等在圖型界面開發、數據庫方面的應用和易用性方面更具優勢,我們很多客戶也選用他們作為開發工具。為了結合各語言的優勢,為了對客戶提供更好的支持,我們將與主板密切相關的一些底層功能模塊封裝成COM組件,用戶可以使用自己喜歡的語言來調用COM組件,不必關心低層調用的細節,而COM組件本身則采用C++來編寫。本文將介紹基于英創工控主板串口應用的COM組件和組件調用方法。
1、創建串口應用COM組件
串口通訊在工業控制場合應用十分廣泛,當串口作為RS485通信應用時,很多場合下,需要通過硬件RTS信號來控制數據收發的方向,以提高抗干擾能力。在C#這一類的高級語言中,盡管也包括了串口控件,但缺乏對RTS硬件的操作,因此在RS485應用中受到一定的限制。為了彌補這一缺陷,在我們所設計的串口應用COM組件中,通過對串口DCB結構參數的設置,并結合英創ARM9主板低層的串口驅動程序,實現對RTS信號的完整控制。本串口組件采用C++編寫,在組件內部對RTS進行設置,而上層的開發工具,如C#等,可通過向組件接口函數傳遞參數來控制RTS信號,從而最終實現RS485的半雙工通訊。
本串口COM組件提供四個接口方法函數:打開串口,關閉串口,向串口寫數據,讀串口數據。客戶方調用COM組件打開串口后,COM組件服務器便在組件內部創建一數據接收線程,接收線程里通過WaitCommEvent來等待串口事件發生,當串口收到數據后,將數據放入指定的接收數據緩存中,客戶方可調用讀串口數據方法函數將緩存中的數據讀出。在實際應用中,客戶可在接收線程中加入自己特定的協議轉換代碼,使得通過組件讀取的數據為一個完整應用報文。
為了跨語言調用組件,接口方法函數參數數據均采用VARIANT數據類型,這樣ASP、vbscript等可方便的進行組件調用,從而輕松實現通過網頁對串口進行操作。
COM組件的創建過程請參考本網站相關文章或參考相應書籍。這里不再贅述。
2、串口應用組件接口方法函數
為了跨語言調用組件,組件接口方法函數參數數據均采用VARIANT數據類型。
(1)OpenPort( VARIANT portNo, VARIANT baud, VARIANT parity, VARIANT dataBits, VARIANT stopBits, VARIANT rtsCtrl, VARIANT* pbool)
功能描述:打開指定串口。
輸入參數:
VARIANT portNo 要打開的串口號
VARIANT baud 設置波特率
VARIANT parity 設置奇偶較驗
VARIANT dataBits 設置數據位
VARIANT stopBits 設置停止位
VARIANT rtsCtrl RTS設置
輸出參數:
VARIANT* pbool 串口打開成功失敗標志
(2)WritePort(VARIANT *var_inp, VARIANT *retLen)
功能描述:向串口寫數據
輸入參數:
VARIANT *var_inp 發送數據緩存
輸出參數:
VARIANT *retLen 發送數據個數
(3)ReadPort(VARIANT *rxData)
功能描述:讀取串口數據
輸出參數:
VARIANT *rxData 接收數據緩存
(4)ClosePort( )
功能描述:關閉串口
3、串口組件調用
下面是在EVC中調用串口組件接口函數的一些程序片段,主要說明在調用接口方法時,VARIANT參數的用法。
// 從Program ID得到Class ID
hr = CLSIDFromProgID( OLESTR( ‘ComSerial.CoSerial’ ), &clsid );
if( FAILED( hr ) )
{
return -1;
}
// 從Class ID得到ICoSerial接口指針
hr = CoCreateInstance( clsid, NULL, CLSCTX_INPROC_SERVER, __uuidof( ICoSerial ),
( void** )&pICoSerial );
if( FAILED( hr ))
{
return -1;
}
//打開串口
CComVariant portNo( 3 ); // 打開串口3
CComVariant baud( 9600 ); // 波特率:9600
CComVariant parity( ‘n’ ); // 無校驗位
CComVariant dataBits( 8 ); // 8位數據
CComVariant stopBits( 1 ); // 1位停止位
CComVariant rtsCtrl(RTS_CONTROL_TOGGLE); // RTS設置
CComVariant pbool( FALSE ); // 串口打開成功標志
pbool = pICoSerial-》OpenPort( portNo, baud, parity, dataBits, stopBits, rtsCtrl );
// 向串口發送數據
char strBuf[100];
strcpy( strBuf, ‘1234567890!’ );
long i=0, m=0;
m = strlen( strBuf );
SAFEARRAY FAR* pSafeArray;
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = m;
pSafeArray = SafeArrayCreate( VT_VARIANT, 1, rgsabound );
VARIANT var;
for( i; i 《 m; i++)
{
var.vt = VT_UI1;
var.bVal = strBuf[i];
SafeArrayPutElement( pSafeArray, &i, &var );
}
VARIANT tarray,retLen;
tarray.parray = pSafeArray;
retLen = pICoSerial-》WritePort( &tarray );
// 接收數據
VARIANT vinput, var;
BYTE rxBuf[1500];
vinput = pICoSerial-》ReadPort( );
SafeArrayGetUBound( vinput.parray, 1, &lUbound );
SafeArrayGetLBound( vinput.parray, 1, &lLbound );
// m:串口接收到的數據個數
m = lUbound - lLbound+1;
// m=0表示串口沒有收到數據
if( 0 == m )
return;
for( i=0; i 《 m; i++)
{
Safe=ArrayGetElement( vinput.parray, &i, &var );
rxBuf[i] = (BYTE)var.bVal;
}
在實際的應用中,通訊各方必須遵循統一的通訊規約。在發送數據前通常需要將數據按相應的協議打包,添加較驗信息等,收到數據后,要進行幀完整性判斷、數據解包、數據較驗、協議轉換等工作。現在可以將這些與協議密切相關的處理放在COM組件內部,客戶方在使用串口時僅需要對客戶感興趣的數據進行處理,而協議轉換等工作交由COM組件完成。這樣程序具有更好結構,維護也更加方便。
-
WINDOWS
+關注
關注
4文章
3586瀏覽量
89929 -
嵌入式主板
+關注
關注
7文章
6092瀏覽量
35839
發布評論請先 登錄
相關推薦
英創的ARM9工控主板應用程序自動加載實現
英創信息技術VS2005調試ARM9核心板簡介

英創信息技術ARM9工控主板WinCE應用程序遠程控制應用
英創信息技術ARM9工控主板擴展矩陣鍵盤的方法

評論