QT-HSDConfig/widget.cpp

431 lines
15 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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);
}