UDS升级入门,手把手教你——QT上位机开发1

上位机开发1
QT环境:
在这里插入图片描述

1、环境搭建
在这里插入图片描述

需要用到周立功 相关接口,拿到库文件,进行二次开发
在这里插入图片描述

使用以下文件
在这里插入图片描述

新建立一个工程,或者网找一个demo工程,在原有的基础进行开发(建议使用第二种)。

并链接上这个库,进行can通信开发。

在这里插入图片描述

以下就是库,暴露出来can通信接口

在这里插入图片描述

具体接口使用可以看文档。
在这里插入图片描述

2、CAN通信开发

目标:以500k/s的波特率与MCU进行CAN通信,可发可收。

CAN通信对象:


class Thread : public QThread
{Q_OBJECT
public:Thread();void stop();void OpenCANThread();void CloseCANThread();void ReceiveCANThread();void TransmitCANThread();//void OtaStart();
public:typedef DWORD(__stdcall VCI_OpenDevice)(DWORD,DWORD,DWORD);typedef DWORD(__stdcall VCI_ResetCAN)(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd);typedef DWORD(__stdcall VCI_CloseDevice)(DWORD DeviceType,DWORD DeviceInd);typedef DWORD(__stdcall VCI_InitCAN)(DWORD DeviceType, DWORD DeviceInd, DWORD CANInd, PVCI_INIT_CONFIG pInitConfig);typedef DWORD(__stdcall VCI_StartCAN)(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd);typedef ULONG(__stdcall VCI_Transmit)(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd,PVCI_CAN_OBJ pSend,ULONG Len);typedef ULONG(__stdcall VCI_Receive)(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd,PVCI_CAN_OBJ pReceive,ULONG Len,INT WaitTime/*=-1*/);typedef ULONG(__stdcall VCI_GetReceiveNum)(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd);typedef DWORD(__stdcall VCI_ClearBuffer)(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd);typedef DWORD(__stdcall VCI_ReadErrInfo)(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd,PVCI_ERR_INFO pErrInfo);typedef DWORD(__stdcall VCI_ReadCANStatus)(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd,PVCI_CAN_STATUS pCANStatus);typedef DWORD(__stdcall VCI_SetReference)(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd,DWORD RefType,PVOID pData);typedef DWORD(__stdcall VCI_ReadBoardInfo)(DWORD DeviceType,DWORD DeviceInd,PVCI_BOARD_INFO pInfo);int devtype;//设备类型号int devind;//设备索引号int res;//保留参数,通常为0int canind;//第几路canint reftype;//参数类型VCI_Transmit *pTransmitCAN;VCI_Receive *pReceive;protected:void run();
private:volatile bool stopped;VCI_OpenDevice *pOpenDevice;VCI_ResetCAN *pResetCAN;VCI_CloseDevice *pCloseDevice;VCI_InitCAN *pInitCAN;VCI_StartCAN *pStartCAN;VCI_GetReceiveNum *pGetReceiveNum;VCI_ClearBuffer *pClearBuffer;VCI_ReadErrInfo *pReadErrInfoCAN;VCI_ReadCANStatus *pReadCANStatus;VCI_SetReference *pSetReference;VCI_ReadBoardInfo *pReadBoardInfo;
};

初始化

devtype=VCI_USBCAN2;//设备类型USBCAN2devind=0;//设备索引号res=0;canind=0;//CAN通道0reftype=0;//参数类型bool ok;VCI_ERR_INFO vei;VCI_CAN_OBJ preceive[100];VCI_CAN_OBJ psend;int baud=0x10000000;//参数有关数据缓冲区地址首指针//导入库QLibrary lib("usbcan.dll");if(true==lib.load())qDebug()<<"usbcan.dll load ok";hander_init();pOpenDevice = (VCI_OpenDevice *)lib.resolve("VCI_OpenDevice");pCloseDevice = (VCI_CloseDevice *)lib.resolve("VCI_CloseDevice");pInitCAN = (VCI_InitCAN *)lib.resolve("VCI_InitCAN");pStartCAN = (VCI_StartCAN *)lib.resolve("VCI_StartCAN");pTransmitCAN = (VCI_Transmit *)lib.resolve("VCI_Transmit");pReceive = (VCI_Receive *)lib.resolve("VCI_Receive");pGetReceiveNum = (VCI_GetReceiveNum *)lib.resolve("VCI_GetReceiveNum");pClearBuffer = (VCI_ClearBuffer *)lib.resolve("VCI_ClearBuffer");pReadErrInfoCAN = (VCI_ReadErrInfo*)lib.resolve("VCI_ReadErrInfo");pResetCAN=(VCI_ResetCAN *)lib.resolve("VCI_ResetCAN");pSetReference=(VCI_SetReference *)lib.resolve("VCI_SetReference");pReadBoardInfo=(VCI_ReadBoardInfo *)lib.resolve("VCI_ReadBoardInfo");pReadCANStatus=(VCI_ReadCANStatus *)lib.resolve("VCI_ReadCANStatus");

