QT-HSDConfig/widget.cpp

431 lines
15 KiB
C++
Raw Permalink Normal View History

2024-11-29 09:25:17 +00:00
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
2024-11-29 10:23:27 +00:00
2024-11-29 15:23:05 +00:00
// 创建一个正则表达式对象,用于匹配范围 [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);
2024-11-29 10:23:27 +00:00
// 启动时刷新串口
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);
2024-11-29 09:25:17 +00:00
}
Widget::~Widget()
{
delete ui;
}
2024-11-29 10:23:27 +00:00
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;
}
2024-11-29 15:23:05 +00:00
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));//数据低
2024-11-29 15:23:05 +00:00
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;
2024-11-29 15:23:05 +00:00
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));//数据低
2024-11-29 15:23:05 +00:00
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);
}