本文最后更新于1135 天前,其中的信息可能已经过时,如有错误请发送邮件到17671220626@139.com
STM32与上位机通信协议——UART协议:
串行通讯需要有通信协议
通信协议:规定发送与接收方,通信的方式与要求,数据的格式
由RXD和TXD两条线,由于没有时钟线,所以需要规定波特率
数据传输速率就是波特率
UART(串行异步全双工)
采用的是串行通信,也就是一条传输线,一位一位的顺序发送(可以远距离传输,传输较慢)
异步通信是以一个字符为传输单位,每个字符为10位(1个起始位,7个数据位,1个校验位,1个停止位)
通信中两个字符之间的时间间隔不固定,但是同一个字符相邻位之间时间间隔是固定的:
数据通信格式
1、起始位
2、数据位
3、校验位
4、停止位
5、空闲位
STM32需要通过串口向上位机完成数据上传,然后完成实时显示。
所以需要先完成上位机的一个开发,上位机开发工具选择QT
创建QT工程:

选择QT Widgets 修改名称为:serialdisplay,路径自己选择

直接点击下一步,到这个界面:

修改一下类名为:SerialDisplay

直接点击下一步,直到点击完成 创建工程就成功了,创建完成可以运行一下;
接下来就是添加空间,找到设计界面,点击ui

就转到这个界面,可以开始添加控件,左边就是控件栏:

添加完控件如下:

修改右边对应控件的名字,便于代码里使用;

然后就是代码部分:
右击你要实现功能的控件,比如说打开串口按钮如下:

点击转到槽函数:

选择点击触发,点击ok,就会跳转到以下界面:

对应实现该函数即可。其他我就不一一介绍了:
直接上源码:
serialdisplay.cpp文件
#include "serialdisplay.h"
#include "ui_serialdisplay.h"
#include <QDebug>
#include <QMessageBox>
#include <QFontDialog>
#include <QJsonObject>
#include <QJsonDocument>
SerialDisplay::SerialDisplay(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::SerialDisplay)
{
ui->setupUi(this);
serialflag = 0;//表示串口关闭
setWindowFlags(windowFlags()&~Qt::WindowMaximizeButtonHint);// 禁止最大化按钮
serialport = new QSerialPort();//分配内存
ui->dateTimeEdit->setDisabled(true);//
timerid = startTimer(1000);//开启定时器,每隔1秒
}
SerialDisplay::~SerialDisplay()
{
killTimer(timerid);//关闭
delete ui;
delete serialport;
}
//串口获取
void SerialGetData::Serial_read()
{
int temp = 0;//
int humi = 0;
QByteArray recvData;
try {
recvData = SerialGetData::serial_recv_Data();//从串口接收数据
} catch (MyExcption &err) {
QMessageBox::warning(NULL , "提示", err.what());
return;
}
QString receive = QString::fromLocal8Bit(recvData.constData());
//json格式数据解析 比如:{"温度":"10℃","湿度":"20%"}
QJsonParseError err;
QByteArray arr ;
arr.append(receive);
QJsonDocument doc = QJsonDocument::fromJson(arr,&err);
if(err.error != QJsonParseError::NoError){
qDebug() << "转换失败";
return;
}
QJsonObject obj = doc.object();
temp = SerialGetData::getNumsFromStr(obj.value("温度").toString());
humi = SerialGetData