Qt使用usbcan通信

一.usbcan环境搭建

可以参照我的这篇博客:USBCAN-II/II+使用方法以及qt操作介绍

二.项目效果展示

在这里插入图片描述

三.项目代码

  • 这部分代码仅仅展示了部分功能,仅供参考。
#include"ControlCAN.h"
#include<QDebug>
#include <windows.h>
#include<stdio.h>
#include"reveivethread.h"
#include<QVector>

#define DEVICE_TYPE 4    // 设备类型
#define DEVICE_INDEX 0   // 设备索引
#define CAN_INDEX 0      // CAN 通道索引1
#define CAN_INDEX2 1      // CAN 通道索引2


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    Init_Connect();
}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::on_pushButton_start_clicked()
{
    ui->textEdit->clear();
       // 初始化CAN设备
       //VCI_OpenDevice(DWORD DeviceType,DWORD DeviceInd,DWORD Reserved)
       if (VCI_OpenDevice(DEVICE_TYPE, DEVICE_INDEX, 0) == 0)
       {

           qDebug()<<"Device open fail!";
           ui->textEdit->append("Device open fail!");
           return ;
       }else
       {
           qDebug()<<"Device open successful!";
           ui->textEdit->append("Device open successful!");
       }

      // 初始化配置结构
      VCI_INIT_CONFIG initConfig;
      initConfig.AccCode = 0x00000000;  // 接收过滤器
      initConfig.AccMask = 0xFFFFFFFF;   // 接收掩码
      initConfig.Filter = 0;              // 过滤器类型
      initConfig.Timing0 = 0x00;          // 时间参数
      initConfig.Timing1 = 0x14;          // 时间参数
      initConfig.Mode = 0;                 // 工作模式




      // 设置CAN通道1
      //VCI_InitCAN(DWORD DeviceType, DWORD DeviceInd, DWORD CANInd, PVCI_INIT_CONFIG pInitConfig);
      if (VCI_InitCAN(DEVICE_TYPE, DEVICE_INDEX, CAN_INDEX, &initConfig) == 0) {
          //printf("初始化CAN通道失败!\n");
          qDebug()<<"InitCAN 1 fail!";
          ui->textEdit->append("InitCAN 1 fail!");
          return ;
      }else
      {
          qDebug()<<"InitCAN 1 successful!";
          ui->textEdit->append("InitCAN 1 successful!");
      }

      // 设置CAN通道2
      //VCI_InitCAN(DWORD DeviceType, DWORD DeviceInd, DWORD CANInd, PVCI_INIT_CONFIG pInitConfig);
      if (VCI_InitCAN(DEVICE_TYPE, DEVICE_INDEX, CAN_INDEX2, &initConfig) == 0) {
          //printf("初始化CAN通道失败!\n");
          qDebug()<<"InitCAN 2 fail!";
          ui->textEdit->append("InitCAN 2 fail!");
          return ;
      }else
      {
          qDebug()<<"InitCAN 2 successful!";
          ui->textEdit->append("InitCAN 2 successful!");
      }

      // 启动CAN通道1
      if (VCI_StartCAN(DEVICE_TYPE, DEVICE_INDEX, CAN_INDEX) == 0) {
          //printf("启动CAN通道失败!\n ");
          qDebug()<<"StartCAN 1 fail!";
          ui->textEdit->append("StartCAN 1 fail!");
          return ;
      }else
      {
          qDebug()<<"StartCAN 1 successful!";
          ui->textEdit->append("StartCAN 1 successful!");
      }

      // 启动CAN通道2
      if (VCI_StartCAN(DEVICE_TYPE, DEVICE_INDEX, CAN_INDEX2) == 0) {
          //printf("启动CAN通道失败!\n ");
          qDebug()<<"StartCAN 2 fail!";
          ui->textEdit->append("StartCAN 2 fail!");
          return ;
      }else
      {
          qDebug()<<"StartCAN 2 successful!";
          ui->textEdit->append("StartCAN 2 successful!");
      }

   
}

void MainWindow::on_pushButton_close_clicked()
{
        // 关闭设备
        if(VCI_CloseDevice(DEVICE_TYPE, DEVICE_INDEX))
        {
            qDebug()<<"CloseDevice successful!";
            ui->textEdit->append("CloseDevice successful!");
        }else
        {
            qDebug()<<"CloseDevice fail!";
            ui->textEdit->append("CloseDevice fail!");
        }

        //关闭线程
        //rev.wait();
}

void MainWindow::on_pushButton_clear_clicked()
{
    ui->textEdit->clear();
}

void MainWindow::on_pushButton_send_clicked()
{
        //QString str=("01 02 03 04 05 06 07 08");
        //现在需要的请求是需要将每个字节都正确的发送出来以0x01的形式

        // 输入串
        QString str = ui->lineEdit->text();


        QStringList hexValues = str.split(" ");  // 使用空格分割字符串
        //存放16进制数字
        QVector<int>Int_16;


        // 遍历每个十六进制值并格式化输出
        for (const QString &value : hexValues)
        {
            bool ok;
            int number = value.toInt(&ok, 16); // 将十六进制字符串转换为整数
            Int_16.push_back(number);
            if (ok)
            {
                qDebug() << QString("0x%1").arg(number, 2, 16, QLatin1Char('0')).toUpper(); // 格式化为0x形式并打印
            } else
            {
                qDebug() << "Invalid hex value:" << value; // 错误处理
            }
        }




        VCI_CAN_OBJ vco;// 定义两帧的结构体数组
                // 中间略去其他函数代码
        vco.ID = 0x00000001;// 填写第一帧的ID
        vco.SendType = 0;// 正常发送模式
        vco.RemoteFlag = 0;// 数据帧
        vco.ExternFlag = 0;// 标准帧
        vco.DataLen = 8;// 数据长度1个字节
        //vco.Data[0] = number;// 数据0为0x66,十进制102

        //将结果存入到Data中
        for(int i=0;i<8;i++)
        {
            vco.Data[i]=Int_16[i];
        }

        DWORD dwRel = VCI_Transmit(DEVICE_TYPE, DEVICE_INDEX, CAN_INDEX, &vco, 1); // 发送1帧
        if(dwRel)
        {
             qDebug()<<"nCANInd 1 transmit successful,dwRel="<<dwRel;
             ui->textEdit->append("nCANInd 1 transmit successful,dwRel= "+QString::number(dwRel));
        }else
        {
             qDebug()<<"nCANInd 1 transmit fail";
             ui->textEdit->append("nCANInd 1 transmit fail");
        }
         rev.start();
         rev.current_strart();
         //rev.sleep(1);
         rev.wait();
         //rev.stop();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值