基于QT编写的周立功CAN,可进行uds、bootloder的上位机开发

您所在的位置:网站首页 inca刷写二次开发 基于QT编写的周立功CAN,可进行uds、bootloder的上位机开发

基于QT编写的周立功CAN,可进行uds、bootloder的上位机开发

2024-07-13 18:54| 来源: 网络整理| 查看: 265

基于QT编写的解析周立功CAN 1.介绍

应用场景:需要将CAN数据传输到上位机。 可以进行界面显示,做一些基于can的演示系统等

2.封装的模块

1.CanComm.c 中间层 封装通信函数 封装了 可以读取uds报文 可以写入uds报文 可以读取应用报文 可以写入应用报文 2.cantxthread.cpp 中间层 重底层读取 3.canrxthread.cpp 中间层 重底层读取 4.zlgCANFunctions.cpp 底层 周立功库函数封装 5.xlCANFunctions.cpp 底层 周立功库函数封装 6.widget.cpp 应用层

3.基本的一些介绍

底层周立功zlgCANFunctions.cpp 介绍

bool zlgCANFunctions::zlgCANInit(int devtype,unsigned long baud, int canNum) { VCI_INIT_CONFIG init_config; int baudTemp; m_devtype = devtype; m_canind = canNum; m_devind = 0; /* 0x700 ~ 0x7ff */ // if (0 == canExternFlag) // { // init_config.AccCode = 0xE0000000; // init_config.AccMask = 0x1FFFFFFF; // } // else // { // init_config.AccCode = 0x00003800; // init_config.AccMask = 0xFFFFC7FF; // } /* 不滤波 */ init_config.AccCode = 0x00;//0xE0000000; init_config.AccMask = 0xFFFFFFFF;//0x1FFFFFFF; /* 0->双滤波 , 1->单滤波 */ init_config.Filter = 1; /* 0->正常模式,1->监听模式 */ init_config.Mode = 0; switch(baud) { case 500000://500k default: if (m_devtype == VCI_USBCAN2) { init_config.Timing0 = 0x00; init_config.Timing1 = 0x1c; } else if (((m_devtype == VCI_USBCAN_E_U))||((m_devtype == VCI_USBCAN_2E_U))) { baudTemp = 0x60007; } break; case 250000://250k if (m_devtype == VCI_USBCAN2) { init_config.Timing0 = 0x01; init_config.Timing1 = 0x1c; } else if (((m_devtype == VCI_USBCAN_E_U))||((m_devtype == VCI_USBCAN_2E_U))) { baudTemp = 0x1c0008; } break; case 125000://125k if (m_devtype == VCI_USBCAN2) { init_config.Timing0 = 0x03; init_config.Timing1 = 0x1c; } else if (((m_devtype == VCI_USBCAN_E_U))||((m_devtype == VCI_USBCAN_2E_U))) { baudTemp = 0x1c0011; } break; } if(VCI_OpenDevice(m_devtype,m_devind,0) != STATUS_OK ) { return false; } if(VCI_SetReference(m_devtype,m_devind,m_canind,0,&baudTemp)!= STATUS_OK) { VCI_CloseDevice(m_devtype,m_devind); return false; } if(VCI_InitCAN(m_devtype,m_devind,m_canind,&init_config)!= STATUS_OK) { VCI_CloseDevice(m_devtype,m_devind); return false; } if(VCI_StartCAN(m_devtype,m_devind,m_canind) != STATUS_OK ) { VCI_CloseDevice(m_devtype,m_devind); return false; } VCI_ClearBuffer(m_devtype,m_devind,0); return true; }

这个底层配置周立功CAN设置,可以自行查看周立功CAN的封装库 需要支持你的CAN卡只需要添加更改这个代码块即可 查看ControlCAN.h 导入相应名称即可

switch(baud) { case 500000://500k default: if (m_devtype == VCI_USBCAN2) { init_config.Timing0 = 0x00; init_config.Timing1 = 0x1c; } else if (((m_devtype == VCI_USBCAN_E_U))||((m_devtype == VCI_USBCAN_2E_U))) { baudTemp = 0x60007; } break; case 250000://250k if (m_devtype == VCI_USBCAN2) { init_config.Timing0 = 0x01; init_config.Timing1 = 0x1c; } else if (((m_devtype == VCI_USBCAN_E_U))||((m_devtype == VCI_USBCAN_2E_U))) { baudTemp = 0x1c0008; } break; case 125000://125k if (m_devtype == VCI_USBCAN2) { init_config.Timing0 = 0x03; init_config.Timing1 = 0x1c; } else if (((m_devtype == VCI_USBCAN_E_U))||((m_devtype == VCI_USBCAN_2E_U))) { baudTemp = 0x1c0011; } break; }

拿取数据的周期及数据数。这里使用的函数VCI_GetReceiveNum及VCI_Receive 周立功的库开发里面有使用方法

bool zlgCANFunctions::zlgCANRecv() { VCI_CAN_OBJ rec[20];//这里10ms拿取20为拿取的数据数 int reclen ,i; int length = VCI_GetReceiveNum(m_devtype,m_devind,m_canind); if(length 20) { length = 20; } mutex.lock(); if((reclen = VCI_Receive(m_devtype,m_devind,m_canind,rec,length,10))>0)//周期10MS { for(i = 0; i = CAN_MSG_QUEUE_LEN) { g_tCanAllMsg.wr_index = 0; } if(g_tCanAllMsg.wr_index == g_tCanAllMsg.rd_index) { g_tCanAllMsg.full = 1; } } } 4.demo分享

这里提供一个demo 。只需要更改serial.cpp就可以了。

1、https://download.csdn.net/download/a_954710805/13053480

2、https://wwdj.lanzout.com/iDEu20x0dk1i

5.Tsmaster调用库来完成底层库

关注我另外一个文章 https://blog.csdn.net/a_954710805/article/details/130821093?spm=1001.2014.3001.5501



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3