提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
最近在学习QT界面开发,想做一个基于周立功CAN盒的上位机软件。对QT实现USBCAN-E-U板卡CAN数据收发进行探索。
一、开发环境
系统:win7
QT:5.1.0
QT Creator:2.7.2
编译器:_MinGW_32bit
CAN硬件:ZLG USBCAN-E-U
二、开发步骤
1.准备对应CAN通信卡的驱动包、二次开发库文件
驱动及库下载链接
根据自己的ZLG硬件板卡选择对应的驱动和二次开发库文件。
2.安装CAN盒驱动(已安装可忽略)
安装完成后,在电脑设备管理里面可以查看到CAN盒设备信息。
3.创建QT工程,完成CAN库配置
此处请参考转载的链接转载
4.我的QT配置
在第3步中,确定QT Creator的编译器版本,如果是32位则选择ControlCANx86,
,否则选择64位库。在实现第5步之前,先阅读二次动态库中的pdf说明文档。
5.QT代码实现基本数据读取
创建widget工程,添加CAN的头文件,和加载动态库后(看第3步链接)。如何实现CAN板卡的控制??
注意阅读《使用手册》的CAN接口调用流程:
细节需参照文档,附上基本代码,仅打通基本数据接收,所以很多地方都是用的固定参数,更多的优化在熟悉后自行优化。
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
DWORD RET = VCI_OpenDevice(VCI_USBCAN_E_U,0,0);
qDebug() << "open dev state:" <<RET;
int baudrate = 0x060007;
RET = VCI_SetReference(VCI_USBCAN_E_U,0,0,0,&baudrate);
qDebug() << "VCI_SetReference:"<<RET;
PVCI_INIT_CONFIG pInitConfig;
pInitConfig->Mode = 0;
RET = VCI_InitCAN(VCI_USBCAN_E_U, 0, 0, pInitConfig);
if(RET == STATUS_ERR)
{
qDebug() << "Init can failure!";
}else
{
qDebug() << "Init can OK!";
}
RET = VCI_StartCAN(VCI_USBCAN_E_U,0,0);
if(RET != STATUS_OK)
{
qDebug() << "Start can failure!";
}else
{
qDebug() << "Start can OK!";
}
ui->pushButton->setText("关闭");
dataRecvTimer = new QTimer(this);
dataRecvTimer->start();
dataRecvTimer->setInterval(50);
connect(dataRecvTimer,SIGNAL(timeout()),this,SLOT(on_dataRcve_event()));
}
接收数据槽函数,50ms会进来读取一次数据:
void Widget::on_dataRcve_event()
{
DWORD RET ;
ULONG num = 0;
pErrInfo = new VCI_ERR_INFO;
num = VCI_GetReceiveNum(VCI_USBCAN_E_U,0,0);
if(num != 0)
{
qDebug()<< "VCI_GetReceiveNum:"<<num;
VCI_CAN_OBJ vco[50];
do{
RET = VCI_Receive(VCI_USBCAN_E_U,0,0,vco,50,50);
qDebug()<< "recv data num:"<<RET;
for(DWORD i=0;i<RET;i++)
{
QString str = "0x"+QString::number(vco[i].ID,16).toUpper()+" "+QString::number(vco[i].Data[0],16).toUpper()+" "+QString::number(vco[i].Data[1],16).toUpper()
+" "+QString::number(vco[i].Data[2],16).toUpper()+" "+QString::number(vco[i].Data[3],16).toUpper();
qDebug()<< "ID=0x"<<QString::number(vco[i].ID,16).toUpper()<<"data:"<<vco[i].Data[0]<<vco[i].Data[1]<<vco[i].Data[2]<<vco[i].Data[3];
ui->textBrowser->append(str);
}
}while(RET);
}
}
其中,注意在初始化的时候,如果是USBCAN-E-U等几个型号,需先调用VCI_SetReference,再调用VCI_StartCAN,顺序不能反。
完成后,向CAN发送数据,可以实现接收打印:
总结
本文仅仅实现了基本的数据收取,实现USBCAN-E-U信号CAN的使用,代码有些凌乱,仅供参考学习。
版权声明:本文为weixin_47733174原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。