打开CAN通道

    VCI_ERR_INFO vei;VCI_CAN_OBJ preceive[100];VCI_CAN_OBJ psend;int baud=0x10000000;//参数有关数据缓冲区地址首指针//打开设备if(pOpenDevice(devtype,devind,res)==STATUS_ERR ){if(pReadErrInfoCAN(devtype,devind,canind,&vei)!=STATUS_ERR){qDebug()<<"打开失败:"<<QString::number(vei.ErrCode,16);}elseqDebug()<<"error";return;}elseqDebug()<<"open successed";//初始化VCI_INIT_CONFIG init_config;init_config.Mode=0;//0正常模式,1为只听模式init_config.Filter=1;//滤波方式,单滤波init_config.Timing0=0x00;//定时器0init_config.Timing1=0x1c;//定时器1init_config.AccCode=0x10000000;//验收码init_config.AccMask=0xFFFFFFFF;//屏蔽码全部接收if(pInitCAN(devtype,devind,canind,&init_config)==STATUS_ERR){qDebug("Init Error");pCloseDevice(devtype,devind);return;}elseqDebug()<<"Init successed";//读取设备信息VCI_BOARD_INFO vbi;if(pReadBoardInfo(devtype,devind,&vbi)!=STATUS_ERR){qDebug()<<"CAN通道数:"<<vbi.can_Num;qDebug()<<"硬件版本号:"<<vbi.hw_Version;qDebug()<<"接口库版本号:"<<vbi.in_Version;qDebug()<<"中断号"<<vbi.irq_Num;}//设置设备参数if(pSetReference(devtype,devind,canind,reftype,&baud)==STATUS_ERR){qDebug("set reference error");pCloseDevice(devtype,devind);return;}//清除缓冲区pClearBuffer(devtype,devind,canind);//启动设备if(pStartCAN(devtype,devind,canind)==STATUS_ERR){qDebug()<<"start fail";pCloseDevice(devtype,devind);return;}elseqDebug()<<"start successed";

选择正常模式、单滤波、500kbps、报文全接收

在这里插入图片描述
在这里插入图片描述

数据发送:

VCI_CAN_OBJ psend;//发送ULONG Tr;QString  buffer = "";psend.ID=0x000007d1;psend.SendType=0;psend.RemoteFlag=0;psend.ExternFlag=0;psend.DataLen=3;psend.Data[0]=0x02;psend.Data[1]=0x10;psend.Data[2]=0x01;if(psend.DataLen < 8){for(int i = psend.DataLen;i < 8 ;i++){psend.Data[i] = 0xAA;}psend.DataLen = 8;}Tr=pTransmitCAN(devtype,devind,canind,&psend,1);

数据接收

res=pGetReceiveNum(devtype,devind,canind);if(res > 0){res=pReceive(devtype,devind,canind,preceive,50,200);for(int i=0;i<res;i++){frame_re.fr_format = CBUS_FR_FRM_STD;frame_re.id_type = CBUS_ID_T_STANDARD;frame_re.dlc = preceive[i].DataLen;frame_re.id = preceive[i].ID;memcpy(frame_re.dt, preceive[i].Data, frame_re.dlc);iso15765_enqueue(&handler_15765, &frame_re);}}

3、UI设计

目标:

CAN设备:开启和关闭

升级文件:文件路径

OAT:升级进度
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/562791.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uni-app从零开始快速入门

教程介绍 跨端框架uni-app作为新起之秀&#xff0c;在不到两年的时间内&#xff0c;迅速被广大开发者青睐和推崇&#xff0c;得益于它颠覆性的优势“快”&#xff0c;快到可以节省7套代码。本课程由uni-app开发者团队成员亲授&#xff0c;带领大家无障碍快速掌握完整的uni-app…

Redis的String类型为什么重新设计使用了SDS数据结构呢

