QT_micro_climate_config/widget.cpp

861 lines
30 KiB
C++

#include "widget.h"
#include "ui_widget.h"
#define UART_WAIT_MS 50
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 启动时关闭按钮
disable__();
// 限制输入范围
QLineEdit *edit_1R5 = ui -> write_1R5_lineEdit;
QLineEdit *edit_4R5 = ui -> write_4R5_lineEdit;
QLineEdit *edit_8R0 = ui -> write_8R0_lineEdit;
QLineEdit *rssi = ui -> write_lineEdit;
QLineEdit *coefficient = ui -> write_Coefficient_lineEdit;
QLineEdit *edit_ns = ui -> write_distance_NS_lineEdit;
QLineEdit *edit_we = ui -> write_distance_WE_lineEdit;
// 创建正则表达式对象
QRegExp rx_0_100("^([0-9]|[1-9][0-9]|100)$");
QRegExp rx_x_xxxx("^([0-9])(\\.\\d{4})$");
QRegExp rx__xx("^\\d+\\.\\d{2}$");
// 创建 QRegExpValidator 对象
QRegExpValidator *pReg_0_100 = new QRegExpValidator(rx_0_100, this);
QRegExpValidator *pReg_x_xxxx = new QRegExpValidator(rx_x_xxxx, this);
QRegExpValidator *pReg__xx = new QRegExpValidator(rx__xx, this);
edit_1R5->setValidator(pReg_0_100);
edit_4R5->setValidator(pReg_0_100);
edit_8R0->setValidator(pReg_0_100);
rssi->setValidator(pReg_0_100);
coefficient->setValidator(pReg_x_xxxx);
edit_ns->setValidator(pReg__xx);
edit_we->setValidator(pReg__xx);
error1_status_label[0] = ui -> error1_status_label;
error1_status_label[1] = ui -> error2_status_label;
error1_status_label[2] = ui -> error3_status_label;
error1_status_label[3] = ui -> error4_status_label;
error1_status_label[4] = ui -> error5_status_label;
error1_status_label[5] = ui -> error6_status_label;
error1_status_label[6] = ui -> error7_status_label;
error1_status_label[7] = ui -> error8_status_label;
error1_status_label[8] = ui -> error9_status_label;
error1_status_label[9] = ui -> error10_status_label;
error1_status_label[10] = ui -> error11_status_label;
error1_status_label[11] = ui -> error12_status_label;
error1_status_label[12] = ui -> error13_status_label;
error1_status_label[13] = ui -> error14_status_label;
error1_status_label[14] = ui -> error15_status_label;
error1_status_label[15] = ui -> error16_status_label;
// 启动时刷新串口
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::closeEvent(QCloseEvent *event)
{
// 退出提醒弹窗
QMessageBox *Close_msgBox = new QMessageBox(QMessageBox::Question, "提示", "是否退出", QMessageBox::Yes | QMessageBox::No, this, Qt::WindowStaysOnTopHint);
Close_msgBox -> setDefaultButton(QMessageBox::No);
Close_msgBox -> button(QMessageBox::No) -> setText(u8"不退出");
Close_msgBox -> button(QMessageBox::Yes) -> setText(u8"退出");
int val = Close_msgBox -> exec();
if(val == QMessageBox::No)
{
event -> ignore();
}
if(val == QMessageBox::Yes)
{
event -> accept();
}
}
void Widget::disable__()
{
ui->groupBox->setEnabled(false);
ui->groupBox_2->setEnabled(false);
ui->groupBox_3->setEnabled(false);
// 未打开串口时不让开加密页面
ui->main_tabWidget->setTabEnabled(1, false);
ui->Password_lineEdit->setEnabled(false);
ui->ID_lineEdit->setEnabled(false);
ui->label_10->setEnabled(false);
ui->label_11->setEnabled(false);
ui->Trans_password_pushButton->setEnabled(false);
}
void Widget::able__()
{
ui->groupBox->setEnabled(true);
ui->groupBox_2->setEnabled(true);
ui->groupBox_3->setEnabled(true);
// 未打开串口时不让开加密页面
ui->main_tabWidget->setTabEnabled(1, true);
}
uint16_t Widget::modbusCrc16(const uint8_t *data, const int len)
{
uint16_t crc = 0xFFFF;
for (int pos = 0; pos < len; pos++) {
crc ^= *data++;
for (int i = 0; i < 8; i++) {
if ((crc & 0x0001) > 0)
crc = (crc >> 1) ^ 0xA001;
else
crc = crc >> 1;
}
}
return (crc<<8&0xFF00)|(crc>>8&0x00FF);
}
//串口刷新
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);
// 串口打开后使能功能
able__();
open_button_status = !open_button_status;
}
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);
// 串口关闭后取消使能功能
disable__();
open_button_status = !open_button_status;
}
}
//读取按钮
void Widget::on_get_data_pushButton_clicked()
{
QByteArray sent_comand;
sent_comand.append(static_cast<uint8_t>(0x30));
sent_comand.append(static_cast<uint8_t>(0x03));
sent_comand.append(static_cast<uint8_t>(0x00));
sent_comand.append(static_cast<uint8_t>(0x1E));
sent_comand.append(static_cast<uint8_t>(0x00));
sent_comand.append(static_cast<uint8_t>(0x0A));
uint8_t sent_comand_u8[sent_comand.length()];
for(int i = 0; i < sent_comand.length(); i++)
{
sent_comand_u8[i] = sent_comand[i];
}
uint16_t crc_16_val = modbusCrc16(sent_comand_u8, sent_comand.length());
sent_comand.append(crc_16_val >> 8);
sent_comand.append(crc_16_val);
Serial_port->write(sent_comand);
//连接信号与槽
//断开所有其他的信号与槽连接
disconnect(Serial_port, &QSerialPort::readyRead, nullptr, nullptr);
connect(Serial_port, SIGNAL(readyRead()), this, SLOT(get_configdata()), Qt::UniqueConnection);
}
std::array<bool, 16> getBits(unsigned short num) {
std::array<bool, 16> bits;
for (int i = 15; i >= 0; --i) {
bits[15 - i] = ((num >> i) & 1);
}
return bits;
}
void Widget::get_configdata()
{
// 接收数据,一会再接收,以便接收超长数据
QByteArray readed_data;
while(Serial_port->waitForReadyRead(UART_WAIT_MS)==true);
readed_data.append(Serial_port -> readAll());
//防止干扰
while(readed_data.length() > 1)
{
qDebug() << readed_data.length();
qDebug() << readed_data;
if(readed_data[0] != static_cast<char>(0x30) || readed_data[1] != static_cast<char>(0x03))
{
readed_data.remove(0, 1);
}
else
break;
}
uint8_t read_comand_u8[readed_data.length()];
for(int i = 0; i < readed_data.length(); i++)
{
read_comand_u8[i] = readed_data[i];
}
if(readed_data.length() >= 25)
if(modbusCrc16(read_comand_u8, 23) >> 8 == read_comand_u8[23] && (modbusCrc16(read_comand_u8, 23) & 0x00FF) == read_comand_u8[24])
{
qDebug() << "CRC16校验成功";
uint16_t config_1R5 = read_comand_u8[3] << 8 | read_comand_u8[4];
uint16_t config_4R5 = read_comand_u8[5] << 8 | read_comand_u8[6];
uint16_t config_8R0 = read_comand_u8[7] << 8 | read_comand_u8[8];
uint16_t rssi = read_comand_u8[9] << 8 | read_comand_u8[10];
uint16_t coefficient = read_comand_u8[11] <<8 | read_comand_u8[12];
uint16_t ns_distance = read_comand_u8[13] << 8 | read_comand_u8[14];
uint16_t we_distance = read_comand_u8[15] << 8 | read_comand_u8[16];
uint16_t errorlog = read_comand_u8[17] << 8 | read_comand_u8[18];
uint16_t ns_c = read_comand_u8[19] << 8 | read_comand_u8[20];
uint16_t we_c = read_comand_u8[21] << 8 | read_comand_u8[22];
qDebug() << "config_1R5:" << config_1R5;
qDebug() << "config_4R5:" << config_4R5;
qDebug() << "config_8R0:" << config_8R0;
qDebug() << "rssi:" << rssi;
qDebug() << "coefficient:" << coefficient;
qDebug() << "ns_distance:" << ns_distance;
qDebug() << "we_distance:" << we_distance;
qDebug() << "errorlog:" << errorlog;
qDebug() << "ns_c:" << ns_c;
qDebug() << "we_c:" << we_c;
ui -> config_1R5_lineEdit -> setText(QString::number(config_1R5));
ui -> config_4R5_lineEdit -> setText(QString::number(config_4R5));
ui -> config_8R0_lineEdit -> setText(QString::number(config_8R0));
ui -> RSSI_lineEdit -> setText(QString::number((float)rssi/100.0));
ui -> Coefficient_lineEdit ->setText(QString::number((float)coefficient/10000.0));
ui -> distance_NS_lineEdit -> setText(QString::number((float)ns_distance/500.0) + "mm");
ui -> distance_WE_lineEdit -> setText(QString::number((float)we_distance/500.0) + "mm");
ui -> c_NS_lineEdit -> setText(QString::number((float)ns_c/10.0) + "m/s");
ui -> c_WE_lineEdit -> setText(QString::number((float)we_c/10.0) + "m/s");
std::array<bool, 16> bits = getBits(errorlog);
for (int i = 15; i >= 0; --i)
{
qDebug() << bits[i];
bits[i] ? error1_status_label[15 - i] -> setStyleSheet("QLabel { background-color :rgb(184, 0, 0); border-radius: 10px;}") \
: error1_status_label[15 - i] -> setStyleSheet("QLabel { background-color :rgb(0, 144, 0); border-radius: 10px;}");
}
}
disconnect(Serial_port, &QSerialPort::readyRead, nullptr, nullptr);
}
//30->1E
void Widget::on_pushButton_clicked()
{
QString text = ui -> write_1R5_lineEdit -> text();
bool ok;
double data = text.toDouble(&ok);
qDebug() << data;
uint16_t data_u16 = (uint16_t)data;
QByteArray sent_comand;
sent_comand.append(static_cast<uint8_t>(0x30));
sent_comand.append(static_cast<uint8_t>(0x10));
sent_comand.append(static_cast<uint8_t>(0x00));
sent_comand.append(static_cast<uint8_t>(0x1E));
sent_comand.append(static_cast<uint8_t>(0x00));
sent_comand.append(static_cast<uint8_t>(0x01));
sent_comand.append(static_cast<uint8_t>(0x02));
sent_comand.append(static_cast<uint8_t>(data_u16 >> 8));
sent_comand.append(static_cast<uint8_t>(data_u16 & 0x00FF));
uint8_t sent_comand_u8[sent_comand.length()];
for(int i = 0; i < sent_comand.length(); i++)
{
sent_comand_u8[i] = sent_comand[i];
}
uint16_t crc_16_val = modbusCrc16(sent_comand_u8, sent_comand.length());
sent_comand.append(crc_16_val >> 8);
sent_comand.append(crc_16_val);
Serial_port->write(sent_comand);
//连接信号与槽
//断开所有其他的信号与槽连接
disconnect(Serial_port, &QSerialPort::readyRead, nullptr, nullptr);
connect(Serial_port, SIGNAL(readyRead()), this, SLOT(write_ack()), Qt::UniqueConnection);
}
//31->1F
void Widget::on_pushButton_2_clicked()
{
QString text = ui -> write_4R5_lineEdit -> text();
bool ok;
double data = text.toDouble(&ok);
qDebug() << data;
uint16_t data_u16 = (uint16_t)data;
QByteArray sent_comand;
sent_comand.append(static_cast<uint8_t>(0x30));
sent_comand.append(static_cast<uint8_t>(0x10));
sent_comand.append(static_cast<uint8_t>(0x00));
sent_comand.append(static_cast<uint8_t>(0x1F));
sent_comand.append(static_cast<uint8_t>(0x00));
sent_comand.append(static_cast<uint8_t>(0x01));
sent_comand.append(static_cast<uint8_t>(0x02));
sent_comand.append(static_cast<uint8_t>(data_u16 >> 8));
sent_comand.append(static_cast<uint8_t>(data_u16 & 0x00FF));
uint8_t sent_comand_u8[sent_comand.length()];
for(int i = 0; i < sent_comand.length(); i++)
{
sent_comand_u8[i] = sent_comand[i];
}
uint16_t crc_16_val = modbusCrc16(sent_comand_u8, sent_comand.length());
sent_comand.append(crc_16_val >> 8);
sent_comand.append(crc_16_val);
Serial_port->write(sent_comand);
//连接信号与槽
//断开所有其他的信号与槽连接
disconnect(Serial_port, &QSerialPort::readyRead, nullptr, nullptr);
connect(Serial_port, SIGNAL(readyRead()), this, SLOT(write_ack()), Qt::UniqueConnection);
}
//32->20
void Widget::on_pushButton_3_clicked()
{
QString text = ui -> write_8R0_lineEdit -> text();
bool ok;
double data = text.toDouble(&ok);
qDebug() << data;
uint16_t data_u16 = (uint16_t)data;
QByteArray sent_comand;
sent_comand.append(static_cast<uint8_t>(0x30));
sent_comand.append(static_cast<uint8_t>(0x10));
sent_comand.append(static_cast<uint8_t>(0x00));
sent_comand.append(static_cast<uint8_t>(0x20));
sent_comand.append(static_cast<uint8_t>(0x00));
sent_comand.append(static_cast<uint8_t>(0x01));
sent_comand.append(static_cast<uint8_t>(0x02));
sent_comand.append(static_cast<uint8_t>(data_u16 >> 8));
sent_comand.append(static_cast<uint8_t>(data_u16 & 0x00FF));
uint8_t sent_comand_u8[sent_comand.length()];
for(int i = 0; i < sent_comand.length(); i++)
{
sent_comand_u8[i] = sent_comand[i];
}
uint16_t crc_16_val = modbusCrc16(sent_comand_u8, sent_comand.length());
sent_comand.append(crc_16_val >> 8);
sent_comand.append(crc_16_val);
Serial_port->write(sent_comand);
//连接信号与槽
//断开所有其他的信号与槽连接
disconnect(Serial_port, &QSerialPort::readyRead, nullptr, nullptr);
connect(Serial_port, SIGNAL(readyRead()), this, SLOT(write_ack()), Qt::UniqueConnection);
}
//33->21
void Widget::on_pushButton_4_clicked()
{
QString text = ui -> write_lineEdit -> text();
bool ok;
double data = text.toDouble(&ok);
qDebug() << data;
uint16_t data_u16 = (uint16_t)data;
QByteArray sent_comand;
sent_comand.append(static_cast<uint8_t>(0x30));
sent_comand.append(static_cast<uint8_t>(0x10));
sent_comand.append(static_cast<uint8_t>(0x00));
sent_comand.append(static_cast<uint8_t>(0x21));
sent_comand.append(static_cast<uint8_t>(0x00));
sent_comand.append(static_cast<uint8_t>(0x01));
sent_comand.append(static_cast<uint8_t>(0x02));
sent_comand.append(static_cast<uint8_t>(data_u16 >> 8));
sent_comand.append(static_cast<uint8_t>(data_u16 & 0x00FF));
uint8_t sent_comand_u8[sent_comand.length()];
for(int i = 0; i < sent_comand.length(); i++)
{
sent_comand_u8[i] = sent_comand[i];
}
uint16_t crc_16_val = modbusCrc16(sent_comand_u8, sent_comand.length());
sent_comand.append(crc_16_val >> 8);
sent_comand.append(crc_16_val);
Serial_port->write(sent_comand);
//连接信号与槽
//断开所有其他的信号与槽连接
disconnect(Serial_port, &QSerialPort::readyRead, nullptr, nullptr);
connect(Serial_port, SIGNAL(readyRead()), this, SLOT(write_ack()), Qt::UniqueConnection);
}
//34->22
void Widget::on_pushButton_5_clicked()
{
QString text = ui -> write_Coefficient_lineEdit -> text();
bool ok;
double data = text.toDouble(&ok);
data *= 10000;
qDebug() << data;
uint16_t data_u16 = (uint16_t)data;
QByteArray sent_comand;
sent_comand.append(static_cast<uint8_t>(0x30));
sent_comand.append(static_cast<uint8_t>(0x10));
sent_comand.append(static_cast<uint8_t>(0x00));
sent_comand.append(static_cast<uint8_t>(0x22));
sent_comand.append(static_cast<uint8_t>(0x00));
sent_comand.append(static_cast<uint8_t>(0x01));
sent_comand.append(static_cast<uint8_t>(0x02));
sent_comand.append(static_cast<uint8_t>(data_u16 >> 8));
sent_comand.append(static_cast<uint8_t>(data_u16 & 0x00FF));
uint8_t sent_comand_u8[sent_comand.length()];
for(int i = 0; i < sent_comand.length(); i++)
{
sent_comand_u8[i] = sent_comand[i];
}
uint16_t crc_16_val = modbusCrc16(sent_comand_u8, sent_comand.length());
sent_comand.append(crc_16_val >> 8);
sent_comand.append(crc_16_val);
Serial_port->write(sent_comand);
//连接信号与槽
//断开所有其他的信号与槽连接
disconnect(Serial_port, &QSerialPort::readyRead, nullptr, nullptr);
connect(Serial_port, SIGNAL(readyRead()), this, SLOT(write_ack()), Qt::UniqueConnection);
}
//35->23
void Widget::on_pushButton_6_clicked()
{
QString text = ui -> write_distance_NS_lineEdit -> text();
bool ok;
double data = text.toDouble(&ok);
data *= 500;
qDebug() << data;
uint16_t data_u16 = (uint16_t)data;
QByteArray sent_comand;
sent_comand.append(static_cast<uint8_t>(0x30));
sent_comand.append(static_cast<uint8_t>(0x10));
sent_comand.append(static_cast<uint8_t>(0x00));
sent_comand.append(static_cast<uint8_t>(0x23));
sent_comand.append(static_cast<uint8_t>(0x00));
sent_comand.append(static_cast<uint8_t>(0x01));
sent_comand.append(static_cast<uint8_t>(0x02));
sent_comand.append(static_cast<uint8_t>(data_u16 >> 8));
sent_comand.append(static_cast<uint8_t>(data_u16 & 0x00FF));
uint8_t sent_comand_u8[sent_comand.length()];
for(int i = 0; i < sent_comand.length(); i++)
{
sent_comand_u8[i] = sent_comand[i];
}
uint16_t crc_16_val = modbusCrc16(sent_comand_u8, sent_comand.length());
sent_comand.append(crc_16_val >> 8);
sent_comand.append(crc_16_val);
Serial_port->write(sent_comand);
//连接信号与槽
//断开所有其他的信号与槽连接
disconnect(Serial_port, &QSerialPort::readyRead, nullptr, nullptr);
connect(Serial_port, SIGNAL(readyRead()), this, SLOT(write_ack()), Qt::UniqueConnection);
}
//36->24
void Widget::on_pushButton_7_clicked()
{
QString text = ui -> write_distance_WE_lineEdit -> text();
bool ok;
double data = text.toDouble(&ok);
data *= 500;
qDebug() << data;
uint16_t data_u16 = (uint16_t)data;
QByteArray sent_comand;
sent_comand.append(static_cast<uint8_t>(0x30));
sent_comand.append(static_cast<uint8_t>(0x10));
sent_comand.append(static_cast<uint8_t>(0x00));
sent_comand.append(static_cast<uint8_t>(0x24));
sent_comand.append(static_cast<uint8_t>(0x00));
sent_comand.append(static_cast<uint8_t>(0x01));
sent_comand.append(static_cast<uint8_t>(0x02));
sent_comand.append(static_cast<uint8_t>(data_u16 >> 8));
sent_comand.append(static_cast<uint8_t>(data_u16 & 0x00FF));
uint8_t sent_comand_u8[sent_comand.length()];
for(int i = 0; i < sent_comand.length(); i++)
{
sent_comand_u8[i] = sent_comand[i];
}
uint16_t crc_16_val = modbusCrc16(sent_comand_u8, sent_comand.length());
sent_comand.append(crc_16_val >> 8);
sent_comand.append(crc_16_val);
Serial_port->write(sent_comand);
//连接信号与槽
//断开所有其他的信号与槽连接
disconnect(Serial_port, &QSerialPort::readyRead, nullptr, nullptr);
connect(Serial_port, SIGNAL(readyRead()), this, SLOT(write_ack()), Qt::UniqueConnection);
}
void Widget::on_Get_ID_pushButton_clicked()
{
QByteArray sent_comand;
sent_comand.append(static_cast<uint8_t>(0x30));
sent_comand.append(static_cast<uint8_t>(0x03));
sent_comand.append(static_cast<uint8_t>(0x00));
sent_comand.append(static_cast<uint8_t>(0x37));
sent_comand.append(static_cast<uint8_t>(0x00));
sent_comand.append(static_cast<uint8_t>(0x04));
sent_comand.append(static_cast<uint8_t>(0xF1));
sent_comand.append(static_cast<uint8_t>(0xE6));
Serial_port->write(sent_comand);
//连接信号与槽
//断开所有其他的信号与槽连接
disconnect(Serial_port, &QSerialPort::readyRead, nullptr, nullptr);
connect(Serial_port, SIGNAL(readyRead()), this, SLOT(getIdData()), Qt::UniqueConnection);
}
uint32_t PassWord[2] = {0};
uint32_t key[] = {0x509770ff, 0x29c6b369, 0x4da2c125, 0x0};
void Widget::getIdData()
{
uint32_t ID_1;
uint32_t ID_2;
// 接收数据,一会再接收,以便接收超长数据
QByteArray readed_data;
while(Serial_port->waitForReadyRead(UART_WAIT_MS)==true);
readed_data.append(Serial_port -> readAll());
//防止干扰
while(readed_data.length() > 1)
{
qDebug() << readed_data.length();
qDebug() << readed_data;
if(readed_data[0] != static_cast<char>(0x30) || readed_data[1] != static_cast<char>(0x03))
{
readed_data.remove(0, 1);
}
else
break;
}
uint8_t read_comand_u8[readed_data.length()];
for(int i = 0; i < readed_data.length(); i++)
{
read_comand_u8[i] = readed_data[i];
}
if(readed_data.length() >= 13)
if(modbusCrc16(read_comand_u8, 11) >> 8 == read_comand_u8[11] && (modbusCrc16(read_comand_u8, 11) & 0x00FF) == read_comand_u8[12])
{
ui->ID_lineEdit->clear();
ID_1 = read_comand_u8[3] << 24 | read_comand_u8[4] << 16 | read_comand_u8[5] << 8 | read_comand_u8[6];
QString ID_1_Str = QString::number(ID_1, 16).toUpper().rightJustified(2, '0').prepend("0x");
ID_2 = read_comand_u8[7] << 24 | read_comand_u8[8] << 16 | read_comand_u8[9] << 8 | read_comand_u8[10];
QString ID_2_Str = QString::number(ID_2, 16).toUpper().rightJustified(2, '0').prepend("0x");
ui->ID_lineEdit->setText(ID_1_Str + " " + ID_2_Str);
qDebug("%x %x",ID_1, ID_2);
key[3] = ID_1;
PassWord[0] = ID_1;
PassWord[1] = ID_2;
tea_encrypt(PassWord, key);
ui->Password_lineEdit->clear();
QString PW_1_Str = QString::number(PassWord[0], 16).toUpper().rightJustified(2, '0').prepend("0x");
QString PW_2_Str = QString::number(PassWord[1], 16).toUpper().rightJustified(2, '0').prepend("0x");
qDebug("%x %x",PassWord[0], PassWord[1]);
ui->Password_lineEdit->setText(PW_1_Str + " " + PW_2_Str);
}
disconnect(Serial_port, &QSerialPort::readyRead, nullptr, nullptr);
// 点亮控件
ui->Password_lineEdit->setEnabled(true);
ui->ID_lineEdit->setEnabled(true);
ui->label_10->setEnabled(true);
ui->label_11->setEnabled(true);
ui->Trans_password_pushButton->setEnabled(true);
}
void Widget::tea_encrypt(uint32_t *v, uint32_t *k)
{
uint32_t v0 = v[0], v1 = v[1], sum = 0, i; // 初始化v0, v1, sum
uint32_t delta = 0x9e3779b9; // 初始化delta
uint32_t k1 = k[1], k3 = k[3], k0 = k[0], k2 = k[2]; // 初始化密钥k
for (i = 0; i < 32; i++) { // 执行32轮加密
sum += delta;
v0 += ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1);
v1 += ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3);
}
v[0] = v0; // 返回加密结果
v[1] = v1;
}
void Widget::on_Trans_password_pushButton_clicked()
{
QByteArray sent_comand;
sent_comand.append(static_cast<uint8_t>(0x30));
sent_comand.append(static_cast<uint8_t>(0x10));
sent_comand.append(static_cast<uint8_t>(0x00));
sent_comand.append(static_cast<uint8_t>(0x3B));
sent_comand.append(static_cast<uint8_t>(0x00));
sent_comand.append(static_cast<uint8_t>(0x04));
sent_comand.append(static_cast<uint8_t>(0x08));
sent_comand.append(static_cast<uint8_t>(PassWord[0] >> 24));
sent_comand.append(static_cast<uint8_t>(PassWord[0] >> 16));
sent_comand.append(static_cast<uint8_t>(PassWord[0] >> 8));
sent_comand.append(static_cast<uint8_t>(PassWord[0] >> 0));
sent_comand.append(static_cast<uint8_t>(PassWord[1] >> 24));
sent_comand.append(static_cast<uint8_t>(PassWord[1] >> 16));
sent_comand.append(static_cast<uint8_t>(PassWord[1] >> 8));
sent_comand.append(static_cast<uint8_t>(PassWord[1] >> 0));
uint8_t sent_comand_u8[sent_comand.length()];
for(int i = 0; i < sent_comand.length(); i++)
{
sent_comand_u8[i] = sent_comand[i];
}
uint16_t crc_16_val = modbusCrc16(sent_comand_u8, sent_comand.length());
sent_comand.append(crc_16_val >> 8);
sent_comand.append(crc_16_val);
Serial_port->write(sent_comand);
//连接信号与槽
//断开所有其他的信号与槽连接
disconnect(Serial_port, &QSerialPort::readyRead, nullptr, nullptr);
connect(Serial_port, SIGNAL(readyRead()), this, SLOT(write_ack()), Qt::UniqueConnection);
}
void Widget::on_pushButton_8_clicked()
{
QByteArray sent_comand;
sent_comand.append(static_cast<uint8_t>(0x30));
sent_comand.append(static_cast<uint8_t>(0x10));
sent_comand.append(static_cast<uint8_t>(0x00));
sent_comand.append(static_cast<uint8_t>(0x1A));
sent_comand.append(static_cast<uint8_t>(0x00));
sent_comand.append(static_cast<uint8_t>(0x01));
sent_comand.append(static_cast<uint8_t>(0x02));
sent_comand.append(static_cast<uint8_t>(0x00));
sent_comand.append(static_cast<uint8_t>(0x01));
sent_comand.append(static_cast<uint8_t>(0x3C));
sent_comand.append(static_cast<uint8_t>(0x3B));
Serial_port->write(sent_comand);
}
void Widget::write_ack()
{
// 接收数据,一会再接收,以便接收超长数据
QByteArray readed_data;
while(Serial_port->waitForReadyRead(UART_WAIT_MS)==true);
readed_data.append(Serial_port -> readAll());
//防止干扰
while(readed_data.length() > 1)
{
qDebug() << readed_data.length();
qDebug() << readed_data;
if(readed_data[0] != static_cast<char>(0x30) || readed_data[1] != static_cast<char>(0x10))
{
readed_data.remove(0, 1);
}
else
break;
}
uint8_t read_comand_u8[readed_data.length()];
for(int i = 0; i < readed_data.length(); i++)
{
read_comand_u8[i] = readed_data[i];
}
if(modbusCrc16(read_comand_u8, readed_data.length()-2) >> 8 == read_comand_u8[readed_data.length()-2] && (modbusCrc16(read_comand_u8, readed_data.length()-2) & 0x00FF) == read_comand_u8[readed_data.length()-1])
{
QMessageBox::information(this, "提示", "数据下发成功");
}
disconnect(Serial_port, &QSerialPort::readyRead, nullptr, nullptr);
}