qt上位机,将下位机发送数据解码显示实时曲线

//widget.h

#ifndef WIDGET_H
#define WIDGET_H


#include <QWidget>
#include <QtGui>
#include <QTimer>
#include <QPushButton>
#include <QComboBox>
#include <QLabel>
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
#include <QLineEdit>
#include <QTime>
#include <QFile>


namespace Ui {
class Widget;
}


class Widget : public QWidget
{
    Q_OBJECT


public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();


protected:
    void paintEvent(QPaintEvent *);


public slots:
    void checkPort();
    void openPort();
    void readData();
    void sendData();


private:
    inline void toDigit(QString s);
    inline void getReadValue(QByteArray readBuf);
    void delay();
private:
    Ui::Widget *ui;
    QSerialPort *serialPort;
    bool readNow;
    int xPos[6][460];
    int txPos[6];
    const int wStart = 20;
    const int hStart = 20;
    const int wLength = 450;
    const int hLength = 250;
    int middle[6];
    const QColor color[6] = {
        QColor(238, 44, 44),
        QColor(125, 38, 205),
        QColor(238, 18, 137),        
        QColor(255, 106, 106),
        QColor(110, 110, 110),
        QColor(0, 0, 0)
    };
    struct{
        char zheng;
        char xiao;
        char fu;
    }code;
//    QByteArray sendBuf;
//    QByteArray readBuf;
    QTimer *updateTimer;
    QLabel *portLabel;
    QLabel *baudLabel;
    QComboBox *portComboBox;
    QComboBox *baudComboBox;
    QPushButton *openButton;
    QLineEdit *xTextEdit;
    QLineEdit *yTextEdit;
    QLabel *xLabel;
    QLabel *yLabel;
    QPushButton *sendButton;
    QLabel *degree0;
    QLabel *degreeP90;
    QLabel *degreeP180;
    QLabel *degreeN90;
    QLabel *degreeN180;
    QFile *file;
//    QTextStream textStrea;
};


#endif // WIDGET_H


//widget.cpp


#include "widget.h"

#include "ui_widget.h"
#include <QDebug>


Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    resize(700,400);


    openButton = new QPushButton("open",this);
    openButton->setGeometry(560,120,80,30);
    connect(openButton,SIGNAL(clicked()),this,SLOT(openPort()));


    portLabel = new QLabel("port:",this);
    portLabel->setGeometry(520,20,80,20);
    portLabel->setFont(QFont("Microsoft YaHei",9));


    baudLabel = new QLabel("baudrate:",this);
    baudLabel->setGeometry(520,70,80,20);
    baudLabel->setFont(QFont("Microsoft YaHei",9));


    xLabel = new QLabel("Xposition:",this);
    xLabel->setGeometry(520,220,80,20);
    xLabel->setFont(QFont("Microsoft YaHei",9));


    yLabel = new QLabel("Yposition:",this);
    yLabel->setGeometry(520,270,80,20);
    yLabel->setFont(QFont("Microsoft YaHei",9));


    xTextEdit = new QLineEdit(this);
    xTextEdit->setGeometry(600,220,80,20);


    yTextEdit = new QLineEdit(this);
    yTextEdit->setGeometry(600,270,80,20);


    sendButton = new QPushButton("send",this);
    sendButton->setGeometry(560,320,80,30);
    sendButton->setEnabled(false);
    connect(sendButton,SIGNAL(clicked()),this,SLOT(sendData()));


    portComboBox = new QComboBox(this);
    portComboBox->setGeometry(600,20,80,20);


    baudComboBox = new QComboBox(this);
    baudComboBox->setGeometry(600,70,80,20);
    baudComboBox->addItem("115200");
    baudComboBox->addItem("9600");


    degree0 = new QLabel("0",this);
    degree0->setGeometry(5,200-10,50,20);
    degreeP90 = new QLabel("90",this);
    degreeP90->setGeometry(5,200-10-90,50,20);
    degreeP180 = new QLabel("180",this);
    degreeP180->setGeometry(5,200-10-180,50,20);
    degreeN90 = new QLabel("-90",this);
    degreeN90->setGeometry(5,200-10+90,50,20);
    degreeN180 = new QLabel("-180",this);
    degreeN180->setGeometry(5,200-10+180,50,20);


    foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {
        QSerialPort serial;
        serial.setPort(info);
        if(serial.open(QIODevice::ReadWrite))
        {
           portComboBox->addItem(serial.portName());
           serial.close();
        }
    }


    updateTimer = new QTimer(this);
    updateTimer->setInterval(500);
    connect(updateTimer,SIGNAL(timeout()),this,SLOT(checkPort()));
    updateTimer->start();


    memset(xPos,0,sizeof(xPos));
    memset(txPos,0,sizeof(txPos));
    middle[0] = middle[1] = middle[2] = middle[3] = middle[4] = middle[5] = 200;
    code.zheng = 0;
    code.fu = 0;
    code.xiao = 0;
    readNow = false;
}


Widget::~Widget()
{
    delete ui;
}


void Widget::paintEvent(QPaintEvent *)
{
    QPainter painter(this);


    painter.setPen(QColor(1, 1, 1));
    painter.setBrush(QColor(45, 204, 112));
    painter.drawRect(0,0,500,400);
    painter.setBrush(Qt::NoBrush);


    for(int k = 0; k < 6; k++){
        painter.setPen(color[k]);
        int prePos = txPos[k]+1;
        for(int i = wStart;i < wLength+wStart; ++i){
            painter.drawLine(i,middle[k]-xPos[k][prePos],i+1,middle[k]-xPos[k][prePos+1]);
            if(++prePos > wLength){
                prePos = 0;
            }
        }
    }
}


