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, FrameH
ead为连续的两个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) typedef void (*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;
//分配空间
dwDevNum = RT_ COM::FindAll(NULL);
dwDev = new DWORD[dwDevNum];
//列出虚拟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))
{
//打开虚拟串口成功的操作
}
(4) void Close();
说明:关闭当前打开的串口
参数:无
返回值:无
Example:
#include " RT_COM.h"
if(com.Close ())
{
//关闭虚拟串口成功的操作
}
(5) void SetRxPackageCallBack(RxPackageCallBackFunc func, void *pParam);
说明:设置接收数据的回调函数
参数:pParam:用户参数。
func:RxPackageCallBackFunc类型的函数指针,用于在接收到数据后进行相关处理。
返回值:无
Example:
#include " RT_COM.h"
定义回调函数:
void RecvCallback(void * pParam, const BYTE * buf, DWORD len)
{
//执行回调操作
}
设置回调函数:
com.SetRxPackageCallBack(RecvCallback, NULL);
(6) DWORD WritePackage(BYTE * byBuf, DWORD dwLen);
说明:向模块端发送包含数据的包
参数:byBuf:要发送的数据
dwLen:要发送数据的长度
返回值:已发送的数据长度
Example:
#include " RT_COM.h"
BYTE buf[30];
if(com.WritePackage(buf, sizeof(buf)))
{
//数据发送成功的操作
}
(7) BOOL IsOpened()
说明:判断当前串口是否已经打开
参数:无
返回值:返回当前串口是否已经打开。
Example:
#include " RT_COM.h"
if(com.IsOpened())
{
//串口已经打开时的操作
}
(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 ();
recv函数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消息的格式如下:
typedef struct {
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;
//发送自动重发的配置
if(CAN.SetConfigValue(CAN_ART_ID, & by, &Len,1000) != CAN_OK)
{
ShowMessageBox("配置失败!", 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;
//获取自动重发的配置
if(CAN.GetConfigValue(CAN_ART_ID, & by, &Len,1000) != CAN_OK)
{
ShowMessageBox("配置失败!", MB_ICONSTOP);
}
(3) CAN_ERROR SendCANMessage(CAN_msg *pMsg, DWORD dwTimeout = INFINITE);
说明:发送CAN消息
参数:pMsg: CAN消息
dwTimeout: 发送超时时间(默认为无限超时)
返回值:错误信息
Example:
#include " RT_CAN.h"
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论