找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 1783|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

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

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:898644 發(fā)表于 2021-3-31 11:09 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
大家好,我想收集導(dǎo)航的開機信號,can盒子的配置都設(shè)置好了,一直接收不到數(shù)據(jù)。盒子的上位軟件是EmbededDebug v2.0。有大師可以指導(dǎo)一下嗎?謝謝(軟件的使用說明和界面截圖在最后已上傳)
USB-CAN通訊模塊——用戶編程說明
2012.03
用戶如果只是利用 USB-CAN通訊模塊進行CAN總線通信測試,可以直接利用隨本產(chǎn)品提供的EmbededDebug工具軟件,接入CAN總線。如果用戶打算開發(fā)自己產(chǎn)品的軟件程序,可以使用我公司提供的相關(guān)API,簡化通訊開發(fā)過程。
下面介紹CAN通訊相關(guān)的兩個類。如果只做CAN方面的收發(fā)操作,可以只關(guān)心RT_CAN類,使用其中的SendCANMessage函數(shù)發(fā)送CAN消息,使用RecvCANMessage或者通過SetRxPackageCallBack設(shè)置接收回調(diào)函數(shù)的方式接收CAN消息即可;如果希望詳細了解我公司的通訊協(xié)議,可結(jié)合本文檔與源代碼進行學(xué)習(xí)。

1 串口通訊說明
1.1串口通訊數(shù)據(jù)包的封裝格式
通訊數(shù)據(jù)包的封裝格式:FrameHead+Data+CheckSum+FrameTail,控制符為0xA5, FrameHead為連續(xù)的兩個0xAA, FrameTail為連續(xù)的兩個0x55,如果Data中含0xA5、0xAA、0x55(即特殊字符),則在發(fā)送該字符之前添加一個控制符0xA5。CheckSum為8位校驗和,即Data的所有數(shù)據(jù)之和的低八位。

1.2 串口通訊操作類
1.2.1 類名稱
串口操作類名稱是:RT_COM(見RT_COM.cpp和RT_COM.h)

1.2.2 相關(guān)定義說明
(1)  typedefvoid (*RxPackageCallBackFunc)(void *pParam, const BYTE * byBuf, DWORD dwLen);
說明:用于定義接收數(shù)據(jù)操作回調(diào)函數(shù)
       參數(shù):pParam:用戶參數(shù),調(diào)用SetRxPackageCallBack時設(shè)置。
                 byBuf:接收到的數(shù)據(jù)。
                 dwLen:接收到數(shù)據(jù)的長度
       返回值:無

1.2.3函數(shù)說明
注意:以下文檔中出現(xiàn)的com為RT_COM類實例化的對象。
(1)  RT_COM(DWORD dwMaxPackageSize = 4096);
       說明:類的構(gòu)造函數(shù)
       參數(shù):MaxPackageSize:默認值為4096,用于初始化發(fā)送和接收緩沖。
       返回值:無
(2) static DWORD FindAll(DWORD *dwDevName);
說明:*當(dāng)傳入?yún)?shù)為NULL時,返回設(shè)備的數(shù)量,可利用該數(shù)量初始化dwDevName
                *當(dāng)傳入?yún)?shù)不為NULL時,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);
       說明:打開指定串口
       參數(shù):dwPortNo:串口號
                dwBaud:指定串口波特率
       返回值:如果成功打開,則返回TRUE;否則返回FALSE。
Example:
#include " RT_COM.h"
if(com.Open (6, 921600))
{
//[ i]打開虛擬串口成功的操作
}


(4)  void Close();
       說明:關(guān)閉當(dāng)前打開的串口
       參數(shù):無
       返回值:無
Example:
#include " RT_COM.h"
if(com.Close ())
{
              //[ i]關(guān)閉虛擬串口成功的操作
}


(5) voidSetRxPackageCallBack(RxPackageCallBackFunc func, void *[ i]pParam);
       說明:設(shè)置接收數(shù)據(jù)的回調(diào)函數(shù)
       參數(shù):[ i]pParam:用戶參數(shù)。
func:RxPackageCallBackFunc類型的函數(shù)指針,用于在接收到數(shù)據(jù)后進行相關(guān)處理。
       返回值:無
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);
       說明:向模塊端發(fā)送包含數(shù)據(jù)的包
       參數(shù):byBuf:要發(fā)送的數(shù)據(jù)
                dwLen:要發(fā)送數(shù)據(jù)的長度
       返回值:已發(fā)送的數(shù)據(jù)長度
Example:
       #include " RT_COM.h"
       BYTE buf[30];
if(com.WritePackage(buf, sizeof(buf)))
{
              //[ i]數(shù)據(jù)發(fā)送成功的操作
}


(7) BOOL IsOpened()
       說明:判斷當(dāng)前串口是否已經(jīng)打開
       參數(shù):無
       返回值:返回當(dāng)前串口是否已經(jīng)打開。

Example:
#include " RT_COM.h"
       if(com.IsOpened())
{
              //[ i]串口已經(jīng)打開時的操作
}


(8) DWORD GetBaudRate()
       說明:獲得當(dāng)前串口的波特率
       參數(shù):無
       返回值:當(dāng)前串口的波特率
Example:
#include " RT_COM.h"
DWORD baud;
baud = com.GetBaudRate();


(9) DWORD GetPortNo();
       說明:獲得當(dāng)前串口號
       參數(shù):無
       返回值:當(dāng)前串口號
Example:
#include " RT_COM.h"
DWORD PortNO;
PortNO = com.GetPortNo ();


