425 lines
9.0 KiB
C++
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);
|
|
}
|
|
|