qt stm32 发送接受浮点数以及两字节数

devtools/2025/3/16 23:57:02/

void MainWindow::on_pushButton_4_clicked()
{
    TPCANMsg msg;
    bool ok;
    float dianliu = ui->lineEditdianliu->text().toFloat(&ok);
    
    // 输入验证
    if (!ok) {
        ui->status->setText("电流输入无效,请重新输入");
        return;
    }

    // 设置CAN消息参数
    msg.MSGTYPE = static_cast<BYTE>(ui->framegeshi->currentIndex());
    msg.ID = (ui->frameid->text().toUInt(&ok, 16)) & 0x7FF;
    msg.LEN = 5;  // 1字节信号 + 4字节浮点数
    
    // 固定信号字节
    msg.DATA[0] = 0xDD;

    // 将浮点数转换为4字节(考虑字节序)
    unsigned char* ptr = reinterpret_cast<unsigned char*>(&dianliu);
    
    // 假设接收端使用小端模式(默认与x86兼容)
    // 如果接收端是大端模式,需要反转字节顺序
    msg.DATA[1] = ptr[0];
    msg.DATA[2] = ptr[1];
    msg.DATA[3] = ptr[2];
    msg.DATA[4] = ptr[3];

    // 调试输出字节内容
    qDebug() << "发送电流数据 (HEX):"
             << QString::number(msg.DATA[0], 16)
             << QString::number(msg.DATA[1], 16)
             << QString::number(msg.DATA[2], 16)
             << QString::number(msg.DATA[3], 16)
             << QString::number(msg.DATA[4], 16);

    // 发送CAN消息
    TPCANStatus status = CAN_Write(PCAN_USBBUS1, &msg);

    if (status != PCAN_ERROR_OK) {
        QString error = QString("电流发送失败,错误代码: 0x%1").arg(status, 0, 16);
        ui->status->setText(error);
        return;
    }

    ui->status->setText(QString("电流设置成功: %1 A").arg(dianliu));
}

 下位机接受;

// 假设接收数据存储在 rxData[5]
if (rxData[0] == 0xDD) {
    // 提取浮点数字节
    unsigned char bytes[4] = {rxData[1], rxData[2], rxData[3], rxData[4]};
    float current;
    memcpy(&current, bytes, 4);
    printf("接收电流值: %f A\n", current);
}

 TPCANMsg msg;
    bool ok;
    int time=ui->lineEdittime->text().toInt(&ok,10);
    if (!ok || time< 0 || time > 9999) {
        ui->status->setText("占空比输入无效,请输入0~9999的整数");
        return;
    }
     msg.DATA[0] = 0xCC;
    msg.MSGTYPE = static_cast<BYTE>(ui->framegeshi->currentIndex());
    msg.ID = (ui->frameid->text().toUInt(&ok, 16)) & 0x7FF;
    msg.LEN = 3;
    msg.DATA[1]=(time>>8)&0xff;
    msg.DATA[2] = time& 0xFF;
    TPCANStatus status = CAN_Write(PCAN_USBBUS1, &msg);
    
    if (status != PCAN_ERROR_OK) {
        QString error = QString("发送失败,错误代码: 0x%1").arg(status, 0, 16);
        ui->status->setText(error);
        return;
    }
    
    qDebug() << "占空比设置成功: 信号=0xcc 数值=" << time<< "%";
    ui->status->setText(QString("占空比设置成功: 数值=%1%").arg(time));

上位机(Qt)接收代码

 

cpp

// 在MainWindow类中定义CAN接收线程或槽函数
void MainWindow::initCANReceiver() {// 启动定时器或线程持续读取CAN消息QTimer *timer = new QTimer(this);connect(timer, &QTimer::timeout, this, &MainWindow::readCANData);timer->start(10); // 每10ms读取一次
}void MainWindow::readCANData() {TPCANMsg msg;TPCANStatus status;DWORD timestamp;// 读取CAN消息while (CAN_Read(PCAN_USBBUS1, &msg, &timestamp) == PCAN_ERROR_OK) {// 过滤特定ID的消息(假设目标ID为用户输入的ID)bool ok;uint targetID = ui->frameid->text().toUInt(&ok, 16) & 0x7FF;if (msg.ID != targetID) continue;// 解析数据(假设数据格式为3字节:[信号][高字节][低字节])if (msg.LEN >= 3 && msg.DATA[0] == 0xA1) {uint16_t dutyCycle = (msg.DATA[1] << 8) | msg.DATA[2];ui->status->setText(QString("接收占空比: %1%").arg(dutyCycle));qDebug() << "Received duty cycle:" << dutyCycle << "%";}}
}

