|
大家好,我想收集導(dǎo)航的開(kāi)機(jī)信號(hào),can盒子的配置都設(shè)置好了,一直接收不到數(shù)據(jù)。盒子的上位軟件是EmbededDebug v2.0。有大師可以指導(dǎo)一下嗎?謝謝(軟件的使用說(shuō)明和界面截圖在最后已上傳)
USB-CAN通訊模塊——用戶編程說(shuō)明
2012.03
用戶如果只是利用 USB-CAN通訊模塊進(jìn)行CAN總線通信測(cè)試,可以直接利用隨本產(chǎn)品提供的EmbededDebug工具軟件,接入CAN總線。如果用戶打算開(kāi)發(fā)自己產(chǎn)品的軟件程序,可以使用我公司提供的相關(guān)API,簡(jiǎn)化通訊開(kāi)發(fā)過(guò)程。
下面介紹CAN通訊相關(guān)的兩個(gè)類。如果只做CAN方面的收發(fā)操作,可以只關(guān)心RT_CAN類,使用其中的SendCANMessage函數(shù)發(fā)送CAN消息,使用RecvCANMessage或者通過(guò)SetRxPackageCallBack設(shè)置接收回調(diào)函數(shù)的方式接收CAN消息即可;如果希望詳細(xì)了解我公司的通訊協(xié)議,可結(jié)合本文檔與源代碼進(jìn)行學(xué)習(xí)。
1 串口通訊說(shuō)明
1.1串口通訊數(shù)據(jù)包的封裝格式
通訊數(shù)據(jù)包的封裝格式:FrameHead+Data+CheckSum+FrameTail,控制符為0xA5, FrameHead為連續(xù)的兩個(gè)0xAA, FrameTail為連續(xù)的兩個(gè)0x55,如果Data中含0xA5、0xAA、0x55(即特殊字符),則在發(fā)送該字符之前添加一個(gè)控制符0xA5。CheckSum為8位校驗(yàn)和,即Data的所有數(shù)據(jù)之和的低八位。
1.2 串口通訊操作類
1.2.1 類名稱
串口操作類名稱是:RT_COM(見(jiàn)RT_COM.cpp和RT_COM.h)
1.2.2 相關(guān)定義說(shuō)明
(1) typedefvoid (*RxPackageCallBackFunc)(void *pParam, const BYTE * byBuf, DWORD dwLen);
說(shuō)明:用于定義接收數(shù)據(jù)操作回調(diào)函數(shù)
參數(shù):pParam:用戶參數(shù),調(diào)用SetRxPackageCallBack時(shí)設(shè)置。
byBuf:接收到的數(shù)據(jù)。
dwLen:接收到數(shù)據(jù)的長(zhǎng)度
返回值:無(wú)
1.2.3函數(shù)說(shuō)明
注意:以下文檔中出現(xiàn)的com為RT_COM類實(shí)例化的對(duì)象。
(1) RT_COM(DWORD dwMaxPackageSize = 4096);
說(shuō)明:類的構(gòu)造函數(shù)
參數(shù):MaxPackageSize:默認(rèn)值為4096,用于初始化發(fā)送和接收緩沖。
返回值:無(wú)
(2) static DWORD FindAll(DWORD *dwDevName);
說(shuō)明:*當(dāng)傳入?yún)?shù)為NULL時(shí),返回設(shè)備的數(shù)量,可利用該數(shù)量初始化dwDevName
*當(dāng)傳入?yún)?shù)不為NULL時(shí),dwDevName傳出所有設(shè)備名稱
參數(shù):dwDevName(傳出):存放設(shè)備名稱,可以為NULL。
返回值:返回檢查到的設(shè)備數(shù)量。
Example:
#include " RT_COM.h"
DWORD *dwDev, dwDevNum;
//[ i]分配空間
dwDevNum = RT_ COM::FindAll(NULL);
dwDev = new DWORD[dwDevNum];
//[ i]列出虛擬COM
RT_ COM::FindAll(dwDev);
for (DWORD i=0; i<dwDevNum; i++)
{
printf("COM%d\n", dwDev[ i]);
}
(3) BOOL Open(DWORD dwPortNo, DWORD dwBaud);
說(shuō)明:打開(kāi)指定串口
參數(shù):dwPortNo:串口號(hào)
dwBaud:指定串口波特率
返回值:如果成功打開(kāi),則返回TRUE;否則返回FALSE。
Example:
#include " RT_COM.h"
if(com.Open (6, 921600))
{
//[ i]打開(kāi)虛擬串口成功的操作
}
(4) void Close();
說(shuō)明:關(guān)閉當(dāng)前打開(kāi)的串口
參數(shù):無(wú)
返回值:無(wú)
Example:
#include " RT_COM.h"
if(com.Close ())
{
//[ i]關(guān)閉虛擬串口成功的操作
}
(5) voidSetRxPackageCallBack(RxPackageCallBackFunc func, void *[ i]pParam);
說(shuō)明:設(shè)置接收數(shù)據(jù)的回調(diào)函數(shù)
參數(shù):[ i]pParam:用戶參數(shù)。
func:RxPackageCallBackFunc類型的函數(shù)指針,用于在接收到數(shù)據(jù)后進(jìn)行相關(guān)處理。
返回值:無(wú)
Example:
#include " RT_COM.h"
定義回調(diào)函數(shù):
void RecvCallback(void * pParam, const BYTE * buf, DWORD len)
{
//[ i]執(zhí)行回調(diào)操作
}
設(shè)置回調(diào)函數(shù):
com.SetRxPackageCallBack(RecvCallback, NULL);
(6) DWORD WritePackage(BYTE * byBuf, DWORDdwLen);
說(shuō)明:向模塊端發(fā)送包含數(shù)據(jù)的包
參數(shù):byBuf:要發(fā)送的數(shù)據(jù)
dwLen:要發(fā)送數(shù)據(jù)的長(zhǎng)度
返回值:已發(fā)送的數(shù)據(jù)長(zhǎng)度
Example:
#include " RT_COM.h"
BYTE buf[30];
if(com.WritePackage(buf, sizeof(buf)))
{
//[ i]數(shù)據(jù)發(fā)送成功的操作
}
(7) BOOL IsOpened()
說(shuō)明:判斷當(dāng)前串口是否已經(jīng)打開(kāi)
參數(shù):無(wú)
返回值:返回當(dāng)前串口是否已經(jīng)打開(kāi)。
Example:
#include " RT_COM.h"
if(com.IsOpened())
{
//[ i]串口已經(jīng)打開(kāi)時(shí)的操作
}
(8) DWORD GetBaudRate()
說(shuō)明:獲得當(dāng)前串口的波特率
參數(shù):無(wú)
返回值:當(dāng)前串口的波特率
Example:
#include " RT_COM.h"
DWORD baud;
baud = com.GetBaudRate();
(9) DWORD GetPortNo();
說(shuō)明:獲得當(dāng)前串口號(hào)
參數(shù):無(wú)
返回值:當(dāng)前串口號(hào)
Example:
#include " RT_COM.h"
DWORD PortNO;
PortNO = com.GetPortNo ();
1.3 串口通訊庫(kù)使用方式
(1) 創(chuàng)建一個(gè)RT_COM實(shí)例
(1) 調(diào)用Open打開(kāi)虛擬串口
(2) 調(diào)用WritePackage函數(shù)往串口寫數(shù)據(jù)
(3) 用戶自定義RxPackageCallBackFunc類型數(shù)據(jù)接收回調(diào)函數(shù),調(diào)用SetRxPackageCallBack函數(shù)注冊(cè)該函數(shù)。
2 CAN通訊說(shuō)明
2.1 類名稱
CAN操作類名稱是RT_CAN,該類繼承自RT_COM類,重載了OnRecvPackage函數(shù)。(見(jiàn)RT_CAN.cpp和RT_CAN.h)
2.2 CAN的消息格式
CAN消息的格式如下:
typedefstruct {
DWORD id; //消息ID,統(tǒng)一使用擴(kuò)展幀,29bit
BYTE data[8]; //數(shù)據(jù)域
BYTE len; //數(shù)據(jù)域長(zhǎng)度
BYTE ch; //消息通道(0xff為配置通道)
BYTE format; //消息格式(取值見(jiàn)相關(guān)定義中的CAN_FORMAT)
BYTE type; //消息類型(取值見(jiàn)相關(guān)定義中的CAN_FRAME)
} CAN_msg;
2.3相關(guān)定義
(1) CAN_FORMAT
說(shuō)明:CAN消息幀格式
成員:STANDARD_FORMAT:標(biāo)準(zhǔn)幀
EXTENDED_FORMAT:擴(kuò)展幀
(2) CAN_FRAME
說(shuō)明:CAN消息幀類型
成員:DATA_FRAME:數(shù)據(jù)幀
REMOTE_FRAME:遠(yuǎn)程幀
(3) CAN_ERROR
成員:CAN _ERR_TRANS:傳輸錯(cuò)誤
CAN_OK:沒(méi)有錯(cuò)誤
CAN_ERR_ACK:沒(méi)有返回應(yīng)答
CAN_ERR_CHANNEL:CHANNEL錯(cuò)誤
2.4 函數(shù)說(shuō)明
注意:以下文檔中出現(xiàn)的can為RT_CAN類實(shí)例化的對(duì)象。
(1) RT_CAN()
說(shuō)明:初始化CAN操作類
參數(shù):無(wú)
返回值:無(wú)
(2) CAN_ERROR SetConfigValue(DWORD dwID, void*pValueBuf, DWORD *pdwLen, DWORD dwTimeOut);
說(shuō)明:發(fā)送配置數(shù)據(jù)包
參數(shù):dwID: 數(shù)據(jù)包ID
pValueBuf: 數(shù)據(jù)
pdwLen:數(shù)據(jù)長(zhǎng)度
dwTimeOut: 超時(shí)時(shí)間
返回值:錯(cuò)誤信息
Example:
#include " RT_CAN.h"
DWORD Len = sizeof(BYTE);
BYTE by = 1;
//[ i]發(fā)送自動(dòng)重發(fā)的配置
if(CAN.SetConfigValue(CAN_ART_ID, & by,&Len,1000) != CAN_OK)
{
ShowMessageBox("[ i]配置失�。�", MB_ICONSTOP);
}
(2) CAN_ERROR GetConfigValue(DWORD dwID, void*pValueBuf, DWORD *pdwLen, DWORD dwTimeOut);
說(shuō)明:發(fā)送配置數(shù)據(jù)包
參數(shù):dwID: 數(shù)據(jù)包ID
pValueBuf: 數(shù)據(jù)(傳出)
pdwLen: 數(shù)據(jù)長(zhǎng)度
dwTimeOut: 超時(shí)時(shí)間
返回值:錯(cuò)誤信息
Example:
#include " RT_CAN.h"
DWORD Len = sizeof(BYTE);
BYTE by;
//[ i]獲取自動(dòng)重發(fā)的配置
if(CAN.GetConfigValue(CAN_ART_ID, & by,&Len,1000) != CAN_OK)
{
ShowMessageBox("[ i]配置失��!", MB_ICONSTOP);
}
(3) CAN_ERROR SendCANMessage(CAN_msg *pMsg, DWORDdwTimeout = INFINITE);
說(shuō)明:發(fā)送CAN消息
參數(shù):pMsg: CAN消息
dwTimeout: 發(fā)送超時(shí)時(shí)間(默認(rèn)為無(wú)限超時(shí))
返回值:錯(cuò)誤信息
Example:
#include " RT_CAN.h"
//[ i]發(fā)送CAN[ i]消息
CAN_msg msg;
int val = 1;
msg.id = 0x01223211; //[ i]配置消息ID
msg.len = 8; //[ i]配置消息長(zhǎng)度
msg.format =EXTENDED_FORMAT; //[ i]配置消息格式
msg.type = DATA_TYPE; //[ i]配置消息類型
memcpy(&msg.data[0], &val, sizeof(int));
CAN.SendCANMessage(&msg);
(4) CAN_ERROR RecvCANMessage(CAN_msg*pMsg, DWORD dwTimeout = INFINITE);
說(shuō)明:發(fā)送CAN消息
參數(shù):pMsg: CAN消息(傳出)
dwTimeout: 發(fā)送超時(shí)時(shí)間(默認(rèn)為無(wú)限超時(shí))
返回值:錯(cuò)誤信息
Example:
#include " RT_CAN.h"
//[ i]發(fā)送CAN[ i]消息
CAN_msg msg;
msg.id = 0x01223211; //[ i]配置消息ID
msg.len = 8; //[ i]配置消息長(zhǎng)度
msg.format =EXTENDED_FORMAT; //[ i]配置消息格式
msg.type = REMOTE_FORMAT; //[ i]配置消息類型
CAN.RecvCANMessage(&msg);
2.5. CAN通訊庫(kù)使用方式
(1) 創(chuàng)建RT_CAN的實(shí)例
(2) 調(diào)用Open打開(kāi)想要操作的對(duì)應(yīng)于模塊端的串口
(3) 調(diào)用相應(yīng)的函數(shù)設(shè)置和獲取CAN的信息。
|
-
這是軟件界面(沒(méi)連盒子))
|