void Widget::checkPort()
{
    readNow = false;
    portComboBox->clear();
    foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {
        QSerialPort serial;
        serial.setPort(info);
        if(serial.open(QIODevice::ReadWrite))
        {
           portComboBox->addItem(serial.portName());
           serial.close();
        }
    }
}


void Widget::openPort()
{
    if(openButton->text() == "open"){
        QDateTime time = QDateTime::currentDateTime();
        QString str = time.toString("yyyyddhhmmss");
        QString fileName = "zb" + str + ".txt";
        file = new QFile(fileName);
        file->open(QIODevice::WriteOnly | QIODevice::Text);
        serialPort = new QSerialPort;
        serialPort->setPortName(portComboBox->currentText());
        serialPort->open(QIODevice::ReadWrite);
        serialPort->setBaudRate(baudComboBox->currentText().toInt());
        serialPort->setFlowControl(QSerialPort::NoFlowControl);


        QObject::connect(serialPort,&QSerialPort::readyRead,this,&Widget::readData);
//        qDebug()<<"hello";
        updateTimer->stop();
        openButton->setText("close");
        sendButton->setEnabled(true);
    }else{
        serialPort->clear();
        serialPort->close();
        serialPort->deleteLater();
        updateTimer->start();
        openButton->setText("open");
        sendButton->setEnabled(false);
        file->close();
    }
}


void Widget::readData()
{
    QByteArray readBuf;
    readBuf.clear();
    readBuf = serialPort->readAll();
    if(!readNow)
        getReadValue(readBuf);
}


void Widget::sendData()
{
    if(!xTextEdit->text().isEmpty() && !yTextEdit->text().isEmpty()){
        QByteArray sendBuf;
        sendBuf.clear();
        sendBuf.append((char)0xc1);
        delay();
        serialPort->write(sendBuf);
        QString s = xTextEdit->text();    
        code.zheng = 0;
        code.fu = 0;
        code.xiao = 0;
        toDigit(s);
        sendBuf.clear();
        sendBuf.append(code.zheng);
        delay();
        serialPort->write(sendBuf);
        sendBuf.clear();
        sendBuf.append(code.xiao);
        delay();
        serialPort->write(sendBuf);
        sendBuf.clear();
        sendBuf.append(code.fu);
        delay();
        serialPort->write(sendBuf);


        s = yTextEdit->text();
        code.zheng = 0;
        code.fu = 0;
        code.xiao = 0;
        toDigit(s);
        sendBuf.clear();
        sendBuf.append(code.zheng);
        delay();
        serialPort->write(sendBuf);
        sendBuf.clear();
        sendBuf.append(code.xiao);
//        qDebug("%d",sendBuf.at(0));
        delay();
        serialPort->write(sendBuf);
        sendBuf.clear();
        sendBuf.append(code.fu);
        delay();
        serialPort->write(sendBuf);


        sendBuf.clear();
        sendBuf.append((char)0xc2);
        delay();
        serialPort->write(sendBuf);
//        qDebug()<<"hh";
//        for(int i = 0; i < 8; i++){
//            delay();
//            serialPort->write(sendBuf);
//        }
    }
}


void Widget::toDigit(QString s)
{
    int length = s.size();
    int begin = s[0] == '-' ? 1 : 0;
    int pos = 0;
    for(;pos<length;pos++){
        if(s[pos] == '.')
            break;
    }
    QString ss=s.mid(begin,pos-begin);
    int shi = ss.toInt();
    code.zheng = shi;
    ss.clear();
    ss = s.mid(pos+1);
    int ge = ss.toInt();
    code.xiao = ge;
    if(begin){
        code.fu = 1;
    }else{
        code.fu = 0;
    }
}


void Widget::getReadValue(QByteArray readBuf)
{
    if(!readNow){
        QTextStream ts(file);
        ts.seek(file->size());
        readNow = true;
        int readarry[150];
        int length = readBuf.size();
        for(int i = 0; i < length; i++){
            readarry[i] = readBuf.at(i) & 0xff;
        }
        int pos = 0,pos1=0;
        while (readarry[pos++] != 0xc1 && pos < 100) {
        }
//        qDebug()<<readarry[pos-1];
        pos1=pos;
        while (readarry[pos1++] != 0xc2) {
            if((pos1 - pos) > 20){
                readNow = false;
                return;
            }
        }
        for(int i = 0; i < (pos1-pos-1)/3; i++){
           int value = readarry[pos+i*3];
           double dec;
           double wdec;
           dec = readarry[pos+i*3+1];
           while(dec >= 1){
               dec /= 10;
           }
           wdec = dec;
           wdec += value;
           if(dec > 0.5) {
               ++value;
           }           
           if(readarry[pos+i*3+2] == 1){
               value = -value;
               wdec = -wdec;
           }
           if(++txPos[i] > wLength) txPos[i] = 0;
           xPos[i][txPos[i]] = value;
//           qDebug()<<value;
           if(i == (pos1-pos-1)/3-1)
               ts<<wdec<<'\n';
           else
               ts<<wdec<<'\t';
//           qDebug()<<wdec;
        }
//        ts.seek(file->size());
        update();
        readNow = false;
    }
}


void Widget::delay()
{
    QTime reachtime = QTime::currentTime().addMSecs(1);
    while(QTime::currentTime() < reachtime);
}

猜你喜欢

转载自blog.csdn.net/qq_34359028/article/details/78477148