在制作上位机中,我们常常要把单片机上的数据,比如曲线图、电机速度、信号频率幅值等显示在上位机软件中,那么就需要下位机方将数据不断传给上位机以在Qt的QLCDNumber或者Qchart不断刷新,这是上位机对下位机的数据传输。

另外我们有时候需要在上位机里修改单片机的参数,比如设置当前速度需要将速度设置为100、设置模式时等场景,都需要上位机发送数据至下位机,然后下位机通过解析到的数据调用对应的函数以设置参数。

那么如何将让数据实现上、下位机间的传输呢,我分享一下上一篇关于电机控制我的做法。

上位机(QT)传输数据至下位机(STM32)

我用的通讯方式是串口通信,stm32用串口连接至电脑后,当点击套用参数时,调用槽函数。在槽函数里将数据发送给stm32,由于还有其他按钮要发送不同的数据,所以我在发送这串数据时,我加了一个报头:PID。

PID:0.3p0.015i0.2d20s

将所要发送的数据整理成这种形式,四个数据分别是 KP、KI、KD、和目标速度。即在调用槽函数时,在槽函数中调用串口类的write函数,将数据打包发给stm32

//套用按钮
void SerialPort::on_setButton_clicked()
{QString s = "PID:";QString str1 = ui->KPEdit->text();float str1f = str1.toFloat();QString s1 = QString::number(str1f);s.append(s1);QString str2 = ui->KIEdit->text();float str2f = str2.toFloat();QString s2 = QString::number(str2f);s.append("p");s.append(s2);QString str3 = ui->KDEdit->text();float str3f = str3.toFloat();QString s3 = QString::number(str3f);s.append("i");s.append(s3);QString str4 = ui->setSpeed->text();int str4f = str4.toInt();QString s4 = QString::number(str4f);s.append("d");s.append(s4);s.append("s");s.append("\r\n");char *temp=s.toLocal8Bit().data();port->write(temp);qDebug()<<temp;ui->setSpeed->setEnabled(false);ui->KPEdit->setEnabled(false);ui->KIEdit->setEnabled(false);ui->KDEdit->setEnabled(false);
}

通过 QString类下的append和各种类型转换函数将所发数据拼接成一条字符串打包通过串口发送给stm32。然后stm32串口接收到数据触发串口中断来处理数据。

#define GetChPos(thisBuf,ch) (int)strchr(thisBuf, ch) - (int)thisBufif(USART_ReceiveString[0] == 'P' && USART_ReceiveString[1] == 'I' && USART_ReceiveString[2] == 'D')
{//PID:0.2p0.015i0.2d50sfloat p,i,d,s;int a = GetChPos(USART_ReceiveString,':');int b = GetChPos(USART_ReceiveString,'p');int c = GetChPos(USART_ReceiveString,'i');int e = GetChPos(USART_ReceiveString,'d');  int f = GetChPos(USART_ReceiveString,'s');                       // KPmemcpy(USART_ReceiveString1, USART_ReceiveString1+a+1, sizeof(USART_ReceiveString1)-(a+1));memset(USART_ReceiveString1+b-(a+1), 0, sizeof(USART_ReceiveString1)+b-(a+1));float dval1;dval1 = atof(USART_ReceiveString1);printf("%1f\r\n",dval1);p=dval1;// KImemcpy(USART_ReceiveString2, USART_ReceiveString2+b+1, sizeof(USART_ReceiveString2)-(b+1));memset(USART_ReceiveString2+c-(b+1), 0, sizeof(USART_ReceiveString2)+c-(b+1));float dval2;dval2 = atof(USART_ReceiveString2);printf("%1f\r\n",dval2);i=dval2;// KDmemcpy(USART_ReceiveString3, USART_ReceiveString3+c+1, sizeof(USART_ReceiveString3)-(c+1));memset(USART_ReceiveString3+e-(c+1), 0, sizeof(USART_ReceiveString3)+e-(c+1));float dval3;dval3 = atof(USART_ReceiveString3);printf("%1f\r\n",dval3);d=dval3;// Targetspeedmemcpy(USART_ReceiveString4, USART_ReceiveString4+e+1, sizeof(USART_ReceiveString4)-(e+1));                    memset(USART_ReceiveString4+f-(e+1), 0, sizeof(USART_ReceiveString4)+f-(e+1));          int dval4;dval4 = atoi(USART_ReceiveString4);printf("%d\r\n",dval4);s=dval4;pid_set(p,i,d);INPUT=s;
}

先确实是以 PID 开始的报头,然后开始接收数据,将数据利用memset和memcpy分隔解析出来,然后传入pid_set这个函数实现pid的调参,这一套流程就实现了上位机改变参数,然后下位机响应调整pid。

下一篇将说明下位机(stm32)传数据给上位机(Qt)的数据解析。如果觉得这篇文章对您有帮助,可以点赞、收藏,有疑问可以私信我,看到都会回。