下位机(STM32 HAL库)接收代码

 

c

// 在main.c中定义CAN接收回调函数
#include "stm32f1xx_hal.h"CAN_HandleTypeDef hcan;
CAN_RxHeaderTypeDef rxHeader;
uint8_t rxData[8];void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan) {// 读取CAN消息if (HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &rxHeader, rxData) == HAL_OK) {// 过滤特定ID的消息(假设目标ID为0x123)if (rxHeader.StdId == 0x123) {// 解析数据(假设数据格式为3字节:[信号][高字节][低字节])if (rxData[0] == 0xA1 && rxHeader.DLC >= 3) {uint16_t dutyCycle = (rxData[1] << 8) | rxData[2];// 应用占空比到PWM(示例代码)TIM1->CCR1 = dutyCycle; // 假设使用TIM1通道1输出PWM}}}
}

http://www.ppmy.cn/devtools/167673.html

相关文章

【黑马点评|项目】万字总结(下)

文章上半部分&#xff1a; 【黑马点评|项目】万字总结&#xff08;上&#xff09; 优惠卷秒杀 当用户抢购时&#xff0c;就会生成订单并保存到tb_voucher_order这张表中&#xff0c;而订单表如果使用数据库自增ID就存在一些问题&#xff1a; id的规律性太明显&#xff0c;容易出…

如何在androidstudio开发环境中查看sqlite数据库(按新版本Android Studio Giraffe提供详细步骤和操作说明,附截图,代码)

如何在androidstudio开发环境中查看sqlite数据库&#xff08;按新版本Android Studio Giraffe提供详细步骤和操作说明&#xff0c;附截图&#xff0c;代码&#xff09;鹿溪IT工作室提供_android studio查看数据库-CSDN博客

使用 ConfigMaps 可以优化 Spring Boot应用

基本概念 ConfigMaps&#xff1a;Kubernetes 中的一种资源对象&#xff0c;用于存储非敏感的配置数据&#xff0c;如应用程序属性、环境变量等。 主要优势 简化部署&#xff1a;无需在容器镜像中嵌入配置&#xff0c;减少镜像大小&#xff0c;加快部署速度。 动态更新&#…

如何在AVL树中高效插入并保持平衡:一步步掌握旋转与平衡因子 —— 平衡因子以及AVL结构篇

文章目录 AVL树的概念AVL树的结构AVL树的插入平衡因子更新终止条件插入以及平衡因子的保持AVL树的查找 AVL树的概念 AVL树&#xff08;Adelson-Velsky and Landis Tree&#xff09;是一种自平衡二叉查找树&#xff0c;它的特点是每个节点的左子树和右子树的高度差不能超过1。这…

grunt构建工具:scss转css

Grunt 是一个基于 JavaScript 的任务运行工具&#xff0c;通常用于自动化重复性任务&#xff0c;例如代码编译、文件压缩、单元测试等。它通过配置文件 Gruntfile.js 来定义任务和插件。 完整项目地址&#xff1a;https://github.com/ylpxzx/grunt-scss-to-css 以下是 Grunt 的…

爬虫基础之爬取豆瓣同城信息(保存为csv excel 数据库)

网站:长沙最近一周戏剧活动_豆瓣 温馨提示: 本案例仅供学习交流使用 本案例所使用的模块 requests(发送HTTP请求)pandas(数据保存模块)lxml(用于解析数据模块)csv(用于保存为csv文件)pymysql(用于操作数据库)parsel(解析数据的模块) 确定爬取的信息内容&#xff1a; 戏剧的名称…

贪心算法(6)(java)优势洗牌

题目: 给定两个长度相等的数组nums1和nums2&#xff0c;nums1相对于nums2的优势可以满足nums1【1】>nums[2]的索引的数目来描述。 返回nums1的任意排列&#xff0c;使其相对于nums2的透视最大化呀。 原理&#xff08;贪心策略&#xff09;&#xff1a;田忌赛马 1.如果比不…

数据类设计_图片类设计之6_混合图形类设计(前端架构)

前言 学的东西多了,要想办法用出来.C和C是偏向底层的语言,直接与数据打交道.尝试做一些和数据方面相关的内容 引入 接续上一篇,讨论混合图形类设计 方法论-现在能做什么 这段属于聊天内容---有句话是这么说的&#xff1a;不要只埋头拉车&#xff0c;还要抬头看路。写代码也是…