加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
mainwindow.cpp 6.72 KB
一键复制 编辑 原始数据 按行查看 历史
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QSerialPortInfo>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
/*
* 超声波上报通信协议
*
* 接收 帧数据,帧结构 (大端结构):
* 帧头(0x53)(1byte),数据编号(4byte),数据长度n(1byte),数据内容(nbyte),累加(帧头到数据内容 1byte),帧尾(0x54)(1byte)
* 0x53 0x00 0x00 0x00 0x01 0x01 0x56 0xxx 0x54
*
* 帧头字节特殊处理(处理完帧内容发送时遇到帧头字节要进行特殊处理)
* 0x53 要替换成 0x52 0x01 (0x01 = 0x53 xor 0x52) 帧头,除了帧头位置其他位置不能出现帧头字节
* 0x54 要替换成 0x52 0x06 (0x06 = 0x54 xor 0x52) 帧尾,除了帧尾位置其他位置不能出现帧尾字节
* 0x52 要替换成 0x52 0x00 (0x00 = 0x52 xor 0x52) 标识字,标记所有替换字节
*/
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
, serial(nullptr)
{
ui->setupUi(this);
radar *radar_background = new radar(this, 1);
radar_background->setGeometry(10, 100, 600, 600);
ui->angle_spend->setText("1");
connect(this, SIGNAL(refresh_radar_pic_sig()), this, SLOT(slotRefresh_radar()));
for(unsigned long i = 0; i < (sizeof(baud)/sizeof(baud[0])); i++)
{
ui->port_baud->addItem(baud[i].str);
}
on_port_refresh_clicked();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_port_open_clicked()
{
if((nullptr == serial) && ("打开" == ui->port_open->text()))
{
//新建一个串口类
serial = new QSerialPort;
//设置串口号,这个就是上面我们serial.portName()保存的串口号了
serial->setPortName(ui->port_select->currentText().split(" ")[0]);
//设定了串口号,那就是用读写方式打开串口了,前面说了是吧。
serial->open(QIODevice::ReadWrite);
//设置波特率 根据 baud
serial->setBaudRate(baud[ui->port_baud->currentIndex()].value);
//设置数据位数,这个就是数据位了,枚举了5、6、7、8位,我们一般都用的8位的
serial->setDataBits(QSerialPort::Data8);
//设置校验位
serial->setParity(QSerialPort::NoParity);
//设置停止位,串口一般有一个停止位或两个停止位,选择吧
serial->setStopBits(QSerialPort::OneStop);
//设置流控制 无控制流
serial->setFlowControl(QSerialPort::NoFlowControl); //设置为无流控制
// 链接接收
connect(serial,SIGNAL(readyRead()),this,SLOT(slotReadData()));
// 清空接收缓存
rec.clear();
// 创建雷达图
radar_map = new radar(this, 360/ui->angle_spend->text().toInt());
radar_map->setGeometry(10, 100, 600, 600);
radar_map->show();
// 设置按钮
ui->port_open->setText("关闭");
}else if((nullptr != serial) && ("关闭" == ui->port_open->text())){
serial->close();
delete serial;
serial = nullptr;
ui->port_open->setText("打开");
delete radar_map;
radar_map = nullptr;
}else{
if(serial) delete serial;
serial = nullptr;
ui->port_open->setText("打开");
if(radar_map) delete radar_map;
radar_map = nullptr;
}
}
void MainWindow::on_port_refresh_clicked()
{
//下面这个循环语句用来查找可以用的串口端口
//不确定有多少串口可用,也就不知道循环多少次,所以用foreach(不知道用的就百度)
ui->port_select->clear();
foreach (const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
{
QSerialPort serial; //在循环语句内部实例化类,因为可用串口不一定只就一个
serial.setPort(info); //设置能够用的串口端口
if(serial.open(QIODevice::ReadWrite)) //用ReadWrite可读写的方式打开串口
{
//记录可用的uart名字serial.portName(),前面的ui->PortBox->addItem不用管,这个是界面里面的。
ui->port_select->addItem(serial.portName() + " " + info.description());
//然后关闭串口,因为这段代码打开串口只是为了查找串口可以用不可用而已。
serial.close();
}
}
}
#define ULT_UPLOAD_FRAME_HEAD (0x53)
#define ULT_UPLOAD_FRAME_TAIL (0x54)
#define ULT_UPLOAD_FRAME_IDENT (0x52)
void MainWindow::slotReadData()
{
QByteArray read = serial->readAll();
static uint8_t identify_byte = 0;
for(int i = 0; i < read.size(); i++)
{
if (ULT_UPLOAD_FRAME_HEAD == read[i])
{
rec.clear();
rec.append(read[i]);
identify_byte = 0;
}else if (ULT_UPLOAD_FRAME_TAIL == read[i])
{
rec.append(read[i]);
// prase frame;
ult_upload_prase();
}else{
if (ULT_UPLOAD_FRAME_IDENT == read[i])
{
identify_byte = 1;
}else{
uint8_t rec_byte;
if(identify_byte)
{
identify_byte = 0;
rec_byte = ULT_UPLOAD_FRAME_IDENT ^ read[i];
}else{
rec_byte = read[i];
}
rec.append(rec_byte);
}
}
}
}
void MainWindow::slotRefresh_radar()
{
if (this->radar_map) this->radar_map->update();
// qDebug() << "solt refresh radar";
}
int MainWindow::ult_upload_prase()
{
// qDebug() << rec;
uint8_t temp8;
uint32_t index = 0, temp;
double upload_dis = 0;
temp = rec[1];
index += temp<<24;
temp = rec[2];
index += temp<<16;
temp = rec[3];
index += temp<<8;
temp = rec[4];
index += temp;
temp8 = rec[6];
((uint8_t *)&upload_dis)[7] = temp8;
temp8 = rec[7];
((uint8_t *)&upload_dis)[6] = temp8;
temp8 = rec[8];
((uint8_t *)&upload_dis)[5] = temp8;
temp8 = rec[9];
((uint8_t *)&upload_dis)[4] = temp8;
temp8 = rec[10];
((uint8_t *)&upload_dis)[3] = temp8;
temp8 = rec[11];
((uint8_t *)&upload_dis)[2] = temp8;
temp8 = rec[12];
((uint8_t *)&upload_dis)[1] = temp8;
temp8 = rec[13];
((uint8_t *)&upload_dis)[0] = temp8;
this->radar_map->set_dis_data(index, upload_dis);
emit(refresh_radar_pic_sig());
qDebug() << "index : " << index << " des : " << upload_dis;
return 0;
}
void MainWindow::on_angle_spend_textChanged(const QString &arg1)
{
if (arg1.contains(QRegExp("^\\d+$")))
{
if((0 >= ui->angle_spend->text().toInt()) || (360 <= ui->angle_spend->text().toInt()))
{
ui->angle_spend->setText("1");
}
}else
{
ui->angle_spend->setText("1");
}
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化