431 lines
15 KiB
C++
431 lines
15 KiB
C++
#include "widget.h"
|
||
#include "ui_widget.h"
|
||
|
||
Widget::Widget(QWidget *parent)
|
||
: QWidget(parent)
|
||
, ui(new Ui::Widget)
|
||
{
|
||
ui->setupUi(this);
|
||
|
||
// 创建一个正则表达式对象,用于匹配范围 [0, 50] 并限定为小数位后 2 位
|
||
QRegExp rx("^(?:50(?:\\.00)?|(?:[0-4]?\\d|\\d)(?:\\.\\d{1,2})?)$");
|
||
|
||
// 创建 QRegExpValidator 对象,并设置给 QLineEdit
|
||
QRegExpValidator *pReg = new QRegExpValidator(rx, this);
|
||
QLineEdit *lineEdit = ui -> Input_lineEdit;
|
||
lineEdit -> setValidator(pReg);
|
||
|
||
// 启动时刷新串口
|
||
QStringList serialNamePort;
|
||
foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
|
||
{
|
||
serialNamePort << info.portName() + "|" + info.description();
|
||
}
|
||
ui -> SerialPort_comboBox -> clear();
|
||
ui -> SerialPort_comboBox -> addItems(serialNamePort);
|
||
|
||
Serial_port = new QSerialPort(this);
|
||
}
|
||
|
||
Widget::~Widget()
|
||
{
|
||
delete ui;
|
||
}
|
||
|
||
|
||
void Widget::on_SerialPort_refresh_pushButton_clicked()
|
||
{
|
||
QStringList serialNamePort;
|
||
foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
|
||
{
|
||
serialNamePort << info.portName() + "|" + info.description();
|
||
}
|
||
ui -> SerialPort_comboBox -> clear();
|
||
ui -> SerialPort_comboBox -> addItems(serialNamePort);
|
||
}
|
||
|
||
//打开关闭按钮状态
|
||
//1将打开按钮
|
||
//0将关闭按钮
|
||
int8_t open_button_status = 1;
|
||
void Widget::on_Open_Serial_pushButton_clicked()
|
||
{
|
||
if(open_button_status == 1)
|
||
{
|
||
QSerialPort::BaudRate Baudrate = QSerialPort::Baud9600;
|
||
QSerialPort::DataBits Databits = QSerialPort::Data8;
|
||
QSerialPort::Parity Parity = QSerialPort::NoParity;
|
||
QSerialPort::StopBits Stopbits = QSerialPort::OneStop;
|
||
|
||
QComboBox *SerialPortbox = ui -> SerialPort_comboBox;
|
||
QComboBox *Baudbox = ui -> BaudRate_comboBox;
|
||
QComboBox *Databitsbox = ui -> DataBits_comboBox;
|
||
QComboBox *Checkbitsbox = ui -> CheckBits_comboBox;
|
||
QComboBox *Stopbitsbox = ui -> StopBits_comboBox;
|
||
|
||
//波特率
|
||
if(Baudbox -> currentText() == "4800"){
|
||
Baudrate = QSerialPort::Baud4800;
|
||
}
|
||
else if(Baudbox -> currentText() == "9600"){
|
||
Baudrate = QSerialPort::Baud9600;
|
||
}
|
||
else if(Baudbox -> currentText() == "19200"){
|
||
Baudrate = QSerialPort::Baud19200;
|
||
}
|
||
else if(Baudbox -> currentText() == "38400"){
|
||
Baudrate = QSerialPort::Baud38400;
|
||
}
|
||
else if(Baudbox -> currentText() == "57600"){
|
||
Baudrate = QSerialPort::Baud57600;
|
||
}
|
||
else if(Baudbox -> currentText() == "115200"){
|
||
Baudrate = QSerialPort::Baud115200;
|
||
}
|
||
else {
|
||
QMessageBox::warning(this, "错误", "波特率未设置");
|
||
return;
|
||
}
|
||
|
||
//数据位
|
||
if(Databitsbox -> currentText() == "6"){
|
||
Databits = QSerialPort::Data6;
|
||
}
|
||
else if(Databitsbox -> currentText() == "7"){
|
||
Databits = QSerialPort::Data7;
|
||
}
|
||
else if(Databitsbox -> currentText() == "8"){
|
||
Databits = QSerialPort::Data8;
|
||
}
|
||
else {
|
||
QMessageBox::warning(this, "错误", "数据位未设置");
|
||
return;
|
||
}
|
||
|
||
//校验位
|
||
if(Checkbitsbox -> currentText() == "无"){
|
||
Parity = QSerialPort::NoParity;
|
||
}
|
||
else if(Checkbitsbox -> currentText() == "奇"){
|
||
Parity = QSerialPort::OddParity;
|
||
}
|
||
else if(Checkbitsbox -> currentText() == "偶"){
|
||
Parity = QSerialPort::EvenParity;
|
||
}
|
||
else {
|
||
QMessageBox::warning(this, "错误", "校验位未设置");
|
||
return;
|
||
}
|
||
|
||
//停止位
|
||
if(Stopbitsbox -> currentText() == "1"){
|
||
Stopbits = QSerialPort::OneStop;
|
||
}
|
||
else if(Stopbitsbox -> currentText() == "1.5"){
|
||
Stopbits = QSerialPort::OneAndHalfStop;
|
||
}
|
||
else if(Stopbitsbox -> currentText() == "2"){
|
||
Stopbits = QSerialPort::TwoStop;
|
||
}
|
||
else {
|
||
QMessageBox::warning(this, "错误", "停止位未设置");
|
||
return;
|
||
}
|
||
|
||
//设置参数
|
||
Serial_port -> setPort((const QSerialPortInfo)(SerialPortbox -> currentText().section('|', 0, 0)));
|
||
Serial_port -> setBaudRate(Baudrate);
|
||
Serial_port -> setDataBits(Databits);
|
||
Serial_port -> setParity(Parity);
|
||
Serial_port -> setStopBits(Stopbits);
|
||
Serial_port -> setReadBufferSize(4096);
|
||
if(Serial_port -> open(QIODevice::ReadWrite) == true){
|
||
// 打开后将按钮变为关闭按钮,绿色指示标志
|
||
ui -> Open_Serial_pushButton -> setText("关闭串口");
|
||
ui -> serial_status_label -> setStyleSheet("QLabel { background-color :rgb(0, 144, 0); border-radius: 10px;}");
|
||
//打开串口后禁止配置
|
||
ui -> SerialPort_comboBox -> setEnabled(false);
|
||
ui -> BaudRate_comboBox -> setEnabled(false);
|
||
ui -> DataBits_comboBox -> setEnabled(false);
|
||
ui -> CheckBits_comboBox -> setEnabled(false);
|
||
ui -> StopBits_comboBox -> setEnabled(false);
|
||
ui -> SerialPort_refresh_pushButton -> setEnabled(false);
|
||
ui -> BaudRate_label -> setEnabled(false);
|
||
ui -> DataBits_label -> setEnabled(false);
|
||
ui -> CheckBits_label -> setEnabled(false);
|
||
ui -> StopBits_label -> setEnabled(false);
|
||
|
||
}
|
||
else{
|
||
QMessageBox::critical(this, "提示", "串口打开失败");
|
||
return;
|
||
}
|
||
}
|
||
else {
|
||
//将按钮变为打开按钮,红色指示标志
|
||
ui -> Open_Serial_pushButton ->setText("打开串口");
|
||
ui -> serial_status_label ->setStyleSheet("QLabel { background-color :rgb(184, 0, 0); border-radius: 10px;}");
|
||
Serial_port -> close();
|
||
//关闭串口后允许配置
|
||
ui -> SerialPort_comboBox -> setEnabled(true);
|
||
ui -> BaudRate_comboBox -> setEnabled(true);
|
||
ui -> DataBits_comboBox -> setEnabled(true);
|
||
ui -> CheckBits_comboBox -> setEnabled(true);
|
||
ui -> StopBits_comboBox -> setEnabled(true);
|
||
ui -> SerialPort_refresh_pushButton -> setEnabled(true);
|
||
ui -> BaudRate_label -> setEnabled(true);
|
||
ui -> DataBits_label -> setEnabled(true);
|
||
ui -> CheckBits_label -> setEnabled(true);
|
||
ui -> StopBits_label -> setEnabled(true);
|
||
|
||
}
|
||
open_button_status = !open_button_status;
|
||
}
|
||
|
||
void Widget::on_Hz5_BTN_clicked()
|
||
{
|
||
QByteArray Data_5Hz;
|
||
Data_5Hz.append(static_cast<char>(0x01));//地址
|
||
Data_5Hz.append(static_cast<char>(0x06));//指令
|
||
Data_5Hz.append(static_cast<char>(0x10));//功能码高
|
||
Data_5Hz.append(static_cast<char>(0x00));//功能码低
|
||
Data_5Hz.append(static_cast<char>(0x03));//数据高
|
||
Data_5Hz.append(static_cast<char>(0xE8));//数据低
|
||
Data_5Hz.append(static_cast<char>(0x8D));//校验低
|
||
Data_5Hz.append(static_cast<char>(0xB4));//校验高
|
||
Serial_port -> write(Data_5Hz);
|
||
}
|
||
|
||
void Widget::on_Hz10_BTN_clicked()
|
||
{
|
||
QByteArray Data_10Hz;
|
||
Data_10Hz.append(static_cast<char>(0x01));//地址
|
||
Data_10Hz.append(static_cast<char>(0x06));//指令
|
||
Data_10Hz.append(static_cast<char>(0x10));//功能码高
|
||
Data_10Hz.append(static_cast<char>(0x00));//功能码低
|
||
Data_10Hz.append(static_cast<char>(0x07));//数据高
|
||
Data_10Hz.append(static_cast<char>(0xD0));//数据低
|
||
uint16_t crc = ModbusCRC16(Data_10Hz);
|
||
uint8_t hi = crc;
|
||
uint8_t lo = crc >> 8;
|
||
Data_10Hz.append(hi);
|
||
Data_10Hz.append(lo);
|
||
Serial_port -> write(Data_10Hz);
|
||
}
|
||
|
||
uint16_t Widget::ModbusCRC16(QByteArray inData)
|
||
{
|
||
int len=inData.size();
|
||
uint16_t wcrc=0XFFFF;//预置16位crc寄存器,初值全部为1
|
||
uint8_t temp;//定义中间变量
|
||
int i=0,j=0;//定义计数
|
||
for(i=0;i<len;i++)//循环计算每个数据
|
||
{
|
||
temp=inData.at(i);
|
||
wcrc^=temp;
|
||
for(j=0;j<8;j++){
|
||
//判断右移出的是不是1,如果是1则与多项式进行异或。
|
||
if(wcrc&0X0001){
|
||
wcrc>>=1;//先将数据右移一位
|
||
wcrc^=0XA001;//与上面的多项式进行异或
|
||
}
|
||
else//如果不是1,则直接移出
|
||
wcrc>>=1;//直接移出
|
||
}
|
||
}
|
||
temp=wcrc;//crc的值
|
||
return wcrc;
|
||
}
|
||
|
||
|
||
void Widget::on_Hz15_BTN_clicked()
|
||
{
|
||
QByteArray Data_10Hz;
|
||
Data_10Hz.append(static_cast<char>(0x01));//地址
|
||
Data_10Hz.append(static_cast<char>(0x06));//指令
|
||
Data_10Hz.append(static_cast<char>(0x10));//功能码高
|
||
Data_10Hz.append(static_cast<char>(0x00));//功能码低
|
||
Data_10Hz.append(static_cast<char>(0x0B));//数据高
|
||
Data_10Hz.append(static_cast<char>(0xB8));//数据低
|
||
uint16_t crc = ModbusCRC16(Data_10Hz);
|
||
uint8_t hi = crc;
|
||
uint8_t lo = crc >> 8;
|
||
Data_10Hz.append(hi);
|
||
Data_10Hz.append(lo);
|
||
Serial_port -> write(Data_10Hz);
|
||
}
|
||
|
||
void Widget::on_Hz20_BTN_clicked()
|
||
{
|
||
QByteArray Data_10Hz;
|
||
Data_10Hz.append(static_cast<char>(0x01));//地址
|
||
Data_10Hz.append(static_cast<char>(0x06));//指令
|
||
Data_10Hz.append(static_cast<char>(0x10));//功能码高
|
||
Data_10Hz.append(static_cast<char>(0x00));//功能码低
|
||
Data_10Hz.append(static_cast<char>(0x0F));//数据高
|
||
Data_10Hz.append(static_cast<char>(0xA0));//数据低
|
||
uint16_t crc = ModbusCRC16(Data_10Hz);
|
||
uint8_t hi = crc;
|
||
uint8_t lo = crc >> 8;
|
||
Data_10Hz.append(hi);
|
||
Data_10Hz.append(lo);
|
||
Serial_port -> write(Data_10Hz);
|
||
}
|
||
|
||
void Widget::on_Hz25_BTN_clicked()
|
||
{
|
||
QByteArray Data_10Hz;
|
||
Data_10Hz.append(static_cast<char>(0x01));//地址
|
||
Data_10Hz.append(static_cast<char>(0x06));//指令
|
||
Data_10Hz.append(static_cast<char>(0x10));//功能码高
|
||
Data_10Hz.append(static_cast<char>(0x00));//功能码低
|
||
Data_10Hz.append(static_cast<char>(0x13));//数据高
|
||
Data_10Hz.append(static_cast<char>(0x88));//数据低
|
||
uint16_t crc = ModbusCRC16(Data_10Hz);
|
||
uint8_t hi = crc;
|
||
uint8_t lo = crc >> 8;
|
||
Data_10Hz.append(hi);
|
||
Data_10Hz.append(lo);
|
||
Serial_port -> write(Data_10Hz);
|
||
}
|
||
|
||
void Widget::on_Hz30_BTN_clicked()
|
||
{
|
||
QByteArray Data_10Hz;
|
||
Data_10Hz.append(static_cast<char>(0x01));//地址
|
||
Data_10Hz.append(static_cast<char>(0x06));//指令
|
||
Data_10Hz.append(static_cast<char>(0x10));//功能码高
|
||
Data_10Hz.append(static_cast<char>(0x00));//功能码低
|
||
Data_10Hz.append(static_cast<char>(0x17));//数据高
|
||
Data_10Hz.append(static_cast<char>(0x70));//数据低
|
||
uint16_t crc = ModbusCRC16(Data_10Hz);
|
||
uint8_t hi = crc;
|
||
uint8_t lo = crc >> 8;
|
||
Data_10Hz.append(hi);
|
||
Data_10Hz.append(lo);
|
||
Serial_port -> write(Data_10Hz);
|
||
}
|
||
|
||
void Widget::on_Hz35_BTN_clicked()
|
||
{
|
||
QByteArray Data_10Hz;
|
||
Data_10Hz.append(static_cast<char>(0x01));//地址
|
||
Data_10Hz.append(static_cast<char>(0x06));//指令
|
||
Data_10Hz.append(static_cast<char>(0x10));//功能码高
|
||
Data_10Hz.append(static_cast<char>(0x00));//功能码低
|
||
Data_10Hz.append(static_cast<char>(0x1B));//数据高
|
||
Data_10Hz.append(static_cast<char>(0x58));//数据低
|
||
uint16_t crc = ModbusCRC16(Data_10Hz);
|
||
uint8_t hi = crc;
|
||
uint8_t lo = crc >> 8;
|
||
Data_10Hz.append(hi);
|
||
Data_10Hz.append(lo);
|
||
Serial_port -> write(Data_10Hz);
|
||
}
|
||
|
||
void Widget::on_Hz40_BTN_clicked()
|
||
{
|
||
QByteArray Data_10Hz;
|
||
Data_10Hz.append(static_cast<char>(0x01));//地址
|
||
Data_10Hz.append(static_cast<char>(0x06));//指令
|
||
Data_10Hz.append(static_cast<char>(0x10));//功能码高
|
||
Data_10Hz.append(static_cast<char>(0x00));//功能码低
|
||
Data_10Hz.append(static_cast<char>(0x1F));//数据高
|
||
Data_10Hz.append(static_cast<char>(0x40));//数据低
|
||
uint16_t crc = ModbusCRC16(Data_10Hz);
|
||
uint8_t hi = crc;
|
||
uint8_t lo = crc >> 8;
|
||
Data_10Hz.append(hi);
|
||
Data_10Hz.append(lo);
|
||
Serial_port -> write(Data_10Hz);
|
||
}
|
||
|
||
void Widget::on_Hz45_BTN_clicked()
|
||
{
|
||
QByteArray Data_10Hz;
|
||
Data_10Hz.append(static_cast<char>(0x01));//地址
|
||
Data_10Hz.append(static_cast<char>(0x06));//指令
|
||
Data_10Hz.append(static_cast<char>(0x10));//功能码高
|
||
Data_10Hz.append(static_cast<char>(0x00));//功能码低
|
||
Data_10Hz.append(static_cast<char>(0x23));//数据高
|
||
Data_10Hz.append(static_cast<char>(0x28));//数据低
|
||
uint16_t crc = ModbusCRC16(Data_10Hz);
|
||
uint8_t hi = crc;
|
||
uint8_t lo = crc >> 8;
|
||
Data_10Hz.append(hi);
|
||
Data_10Hz.append(lo);
|
||
Serial_port -> write(Data_10Hz);
|
||
}
|
||
|
||
void Widget::on_Hz50_BTN_clicked()
|
||
{
|
||
QByteArray Data_10Hz;
|
||
Data_10Hz.append(static_cast<char>(0x01));//地址
|
||
Data_10Hz.append(static_cast<char>(0x06));//指令
|
||
Data_10Hz.append(static_cast<char>(0x10));//功能码高
|
||
Data_10Hz.append(static_cast<char>(0x00));//功能码低
|
||
Data_10Hz.append(static_cast<char>(0x27));//数据高
|
||
Data_10Hz.append(static_cast<char>(0x10));//数据低
|
||
uint16_t crc = ModbusCRC16(Data_10Hz);
|
||
uint8_t hi = crc;
|
||
uint8_t lo = crc >> 8;
|
||
Data_10Hz.append(hi);
|
||
Data_10Hz.append(lo);
|
||
Serial_port -> write(Data_10Hz);
|
||
}
|
||
|
||
void Widget::on_Start_BTM_clicked()
|
||
{
|
||
QByteArray Data_10Hz;
|
||
Data_10Hz.append(static_cast<char>(0x01));//地址
|
||
Data_10Hz.append(static_cast<char>(0x06));//指令
|
||
Data_10Hz.append(static_cast<char>(0x20));//功能码高
|
||
Data_10Hz.append(static_cast<char>(0x00));//功能码低
|
||
Data_10Hz.append(static_cast<char>(0x00));//数据高
|
||
Data_10Hz.append(static_cast<char>(0x01));//数据低
|
||
uint16_t crc = ModbusCRC16(Data_10Hz);
|
||
uint8_t hi = crc;
|
||
uint8_t lo = crc >> 8;
|
||
Data_10Hz.append(hi);
|
||
Data_10Hz.append(lo);
|
||
Serial_port -> write(Data_10Hz);
|
||
}
|
||
|
||
void Widget::on_Stop_BTM_clicked()
|
||
{
|
||
QByteArray Data_10Hz;
|
||
Data_10Hz.append(static_cast<char>(0x01));//地址
|
||
Data_10Hz.append(static_cast<char>(0x06));//指令
|
||
Data_10Hz.append(static_cast<char>(0x20));//功能码高
|
||
Data_10Hz.append(static_cast<char>(0x00));//功能码低
|
||
Data_10Hz.append(static_cast<char>(0x00));//数据高
|
||
Data_10Hz.append(static_cast<char>(0x06));//数据低
|
||
uint16_t crc = ModbusCRC16(Data_10Hz);
|
||
uint8_t hi = crc;
|
||
uint8_t lo = crc >> 8;
|
||
Data_10Hz.append(hi);
|
||
Data_10Hz.append(lo);
|
||
Serial_port -> write(Data_10Hz);
|
||
}
|
||
|
||
void Widget::on_set_val_BTN_clicked()
|
||
{
|
||
QString Input_Str = ui -> Input_lineEdit -> text();
|
||
uint16_t Input_Num = Input_Str.toFloat()*100;
|
||
Input_Num = Input_Num*2;
|
||
|
||
QByteArray Data_10Hz;
|
||
Data_10Hz.append(static_cast<char>(0x01));//地址
|
||
Data_10Hz.append(static_cast<char>(0x06));//指令
|
||
Data_10Hz.append(static_cast<char>(0x10));//功能码高
|
||
Data_10Hz.append(static_cast<char>(0x00));//功能码低
|
||
Data_10Hz.append(uint8_t(Input_Num >> 8));//数据高
|
||
Data_10Hz.append(uint8_t(Input_Num));//数据低
|
||
uint16_t crc = ModbusCRC16(Data_10Hz);
|
||
uint8_t hi = crc;
|
||
uint8_t lo = crc >> 8;
|
||
Data_10Hz.append(hi);
|
||
Data_10Hz.append(lo);
|
||
Serial_port -> write(Data_10Hz);
|
||
}
|