110VCGQ/485SWJ/4851/widget.cpp
2024-11-18 10:09:39 +08:00

425 lines
9.0 KiB
C++

#include "widget.h"
#include "ui_widget.h"
#include "user_lib.h"
#include "QByteArray"
#include <QString>
#include <QTextCodec>
#include<QTimer>
#include <QPainter>
#include<QGraphicsItem>
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()<<rect;
// QGraphicsLineItem *item =new QGraphicsLineItem(0,0,500,500);
// QGraphicsRectItem *item1 =new QGraphicsRectItem(QRect(0,0,20,100));
// QPen pen;
// pen.setWidth(2);
// pen.setColor(Qt::red);
// item->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<QSerialPortInfo> 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()<<b;
ui->R03ReceiveLedit->setText(QString::number(a,10));
}
for(int i =0;i<temp.count();i++)
{
string.append(QString("%1").arg(b[i],2,16,QLatin1Char('0')).toUpper());
string.append(" ");
}
string.append(" ");
string.append(QString::number(a,10));
ui->ReceiveEdit->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);
}