求各位大佬帮忙看一下以下代码的通信协议是怎样的,具体流程,判断字符之类的,可以有偿! #include "serial.h"
#include "ui_serial.h"
serial::serial(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::serial) //ui代码
{
ui->setupUi(this);
setWindowTitle("串口助手"); //mainwindow窗口名称
m_serial = new QSerialPort; //串口配置
timer = new QTimer;
m_chart = new QChart; //基于spritejs封装的图表库
m_chartView = new QChartView; //引入新的画布
m_axis_x = new QValueAxis; //引入坐标设置,下同
m_axis_y = new QValueAxis;
m_series = new QSplineSeries; //引入平滑曲线
system_init();
}
void serial::system_init()
{
//*********************图表配置************************//
m_chart = m_chartView->chart(); //关联画布和画笔
m_chart->legend()->hide(); //隐藏图例
m_chartView->setRenderHint(QPainter::Antialiasing); //设置抗锯齿,使曲线更平滑
m_chart->setTheme(QChart::ChartThemeQt); //设置图表风格
m_chart->setTitle("实物重量曲线图"); //设置图表标题
m_chart->addSeries(m_series); //把线条添加到chart中
ui->show_chart->setChart(m_chart); //将图表与控件绑定,显示于图表窗口
//**********************坐标设置***********************//
m_axis_x->setRange(0, 100); //设置横坐标范围
m_axis_x->setTitleText(" Times"); //横坐标标题
m_axis_y->setRange(0, 100); //设置纵坐标范围
m_axis_y->setTitleText("Weight(g)"); //纵坐标标题
m_chart->addAxis(m_axis_x, Qt::AlignBottom); //横坐标居于chart下方
m_chart->addAxis(m_axis_y, Qt::AlignLeft); //纵坐标居于chart左方
m_series->attachAxis(m_axis_x); //系列(即数据)与坐标轴关联
m_series->attachAxis(m_axis_y); //系列(即数据)与坐标轴关联
//***connect(信号发出者地址,发出什么信号,在哪个类出发(地址),槽函数)***//
connect(timer, &QTimer::timeout, this, &serial::search_port); //实时检测串口
timer->start(1000); //每一秒更新一次
connect(ui->oc_port, SIGNAL(toggled(bool)), this, SLOT(open_port())); //打开串口信号连接
connect(ui->send, &QPushButton::clicked, this, &serial::send_data); //跳转到发送信号连接函数
connect(ui->clear_receive, &QPushButton::clicked, this, &serial::clear_Rdata);//跳转到清除接受数据函数
connect(ui->clear_send, &QPushButton::clicked, this, &serial::clear_Sdata); //跳转到清除发送数据函数
connect(ui->chart_clear, &QPushButton::clicked, this, &serial::clear_chart); //跳转到清除图标函数
}
void serial::search_port() //查找串口
{
ui->port_name->clear();
foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) //查找串口语句
{
ui->port_name->addItem(info.portName()); //获取串口列表
}
}
void serial::open_port() //打开串口
{
//**********************设置串口参数****************************//
m_serial->setPortName(ui->port_name->currentText()); //设置串口名
m_serial->setBaudRate(QSerialPort::Baud9600); //设置波特率固定为9600
m_serial->setParity(QSerialPort::NoParity); //设置为(无)奇偶校验位
m_serial->setDataBits(QSerialPort::Data8); //设置数据位固定为8
m_serial->setStopBits(QSerialPort::OneStop); //设置停止位固定位1
m_serial->setFlowControl(QSerialPort::NoFlowControl); //非流控制
//********************判断是否选中oc_port***********************//
if(ui->oc_port->isChecked()) //打开串口
{
if(m_serial->open(QIODevice::ReadWrite)) //打开成功则接收数据
{
qDebug()<< "Success to open serial port"; //自定义报文回复
ui->port_status->setStyleSheet("color:green"); //状态文字转换成绿色
ui->port_status->setText("连接成功"); //状态转换成connected
ui->oc_port->setText("关闭串口"); //打开串口转变成关闭串口
connect(m_serial, &QSerialPort::readyRead, this, &serial::receive_data); //跳转
}
else
{
qDebug()<< "Fail to open serial port"; //自定义报文回复
ui->port_status->setStyleSheet("color:blue"); //状态文字转换成蓝色,下同
ui->port_status->setText("连接失败");
}
}
else //关闭串口
{
ui->oc_port->setText("打开串口");
ui->port_status->setStyleSheet("color:red");
ui->port_status->setText("未连接");
m_serial->close();
}
}
void serial::receive_data() //接收数据
{
QByteArray buffer; //提供了一个[字节]数组,储存数据
QString receive; //
QRegExp rx("(\\d+)"); //(\\d+)显示连续数字 // 匹配数字
int pos = 0;
int weight; //存放重量值,作为纵坐标
buffer = m_serial->readAll(); //获取串口中的数据,并存放于buffer
receive = QString(buffer);
count++;
pos = rx.indexIn(receive); //获取重量值,并调整坐标轴范围
if(pos>-1)
{
weight = rx.cap(0).toInt(); //获取接受数据的最新数据
if(Mweight<weight) //调整纵坐标最大值
{
Mweight = weight;
m_axis_y->setRange(0, Mweight+50);
}
if(count>100) //调整横坐标初始值
{
m_axis_x->setRange(0, count);
}
m_series->append(count, weight);
}
if(!buffer.isEmpty()) //将下位机数据显示出来
{
QString str = QString::fromLocal8Bit(buffer); //调整输出buffer的大小
QString current_date = " ------";
if(ui->check_hex->isChecked()) //转换成16进制
{
QString hex_data = buffer.toHex().data();
hex_data = hex_data.toUpper();
QString hex_str;
for(int i=0; i<hex_data.length(); i+=2) //将16进制转换成大写
{
QString st = hex_data.mid(i,2);
hex_str += st;
hex_str += ' ';
}
ui->r_data->append(hex_str);
}
else
{
ui->r_data->append(str);
}
}
buffer.clear();
}
void serial::send_data()
{
if(m_serial->isOpen())
{
QString current_data = ui->s_data->toPlainText(); //发送toPlainText中文本发送
current_data.append("\r\n"); //添加换行符
QByteArray SD = current_data.toLatin1();
m_serial->write(SD);
}
}
void serial::clear_Rdata() //清除接收的数据
{
ui->r_data->clear();
}
void serial::clear_Sdata() //清除发送的数据
{
ui->s_data->clear();
}
void serial::clear_chart() //清除图像
{
m_axis_y->setRange(0, 100);
m_axis_x->setRange(0, 100);
m_series->clear();
count = 0;
}
serial::~serial()
{
delete ui;
}