Redis 选择重新设计其 String 类型的底层数据结构&#xff0c;采用 SDS&#xff08;Simple Dynamic String&#xff09;而不是直接使用 C 语言标准库提供的原生字符串&#xff08;char*&#xff09;的原因主要包括以下几点&#xff1a; O(1) 时间复杂度获取长度&#xff1a; 在…

Stable Diffusion实现光影字效果

昨天下午有人在群里发光影图片&#xff0c;大家都觉得很酷&#xff0c;我没怎么在意。直到早上我在小红书看到有人发同款图片&#xff0c;只是一晚上的时间点赞就超过了8000&#xff0c;而且评论数也很高&#xff0c;也可以做文字定制变现。研究了一下发现这个效果不难实现&…

@ohos.router (页面路由)实现页面间跳转与数据传递

一、描述 本模块提供通过不同的url访问不同的页面&#xff0c;包括跳转到应用内的指定页面、用应用内的某个页面替换当前页面、返回上一页面或指定的页面等。 二、导入模块 import router from ohos.router 三、router.pushUrl 1、描述 跳转到应用内的指定页面。 router.pu…

对话悠易科技蔡芳:品牌逐渐回归核心能力建设,布局和构建自己的流量阵地

关于SaaS模式在中国的发展&#xff0c;网上出现多种声音。Marteker近期采访了一些行业专家&#xff0c;围绕SaaS模式以及Martech在中国的发展提出独特观点。悠易科技副总裁蔡芳认为&#xff0c;中国目前存在SaaS的应用场景与客户需求&#xff0c;用户的应用能力也在提升&#x…

代码随想录day29(2)二叉树:将有序数组转换为二叉搜索树(leetcode108)

题目要求&#xff1a;将一个按照升序排列的有序数组&#xff0c;转换为一棵高度平衡二叉搜索树。 思路&#xff1a;思路比较简单&#xff0c;如果目标是平衡二叉树&#xff0c;我们每次只需要取数组的中间元素作为根节点&#xff0c;分成左右两个子树&#xff0c;再递归地进行…

二叉树的遍历及线索二叉树试题(三)

一、单项选择题 01.在下列关于二叉树遍历的说法中&#xff0c;正确的是( ). A.若有一个结点是二叉树中某个子树的中序遍历结果序列的最后一个结点&#xff0c;则它一定是该子树的前序遍历结果序列的最后一个结点 B.若有一个结点是二叉树中某个子树的前序遍历结果序列的最后一…

mysql置事务隔离级

隔离级别脏读&#xff08;Dirty Read&#xff09;不可重复读&#xff08;Non-Repeatable Read&#xff09;幻读&#xff08;Phantom Read&#xff09;读未提交是是是读已提交否是是可重复读否否是序列化否否否 这个表格以可读性的方式总结了四种隔离级别下可能发生的并发问题。…

子网掩码,网段,网关

IP地址、子网掩码、网段、网关【网络常识 2】_哔哩哔哩_bilibili 网关&#xff1a; 什么时候需要用到网关&#xff1a; 若目标IP在同一网段则可以直接通信不需要经过网关&#xff0c;否则需要。 怎么判断对方的ip是否与我在同一网段呢&#xff1f; 判断网络号是否相同。 电…

mac 安装 nvm 【真解决问题】

前提 没有node环境已有git 下载 我用的gitee极速下载 git clone https://gitee.com/mirrors/nvm.git ~/.nvm && cd ~/.nvm && git checkout git describe --abbrev0 --tags配置 1. 配置变量 在用户的目录下新增文件 .zshrc export NVM_DIR"$HOME/…

MYSQL多表设计,多表查询,事务,索引

目录 一多表设计 1.1 一对多 1.1.1 外键约束 1.2一对一 1.3多对多 二多表查询 2.1数据准备&#xff1a; 2.2笛卡儿积&#xff1a; 2.3 分类 2.3.1内连接 2.3.2外连接 三子查询 3.1标量子查询 3.2列子查询 3.3行子查询 3.4表子查询 四事务 4.1场景 4.2语法…

Git Commit 提交规范,变更日志、版本发布自动化和 Emoji 提交标准

前言 Git Commit 是开发的日常操作, 一个优秀的 Commit Message 不仅有助于他人 Review, 还可以有效的输出 CHANGELOG, 对项目的管理实际至关重要, 但是实际工作中却常常被大家忽略&#xff0c;希望通过本文&#xff0c;能够帮助大家规范 Git Commit&#xff0c;并且展示相关 …