找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 1729|回復(fù): 4
收起左側(cè)

關(guān)于CAN總線收據(jù)的收發(fā),想收集導(dǎo)航的開(kāi)機(jī)信號(hào)

[復(fù)制鏈接]
ID:898644 發(fā)表于 2021-3-31 11:09 | 顯示全部樓層 |閱讀模式
大家好,我想收集導(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)連盒子))

這是軟件界面(沒(méi)連盒子))
回復(fù)

使用道具 舉報(bào)

ID:584814 發(fā)表于 2021-3-31 23:19 | 顯示全部樓層
貼這么多很高大上+牛13的樣子,你的音樂(lè)老師沒(méi)在地理課上告訴你GPS多用串口通訊的話也可以白渡牙
回復(fù)

使用道具 舉報(bào)

ID:898644 發(fā)表于 2021-4-1 19:32 | 顯示全部樓層
man1234567 發(fā)表于 2021-3-31 23:19
貼這么多很高大上+牛13的樣子,你的音樂(lè)老師沒(méi)在地理課上告訴你GPS多用串口通訊的話也可以白渡牙

就是不懂才問(wèn)啊?
回復(fù)

使用道具 舉報(bào)

ID:898644 發(fā)表于 2021-4-4 12:01 | 顯示全部樓層
已成功獲取了psa車的導(dǎo)航can信息
回復(fù)

使用道具 舉報(bào)

ID:900695 發(fā)表于 2021-4-4 21:53 | 顯示全部樓層
那么費(fèi)勁嗎,某寶上的創(chuàng)芯CAN適配器才198,很方便你破解抓取原車總線信息啦
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表