#include "widget.h" #include "ui_widget.h" #include "user_lib.h" #include "QByteArray" #include #include #include #include #include Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); timer1 = new QTimer(this); timer1->stop(); timer1->setInterval(250); x = -250; connect(timer1,&QTimer::timeout,this,&Widget::on_R03Sendbtn_clicked); connect(&mSerialPort,&QSerialPort::readyRead,this,&Widget::on_SerialPort_readyRead); QRect rect (ui->graphicsView->rect()); scene = new QGraphicsScene(x,-2000,500,4000); ui->graphicsView->setScene(scene); // qDebug()<setPen(pen); // item1->setPen(pen); //// scene->addItem(item); // scene->addItem(item1); //// ui->graphicsView->setSceneRect(150,0,50,50); ui->graphicsView->setPalette(QPalette(Qt::black)); // ui->graphicsView->setAutoFillBackground(true); } Widget::~Widget() { delete ui; } void Widget::on_saveButton_clicked() { //打开串口键刷新串口列表 ui->cboxSerialPort->clear(); QList serialPortInfo = QSerialPortInfo::availablePorts(); int count=serialPortInfo.count(); for(int i = 0; i < count; i++) { ui->cboxSerialPort->addItem( serialPortInfo.at(i).portName()+serialPortInfo.at(i).description().mid(0,4)); } } void Widget::on_rbtnOpen_clicked(bool checked) { //打开串口 if(true == checked) { if(true == getSerialPortConfig()) { ui->rbtnOpen->setText("关闭串口"); ui->cboxSerialPort->setEnabled(false); ui->cboxBaudrate->setEnabled(false); ui->cboxDataBites->setEnabled(false); ui->cboxParity->setEnabled(false); ui->cboxStop->setEnabled(false); } else { ui->rbtnOpen->setChecked(false); QMessageBox::information(this,"提示","串口不存在或串口被占用"); } } //关闭串口 if(false == checked) { mSerialPort.close(); ui->rbtnOpen->setText("打开串口"); ui->cboxSerialPort->setEnabled(true); ui->cboxBaudrate->setEnabled(true); ui->cboxDataBites->setEnabled(true); ui->cboxParity->setEnabled(true); ui->cboxStop->setEnabled(true); } } //设置串口 bool Widget::getSerialPortConfig() { //获取串口配置 mPortName=ui->cboxSerialPort->currentText(); mBaudRate=ui->cboxBaudrate->currentText(); mParity=ui->cboxParity->currentText(); mDataBits=ui->cboxDataBites->currentText(); mStopBits=ui->cboxStop->currentText(); //设置串口 //波特率 if(mPortName.isEmpty()) { return false; } if(mPortName[4]>='0' && mPortName[4] <= '9') { mSerialPort.setPortName(mPortName.mid(0,5)); } else { mSerialPort.setPortName(mPortName.mid(0,4)); } if("9600" == mBaudRate) { mSerialPort.setBaudRate(QSerialPort::Baud9600); } else if("19200" == mBaudRate) { mSerialPort.setBaudRate(QSerialPort::Baud19200); } else { mSerialPort.setBaudRate(QSerialPort::Baud115200); } //校验位 if("Even" == mParity) { mSerialPort.setParity(QSerialPort::EvenParity); } else if("Odd" == mParity) { mSerialPort.setParity(QSerialPort::OddParity); } else { mSerialPort.setParity(QSerialPort::NoParity); } //数据位 if("5" == mDataBits) { mSerialPort.setDataBits(QSerialPort::Data5); } else if("6" == mDataBits) { mSerialPort.setDataBits(QSerialPort::Data6); } else if("7" == mDataBits) { mSerialPort.setDataBits(QSerialPort::Data7); } else { mSerialPort.setDataBits(QSerialPort::Data8); } //停止位 if("1.5" == mStopBits) { mSerialPort.setStopBits(QSerialPort::OneAndHalfStop); } else if("2" == mStopBits) { mSerialPort.setStopBits(QSerialPort::TwoStop); } else { mSerialPort.setStopBits(QSerialPort::OneStop); } return mSerialPort.open(QSerialPort::ReadWrite); } void Widget::paintEvent(QPaintEvent *event) { // QPainter painter(ui->graphicsView); // QPen pen; // pen.setStyle(Qt::SolidLine); // pen.setWidth(5); // pen.setColor(Qt::red); // painter.setPen(pen); // painter.drawLine(0,0,2000,1000); } void Widget::on_R03Sendbtn_clicked() { bool ok; QString byte; uint16_t crc; uint8_t b[8]; b[0]=ui->R03addrLedit->text().toUInt(&ok,16); b[1]=0x03; b[2]=0x00; b[3]=ui->R03RegaddrLedit->text().toUInt(&ok,16); b[4]=0x00; b[5]=ui->R03RegcounLedit->text().toUInt(&ok,16); crc= CRC16_Modbus(b,6); b[6] =crc>>8; b[7] = crc&0x00FF; for(int i=0;i<8;i++) { byte.append(QString("%1").arg(b[i],2,16,QLatin1Char('0')).toUpper()); byte.append(" "); } ui->SendEdit->append(byte); mSerialPort.write((const char*)(b),8); } void Widget::on_SerialPort_readyRead() { QByteArray temp=mSerialPort.readAll(); QString string; int16_t a = 0; static int16_t last_data = 0; uint8_t *b= (uint8_t*)temp.data(); if(temp[1] == 0x03) { a =(b[3]<<8)|b[4]; // qDebug()<R03ReceiveLedit->setText(QString::number(a,10)); } for(int i =0;iReceiveEdit->append(string); //画图 static QPoint point1(0,0); static uint8_t current = 0; QPoint point2(point1.x()+3,-a/2); static QGraphicsLineItem item[100]; scene->removeItem(&item[current]); item[current].setLine(QLine(point1,point2)); point1 = point2; QPen pen; pen.setWidth(3); pen.setColor(Qt::red); item[current].setPen(pen); scene->addItem(&item[current]); QRectF rect =ui->graphicsView->sceneRect().toRect(); x = x+3; ui->graphicsView->setSceneRect(x,-2000,500,4000); current++; if(current>=100)current =0; // QTextCodec *tc = QTextCodec::codecForName("GBK"); // QString str = tc->toUnicode(temp); // if(!str.isEmpty()) // { // ui->ReceiveEdit->append(str); // } } void Widget::on_ClearSendbtn_clicked() { ui->SendEdit->clear(); } void Widget::on_ClearReceivebtn_clicked() { ui->ReceiveEdit->clear(); } void Widget::on_R06Sendbtn_clicked() { bool ok; QString byte; uint16_t crc; uint8_t b[8]; b[0]=ui->R06addrLedit->text().toUInt(&ok,16); b[1]=0x06; b[2]=0x00; b[3]=ui->R06RegaddrLedit->text().toUInt(&ok,16); b[4]=0x00; b[5]= ui->Currentcbox->currentIndex()+1; ui->Currentcbox->setCurrentIndex(b[5]); if(b[5]+1>=ui->Targetcbox->currentIndex()+2) { ui->Currentcbox->setCurrentIndex(0); } ui->R06RegcounLedit->setText(QString::number(ui->Currentcbox->currentIndex()+1,10)); crc= CRC16_Modbus(b,6); b[6] =crc>>8; b[7] = crc&0x00FF; for(int i=0;i<8;i++) { byte.append(QString("%1").arg(b[i],2,16,QLatin1Char('0')).toUpper()); byte.append(" "); } ui->SendEdit->append(byte); mSerialPort.write((const char*)(b),8); } void Widget::on_Currentcbox_currentIndexChanged(int index) { ui->R06RegcounLedit->setText(QString::number(index+1,10)); } void Widget::on_Resetaddrbtn_clicked() { bool ok; QString byte; uint16_t crc; uint8_t b[8]; b[0]=0x00; b[1]=0x06; b[2]=0x00; b[3]=ui->R06RegaddrLedit->text().toUInt(&ok,16); b[4]=0x00; b[5]=0x01; crc= CRC16_Modbus(b,6); b[6] =crc>>8; b[7] = crc&0x00FF; for(int i=0;i<8;i++) { byte.append(QString("%1").arg(b[i],2,16,QLatin1Char('0')).toUpper()); byte.append(" "); } ui->SendEdit->append(byte); mSerialPort.write((const char*)(b),8); } void Widget::on_R03adbtn_clicked() { uint8_t b; bool ok; b=ui->R03addrLedit->text().toUInt(&ok,16); b=b+1; ui->R03addrLedit->setText("0x0"+QString::number(b,16)); } void Widget::on_R03reset_clicked() { ui->R03addrLedit->setText("0x01"); } void Widget::on_autobtn_clicked() { static bool autosend_flag = false; autosend_flag = !autosend_flag; if(autosend_flag == true) { timer1->start(); ui->autobtn->setText("停止"); } else { timer1->stop(); ui->autobtn->setText("自动"); } } void Widget::on_spinBox_valueChanged(int arg1) { if(arg1 != 0) timer1->setInterval(arg1); else timer1->setInterval(250); }