1.3 串口通訊庫使用方式
(1)  創(chuàng)建一個RT_COM實例
(1)  調(diào)用Open打開虛擬串口
(2)  調(diào)用WritePackage函數(shù)往串口寫數(shù)據(jù)
(3)  用戶自定義RxPackageCallBackFunc類型數(shù)據(jù)接收回調(diào)函數(shù),調(diào)用SetRxPackageCallBack函數(shù)注冊該函數(shù)。

2 CAN通訊說明
2.1 類名稱
       CAN操作類名稱是RT_CAN,該類繼承自RT_COM類,重載了OnRecvPackage函數(shù)。(見RT_CAN.cpp和RT_CAN.h)

2.2 CAN的消息格式
       CAN消息的格式如下:
typedefstruct  {
       DWORD id;               //消息ID,統(tǒng)一使用擴展幀,29bit
       BYTE data[8];         //數(shù)據(jù)域
       BYTE len;            //數(shù)據(jù)域長度
       BYTE ch;              //消息通道(0xff為配置通道)
       BYTE format;        //消息格式(取值見相關(guān)定義中的CAN_FORMAT)
       BYTE type;            //消息類型(取值見相關(guān)定義中的CAN_FRAME)
}  CAN_msg;

2.3相關(guān)定義
(1)  CAN_FORMAT
       說明:CAN消息幀格式
       成員:STANDARD_FORMAT:標準幀
                EXTENDED_FORMAT:擴展幀
(2)  CAN_FRAME
       說明:CAN消息幀類型
       成員:DATA_FRAME:數(shù)據(jù)幀
                REMOTE_FRAME:遠程幀
(3)  CAN_ERROR
       成員:CAN _ERR_TRANS:傳輸錯誤
CAN_OK:沒有錯誤
CAN_ERR_ACK:沒有返回應(yīng)答
CAN_ERR_CHANNEL:CHANNEL錯誤

2.4 函數(shù)說明
注意:以下文檔中出現(xiàn)的can為RT_CAN類實例化的對象。
(1)  RT_CAN()
說明:初始化CAN操作類
參數(shù):無
       返回值:無

(2)  CAN_ERROR SetConfigValue(DWORD dwID, void*pValueBuf, DWORD *pdwLen, DWORD dwTimeOut);
說明:發(fā)送配置數(shù)據(jù)包
       參數(shù):dwID: 數(shù)據(jù)包ID
                pValueBuf: 數(shù)據(jù)
                pdwLen:數(shù)據(jù)長度
                dwTimeOut: 超時時間
       返回值:錯誤信息
Example:
#include " RT_CAN.h"
DWORD Len = sizeof(BYTE);
BYTE by = 1;
//[ i]發(fā)送自動重發(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);
說明:發(fā)送配置數(shù)據(jù)包
       參數(shù):dwID: 數(shù)據(jù)包ID
                pValueBuf: 數(shù)據(jù)(傳出)
                pdwLen: 數(shù)據(jù)長度
                dwTimeOut: 超時時間
       返回值:錯誤信息
Example:
#include " RT_CAN.h"
DWORD Len = sizeof(BYTE);
BYTE by;
//[ i]獲取自動重發(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);
說明:發(fā)送CAN消息
       參數(shù):pMsg: CAN消息
                dwTimeout: 發(fā)送超時時間(默認為無限超時)
       返回值:錯誤信息
Example:
#include " RT_CAN.h"
//[ i]發(fā)送CAN[ i]消息
CAN_msg msg;
int val = 1;
msg.id = 0x01223211;                        //[ i]配置消息ID
msg.len = 8;                                      //[ i]配置消息長度
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);
說明:發(fā)送CAN消息
       參數(shù):pMsg: CAN消息(傳出)
                dwTimeout: 發(fā)送超時時間(默認為無限超時)
       返回值:錯誤信息
Example:
#include " RT_CAN.h"
//[ i]發(fā)送CAN[ i]消息
CAN_msg msg;
msg.id = 0x01223211;                        //[ i]配置消息ID
msg.len = 8;                                      //[ i]配置消息長度
msg.format =EXTENDED_FORMAT;  //[ i]配置消息格式
msg.type = REMOTE_FORMAT;      //[ i]配置消息類型
CAN.RecvCANMessage(&msg);


2.5. CAN通訊庫使用方式
(1) 創(chuàng)建RT_CAN的實例
(2) 調(diào)用Open打開想要操作的對應(yīng)于模塊端的串口
(3) 調(diào)用相應(yīng)的函數(shù)設(shè)置和獲取CAN的信息。


屏幕截圖(43).png (66.27 KB, 下載次數(shù): 33)

這是軟件界面(沒連盒子))

這是軟件界面(沒連盒子))
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:584814 發(fā)表于 2021-3-31 23:19 | 只看該作者
貼這么多很高大上+牛13的樣子,你的音樂老師沒在地理課上告訴你GPS多用串口通訊的話也可以白渡牙
回復(fù)

使用道具 舉報

板凳
ID:898644 發(fā)表于 2021-4-1 19:32 | 只看該作者
man1234567 發(fā)表于 2021-3-31 23:19
貼這么多很高大上+牛13的樣子,你的音樂老師沒在地理課上告訴你GPS多用串口通訊的話也可以白渡牙

就是不懂才問�。�
回復(fù)

使用道具 舉報

地板
ID:898644 發(fā)表于 2021-4-4 12:01 | 只看該作者
已成功獲取了psa車的導(dǎo)航can信息
回復(fù)

使用道具 舉報

5#
ID:900695 發(fā)表于 2021-4-4 21:53 | 只看該作者
那么費勁嗎,某寶上的創(chuàng)芯CAN適配器才198,很方便你破解抓取原車總線信息啦
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

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