求帮忙看看,下面QT程序的通讯协议是怎么样的

求各位大佬帮忙看一下以下代码的通信协议是怎样的,具体流程,判断字符之类的,可以有偿!

#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;
}



上一篇:photoshop将普通照片做成电影胶片教程


下一篇:【Kubernetes】Helm包管理器