找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1719|回复: 4
打印 上一主题 下一主题
收起左侧

关于CAN总线收据的收发,想收集导航的开机信号

[复制链接]
跳转到指定楼层
#
大家好,我想收集导航的开机信号,can盒子的配置都设置好了,一直接收不到数据。盒子的上位软件是EmbededDebug v2.0。有大师可以指导一下吗?谢谢(软件的使用说明和界面截图在最后已上传)
USB-CAN通讯模块——用户编程说明
2012.03
用户如果只是利用 USB-CAN通讯模块进行CAN总线通信测试,可以直接利用随本产品提供的EmbededDebug工具软件,接入CAN总线。如果用户打算开发自己产品的软件程序,可以使用我公司提供的相关API,简化通讯开发过程。
下面介绍CAN通讯相关的两个类。如果只做CAN方面的收发操作,可以只关心RT_CAN类,使用其中的SendCANMessage函数发送CAN消息,使用RecvCANMessage或者通过SetRxPackageCallBack设置接收回调函数的方式接收CAN消息即可;如果希望详细了解我公司的通讯协议,可结合本文档与源代码进行学习。

1 串口通讯说明
1.1串口通讯数据包的封装格式
通讯数据包的封装格式:FrameHead+Data+CheckSum+FrameTail,控制符为0xA5, FrameHead为连续的两个0xAA, FrameTail为连续的两个0x55,如果Data中含0xA5、0xAA、0x55(即特殊字符),则在发送该字符之前添加一个控制符0xA5。CheckSum为8位校验和,即Data的所有数据之和的低八位。

1.2 串口通讯操作类
1.2.1 类名称
串口操作类名称是:RT_COM(见RT_COM.cpp和RT_COM.h)

1.2.2 相关定义说明
(1)  typedefvoid (*RxPackageCallBackFunc)(void *pParam, const BYTE * byBuf, DWORD dwLen);
说明:用于定义接收数据操作回调函数
       参数:pParam:用户参数,调用SetRxPackageCallBack时设置。
                 byBuf:接收到的数据。
                 dwLen:接收到数据的长度
       返回值:无

1.2.3函数说明
注意:以下文档中出现的com为RT_COM类实例化的对象。
(1)  RT_COM(DWORD dwMaxPackageSize = 4096);
       说明:类的构造函数
       参数:MaxPackageSize:默认值为4096,用于初始化发送和接收缓冲。
       返回值:无
(2) static DWORD FindAll(DWORD *dwDevName);
说明:*当传入参数为NULL时,返回设备的数量,可利用该数量初始化dwDevName
                *当传入参数不为NULL时,dwDevName传出所有设备名称
       参数:dwDevName(传出):存放设备名称,可以为NULL。
       返回值:返回检查到的设备数量。
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);
       说明:打开指定串口
       参数:dwPortNo:串口号
                dwBaud:指定串口波特率
       返回值:如果成功打开,则返回TRUE;否则返回FALSE。
Example:
#include " RT_COM.h"
if(com.Open (6, 921600))
{
//[ i]打开虚拟串口成功的操作
}


(4)  void Close();
       说明:关闭当前打开的串口
       参数:无
       返回值:无
Example:
#include " RT_COM.h"
if(com.Close ())
{
              //[ i]关闭虚拟串口成功的操作
}


(5) voidSetRxPackageCallBack(RxPackageCallBackFunc func, void *[ i]pParam);
       说明:设置接收数据的回调函数
       参数:[ i]pParam:用户参数。
func:RxPackageCallBackFunc类型的函数指针,用于在接收到数据后进行相关处理。
       返回值:无
Example:
       #include " RT_COM.h"
定义回调函数:
void RecvCallback(void * pParam, const BYTE * buf, DWORD len)
{
              //[ i]执行回调操作
}
设置回调函数:
com.SetRxPackageCallBack(RecvCallback, NULL);


(6)  DWORD WritePackage(BYTE * byBuf, DWORDdwLen);
       说明:向模块端发送包含数据的包
       参数:byBuf:要发送的数据
                dwLen:要发送数据的长度
       返回值:已发送的数据长度
Example:
       #include " RT_COM.h"
       BYTE buf[30];
if(com.WritePackage(buf, sizeof(buf)))
{
              //[ i]数据发送成功的操作
}


(7) BOOL IsOpened()
       说明:判断当前串口是否已经打开
       参数:无
       返回值:返回当前串口是否已经打开。

Example:
#include " RT_COM.h"
       if(com.IsOpened())
{
              //[ i]串口已经打开时的操作
}


(8) DWORD GetBaudRate()
       说明:获得当前串口的波特率
       参数:无
       返回值:当前串口的波特率
Example:
#include " RT_COM.h"
DWORD baud;
baud = com.GetBaudRate();