关于Qt上位机与下位机stm32数据传输的解析问题(一)相关推荐

  1. 计算机基础-工控机、上位机、下位机、stm32、单片机

    工控机 定义:(Industrial Personal Computer,IPC)即工业控制计算机,主要用于工业生产上. 性能:采用全钢机箱,抗震性能好,抗电磁干扰,抗冲击. 结构:包括CPU.io外 ...

  2. QT5实现串口收发数据(上位机与下位机通信)

    最近帮老师做一个应用程序,通过上位机与下位机进行串口通信,最后实现实时绘图,通过几天努力,成功实现蓝牙串口通信. 参考博客1 注意:代码中一些与串口无关代码,可以忽略掉 一.QT5串口基础知识 1. ...

  3. 基于STM32C8T6、ESP8266-01S、JavaWeb、JSP、Html、JavaScript、Android、服务器和客户端设计、上位机和下位机设计等技术融合的物联网智能监控系统设计与实现

    系列文章目录 第一章ESP8266的java软件仿真测试 第二章ESP8266硬件与软件测试 第三章ESP8266客户端与Java后台服务器联调 第四章ESP8266客户端与JavaWeb服务器联调 ...

  4. 用USB代替网络通讯,实现Cartographer上位机与下位机之间的消息传递

    任务动机:用USB代替网络通讯,实现Cartographer上位机与下位机之间的消息传递. 任务描述:根据任务动机,研发实现用USB代替网络通讯,形成文档. 1. 在Toybrick-RK3399 P ...

  5. KinectV2+机械臂实现目标抓取上位机和下位机软件

    KinectV2+机械臂实现目标抓取上位机和下位机软件. 上位机软件通过vs2019+qt5通过C++语言编写. 上夜机运行特征点检测算法,获取目标图像,图像配准,目标位置计算,相机内参和手眼标定数据 ...

  6. 上位机与下位机程序配合是 下位机程序崩溃

    最近作为一个菜鸟,一直测试同事用QT写好的上位机与下位机程序, 结果配置一个模块,连续点击多次下载时,下位机出现程序崩溃的情况.如图 根据提示得知 在下位机线程没有结束的时候,我通过上位机就把内容情况 ...

  7. 上下位机通讯协议_上位机与下位机的区别通讯

    上位机是指可以直接发出操控命令的计算机,一般是PC/host computer/master computer/upper computer,屏幕上显示各种信号变化(液压,水位,温度等).下位机是直接 ...

  8. 上位机和下位机的概念,理解如何实现PC从PLC中读取数据?

    市面上的PLC有上百种, 西门子的, 三菱的, 欧姆龙的等等. 上位机和下位机的理解: 上位机是指可以直接发出操控命令的计算机,一般是PC/host computer/master computer/ ...

  9. 打开单片机世界的大门——上位机控制下位机实例详解

    上位机控制下位机实例详解 一.基本概念 上位机与下位机 串口 数据表达 二.下位机程序 三.上位机程序 四.总结 一.基本概念 在开始讲解前,先来看几个基本概念,如果是有基础的大佬,请直接跳到下一节. ...

最新文章

  1. 2022-2028年中国成人艺术培训行业市场前瞻与投资战略规划分析报告
  2. Extjs 4.0.7 中模式窗口的CURD
  3. 搜索推荐中的召回匹配模型综述(一):传统方法
  4. 【Java】JavaIO(一)、基础知识
  5. 赵娜计算机,新学期 新起点 新征程——计算机学院2016级召开系列年级工作会议...
  6. linux下大文件裁剪,Linux系统裁剪(2)之Linux系统裁剪
  7. cognos report上钻下钻报表处理方法(2)
  8. 如何在Mac上禁用iCloud驱动器?
  9. 计算机名汉字 oracle,修改计算机名对ORACLE的影像
  10. Exchange 2016 CU3 安装失败解决方法
  11. 《线性代数》同济六版 总结
  12. [Android] 选项卡组件TabHost
  13. 阿里巴巴编码规范习题
  14. 计算机专业选择加州的哪些大学留学,学计算机科学专业,必选硅谷附近的加州大学!...
  15. 一只小白,在学习delphi.感觉很吃力。。
  16. Python - 实现渐变色的RGB计算
  17. 普通浏览器会泄露信息吗?使用安全浏览器如何做到隐私保护?
  18. Tensorflow 的NCE-Loss的实现和word2vec
  19. 【全网首发】听阿里云产品架构师罗小飞解读CDN产品最佳实践
  20. iOS10 相关适配问题

热门文章

  1. 安装Python 后安装Python-dev
  2. 领英精灵安全吗?附LinkedIn领英开发客户的关键点
  3. Android 开发即时聊天工具 YQ :(五) 发送消息
  4. 全景拍摄—地面拍摄教程
  5. Linux / Windows系统中安装最新版 ElasticSearch (es)搜索引擎 超详细图文教程【一看就懂】
  6. 精准营销,如何构建一套完善的用户画像体系?
  7. 笔记2:VC++ socket通信实例
  8. oracle删除重复数据-百万级别数据以上情况
  9. 计算机网络—IP地址与子网划分
  10. 人工智能就业方向及前景,前景如何?好就业吗?