#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(0x01));//地址 Data_5Hz.append(static_cast(0x06));//指令 Data_5Hz.append(static_cast(0x10));//功能码高 Data_5Hz.append(static_cast(0x00));//功能码低 Data_5Hz.append(static_cast(0x03));//数据高 Data_5Hz.append(static_cast(0xE8));//数据低 Data_5Hz.append(static_cast(0x8D));//校验低 Data_5Hz.append(static_cast(0xB4));//校验高 Serial_port -> write(Data_5Hz); } void Widget::on_Hz10_BTN_clicked() { QByteArray Data_10Hz; Data_10Hz.append(static_cast(0x01));//地址 Data_10Hz.append(static_cast(0x06));//指令 Data_10Hz.append(static_cast(0x10));//功能码高 Data_10Hz.append(static_cast(0x00));//功能码低 Data_10Hz.append(static_cast(0x07));//数据高 Data_10Hz.append(static_cast(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>=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(0x01));//地址 Data_10Hz.append(static_cast(0x06));//指令 Data_10Hz.append(static_cast(0x10));//功能码高 Data_10Hz.append(static_cast(0x00));//功能码低 Data_10Hz.append(static_cast(0x0B));//数据高 Data_10Hz.append(static_cast(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(0x01));//地址 Data_10Hz.append(static_cast(0x06));//指令 Data_10Hz.append(static_cast(0x10));//功能码高 Data_10Hz.append(static_cast(0x00));//功能码低 Data_10Hz.append(static_cast(0x0F));//数据高 Data_10Hz.append(static_cast(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(0x01));//地址 Data_10Hz.append(static_cast(0x06));//指令 Data_10Hz.append(static_cast(0x10));//功能码高 Data_10Hz.append(static_cast(0x00));//功能码低 Data_10Hz.append(static_cast(0x13));//数据高 Data_10Hz.append(static_cast(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(0x01));//地址 Data_10Hz.append(static_cast(0x06));//指令 Data_10Hz.append(static_cast(0x10));//功能码高 Data_10Hz.append(static_cast(0x00));//功能码低 Data_10Hz.append(static_cast(0x17));//数据高 Data_10Hz.append(static_cast(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(0x01));//地址 Data_10Hz.append(static_cast(0x06));//指令 Data_10Hz.append(static_cast(0x10));//功能码高 Data_10Hz.append(static_cast(0x00));//功能码低 Data_10Hz.append(static_cast(0x1B));//数据高 Data_10Hz.append(static_cast(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(0x01));//地址 Data_10Hz.append(static_cast(0x06));//指令 Data_10Hz.append(static_cast(0x10));//功能码高 Data_10Hz.append(static_cast(0x00));//功能码低 Data_10Hz.append(static_cast(0x1F));//数据高 Data_10Hz.append(static_cast(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(0x01));//地址 Data_10Hz.append(static_cast(0x06));//指令 Data_10Hz.append(static_cast(0x10));//功能码高 Data_10Hz.append(static_cast(0x00));//功能码低 Data_10Hz.append(static_cast(0x23));//数据高 Data_10Hz.append(static_cast(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(0x01));//地址 Data_10Hz.append(static_cast(0x06));//指令 Data_10Hz.append(static_cast(0x10));//功能码高 Data_10Hz.append(static_cast(0x00));//功能码低 Data_10Hz.append(static_cast(0x27));//数据高 Data_10Hz.append(static_cast(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(0x01));//地址 Data_10Hz.append(static_cast(0x06));//指令 Data_10Hz.append(static_cast(0x20));//功能码高 Data_10Hz.append(static_cast(0x00));//功能码低 Data_10Hz.append(static_cast(0x00));//数据高 Data_10Hz.append(static_cast(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(0x01));//地址 Data_10Hz.append(static_cast(0x06));//指令 Data_10Hz.append(static_cast(0x20));//功能码高 Data_10Hz.append(static_cast(0x00));//功能码低 Data_10Hz.append(static_cast(0x00));//数据高 Data_10Hz.append(static_cast(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(0x01));//地址 Data_10Hz.append(static_cast(0x06));//指令 Data_10Hz.append(static_cast(0x10));//功能码高 Data_10Hz.append(static_cast(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); }