(9) DWORD GetPortNo();
       说明:获得当前串口号
       参数:无
       返回值:当前串口号
Example:
#include " RT_COM.h"
DWORD PortNO;
PortNO = com.GetPortNo ();


1.3 串口通讯库使用方式
(1)  创建一个RT_COM实例
(1)  调用Open打开虚拟串口
(2)  调用WritePackage函数往串口写数据
(3)  用户自定义RxPackageCallBackFunc类型数据接收回调函数,调用SetRxPackageCallBack函数注册该函数。

2 CAN通讯说明
2.1 类名称
       CAN操作类名称是RT_CAN,该类继承自RT_COM类,重载了OnRecvPackage函数。(见RT_CAN.cpp和RT_CAN.h)

2.2 CAN的消息格式
       CAN消息的格式如下:
typedefstruct  {
       DWORD id;               //消息ID,统一使用扩展帧,29bit
       BYTE data[8];         //数据域
       BYTE len;            //数据域长度
       BYTE ch;              //消息通道(0xff为配置通道)
       BYTE format;        //消息格式(取值见相关定义中的CAN_FORMAT)
       BYTE type;            //消息类型(取值见相关定义中的CAN_FRAME)
}  CAN_msg;

2.3相关定义
(1)  CAN_FORMAT
       说明:CAN消息帧格式
       成员:STANDARD_FORMAT:标准帧
                EXTENDED_FORMAT:扩展帧
(2)  CAN_FRAME
       说明:CAN消息帧类型
       成员:DATA_FRAME:数据帧
                REMOTE_FRAME:远程帧
(3)  CAN_ERROR
       成员:CAN _ERR_TRANS:传输错误
CAN_OK:没有错误
CAN_ERR_ACK:没有返回应答
CAN_ERR_CHANNEL:CHANNEL错误

2.4 函数说明
注意:以下文档中出现的can为RT_CAN类实例化的对象。
(1)  RT_CAN()
说明:初始化CAN操作类
参数:无
       返回值:无

(2)  CAN_ERROR SetConfigValue(DWORD dwID, void*pValueBuf, DWORD *pdwLen, DWORD dwTimeOut);
说明:发送配置数据包
       参数:dwID: 数据包ID
                pValueBuf: 数据
                pdwLen:数据长度
                dwTimeOut: 超时时间
       返回值:错误信息
Example:
#include " RT_CAN.h"
DWORD Len = sizeof(BYTE);
BYTE by = 1;
//[ i]发送自动重发的配置
    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);
说明:发送配置数据包
       参数:dwID: 数据包ID
                pValueBuf: 数据(传出)
                pdwLen: 数据长度
                dwTimeOut: 超时时间
       返回值:错误信息
Example:
#include " RT_CAN.h"
DWORD Len = sizeof(BYTE);
BYTE by;
//[ i]获取自动重发的配置
    if(CAN.GetConfigValue(CAN_ART_ID, & by,&Len,1000) != CAN_OK)
    {
        ShowMessageBox("[ i]配置失败!", MB_ICONSTOP);
    }


(3)  CAN_ERROR SendCANMessage(CAN_msg *pMsg, DWORDdwTimeout = INFINITE);
说明:发送CAN消息
       参数:pMsg: CAN消息
                dwTimeout: 发送超时时间(默认为无限超时)
       返回值:错误信息
Example:
#include " RT_CAN.h"
//[ i]发送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);
说明:发送CAN消息
       参数:pMsg: CAN消息(传出)
                dwTimeout: 发送超时时间(默认为无限超时)
       返回值:错误信息
Example:
#include " RT_CAN.h"
//[ i]发送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) 创建RT_CAN的实例
(2) 调用Open打开想要操作的对应于模块端的串口
(3) 调用相应的函数设置和获取CAN的信息。


屏幕截图(43).png (66.27 KB, 下载次数: 33)

这是软件界面(没连盒子))

这是软件界面(没连盒子))
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

地板
ID:900695 发表于 2021-4-4 21:53 | 只看该作者
那么费劲吗,某宝上的创芯CAN适配器才198,很方便你破解抓取原车总线信息啦
回复

使用道具 举报

板凳
ID:898644 发表于 2021-4-4 12:01 | 只看该作者
已成功获取了psa车的导航can信息
回复

使用道具 举报

沙发
ID:898644 发表于 2021-4-1 19:32 | 只看该作者
man1234567 发表于 2021-3-31 23:19
贴这么多很高大上+牛13的样子,你的音乐老师没在地理课上告诉你GPS多用串口通讯的话也可以白渡牙

就是不懂才问啊?
回复

使用道具 举报

楼主
ID:584814 发表于 2021-3-31 23:19 | 只看该作者
贴这么多很高大上+牛13的样子,你的音乐老师没在地理课上告诉你GPS多用串口通讯的话也可以白渡牙
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表