#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "mythread.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//查找可用的串口
foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
{
QSerialPort serial;
serial.setPort(info);
if(serial.open(QIODevice::ReadWrite))
{
ui->comboBox_chuankouhao->addItem(serial.portName());
serial.close();
}
}
//设置波特率下拉菜单默认显示第九项
ui->comboBox_botelv->setCurrentIndex(8);
ui->comboBox_d_botelv->setCurrentIndex(8);
//关闭按钮功能
ui->pushButton_read->setEnabled(false);
ui->pushButton_read_multi->setEnabled(false);
ui->pushButton_reset->setEnabled(false);
ui->pushButton_write->setEnabled(false);
ui->pushButton_write_compensation->setEnabled(false);
ui->pushButton_write_multi->setEnabled(false);
ui->pushButton_read_compensation->setEnabled(false);
ui->lineEdit_d_fma->setPlaceholderText(tr("1~200"));
ui->lineEdit_s_fma->setPlaceholderText(tr("1~200"));
ui->pushButton_caozuo->setText(QObject::tr("打开"));
show_status("界面设定成功!");
qDebug() << tr("界面设定成功!");
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::getmine(unsigned char *ptr, unsigned char *len, unsigned short num)
{
unsigned short temp=num;
unsigned char i=0;
if(temp<9) *len=1;
if(temp>9) *len=2;
if(temp>99) *len=3;
if(temp>999) *len=4;
if(temp>9999) *len=5;
temp=num;
for(i=0;i<*len;i++)
{
ptr[i]=temp%10+48;
temp=temp/10;
}
}
//显示状态
void MainWindow::show_status(QString show_sta)
{
ui->label_status->setText(show_sta);
}
//CRC校验
unsigned short MainWindow::ModBusCRC(unsigned char *ptr, unsigned char size)
{
unsigned short a,b,tmp,CRC16,V;
CRC16=0xffff;
for (a=0;a<size;a++)
{
CRC16=*ptr^CRC16;
for (b=0;b<8;b++)
{
tmp=CRC16 & 0x0001;
CRC16 =CRC16 >>1;
if (tmp)
CRC16=CRC16 ^ 0xa001;
}
ptr++;
}
V = ((CRC16 & 0x00FF) << 8) | ((CRC16 & 0xFF00) >> 8) ;
return CRC16;
}
//显示发送数据
void MainWindow::show_send_data(unsigned char *send_data,unsigned char send_leng)
{
QString sstr;
for(unsigned char i=0;i<send_leng;i++)
{
sstr+=QString::number(send_data[i],16).toUpper();
sstr+=" ";
}
ui->textBrowser_send->append(sstr);
qDebug()<<tr("发送的数据:")<<sstr;
}
//获取从机地址
unsigned int MainWindow::get_slave_address(void)
{
unsigned char leng;
unsigned int temp=0;
QByteArray data_temp;
if(mIsOpen==true)
{
//读取目前从机地址
QString s_fma_str=ui->lineEdit_s_fma->text();
data_temp=s_fma_str.toUtf8();
leng=s_fma_str.length();
temp=0;
for(unsigned char i=0;i<leng;i++)
{
temp=temp*10+(data_temp[i]-48);
}
if(temp==0xff||(temp>=0&&temp<=200))
{
qDebug("目前从机地址:%d",temp);
}
else
{
temp=0xfe;//地址错误码
show_status("读从机地址错误");
}
return temp;
}
}
//清空发送窗口数据
void MainWindow::on_pushButton_clear_send_clicked()
{
ui->textBrowser_send->clear();
}
//清空接收窗口数据
void MainWindow::on_pushButton_clear_rev_clicked()
{
ui->textBrowser_rev->clear();
}
//重启下位机
void MainWindow::on_pushButton_reset_clicked()
{
unsigned char set_code_multi[30]={0xff},botelv;
unsigned char leng;
unsigned int temp=0;
QByteArray data_temp;
if(mIsOpen==true)
{
//读取目前从机地址
temp=get_slave_address();
set_code_multi[0]=temp;
if(temp!=0xfe)
{
s_fma_right=true;
}
else
{
s_fma_right=false;
}
set_code_multi[1]=write_code;
set_code_multi[2]=reset_code;
//添加CRC校验
unsigned short mycrc=ModBusCRC(set_code_multi,3);
set_code_multi[3]=mycrc;
set_code_multi[4]=mycrc>>8;
qDebug("CRC1:%x",set_code_multi[3]);
qDebug("CRC2:%x",set_code_multi[4]);
if((s_fma_right&&d_fma_right)==true)
{
for(unsigned char i=0;i<5;i++)
{
QByteArray sendata(1,set_code_multi[i]);
serial->write(sendata);
qDebug()<<set_code_multi[i];
}
//显示要发送的数据
show_send_data(set_code_multi,5);
show_status("重启设备");
}
else
{
show_status("地址错误,重启失败");
}
}
}
void MainWindow::on_pushButton_caozuo_clicked()
{
if(ui->pushButton_caozuo->text()==tr("打开"))
{
serial = new QSerialPort;
//设置串口名
serial->setPortName(ui->comboBox_chuankouhao->currentText());
//打开串口
serial->open(QIODevice::ReadWrite);
//设置波特率
serial->setBaudRate(ui->comboBox_botelv->currentText().toInt());
//设置数据位数
serial->setDataBits(QSerialPort::Data8);
//设置奇偶校验
serial->setParity(QSerialPort::NoParity);
//设置停止位
serial->setStopBits(QSerialPort::OneStop);
//设置流控制
serial->setFlowControl(QSerialPort::NoFlowControl);
//关闭按钮功能
ui->pushButton_read->setEnabled(true);
ui->pushButton_read_multi->setEnabled(true);
ui->pushButton_reset->setEnabled(true);
ui->pushButton_write->setEnabled(true);
ui->pushButton_write_compensation->setEnabled(true);
ui->pushButton_write_multi->setEnabled(true);
ui->pushButton_read_compensation->setEnabled(true);
ui->radioButton_gas->setChecked(true);
ui->pushButton_caozuo->setText(tr("关闭"));
show_status("串口打开");
mIsOpen=true;
//连接信号槽,读取数据
QObject::connect(serial, &QSerialPort::readyRead, this, &MainWindow::Read_Data);
}
else
{
//关闭串口
serial->clear();
serial->close();
serial->deleteLater();
//恢复设置使能
//关闭按钮功能
ui->pushButton_read->setEnabled(false);
ui->pushButton_read_multi->setEnabled(false);
ui->pushButton_reset->setEnabled(false);
ui->pushButton_write->setEnabled(false);
ui->pushButton_write_compensation->setEnabled(false);
ui->pushButton_write_multi->setEnabled(false);
ui->pushButton_read_compensation->setEnabled(false);
ui->pushButton_caozuo->setText(tr("打开"));
show_status("串口关闭");
mIsOpen=false;
}
}
//读从机地址和波特率
void MainWindow::on_pushButton_read_multi_clicked()
{
unsigned char set_code_multi[30]={0xff};
unsigned char leng;
unsigned int temp=0;
QByteArray data_temp;
if(mIsOpen==true)
{
//读取目前从机地址
temp=get_slave_address();
if(temp!=0xfe)
{
set_code_multi[0]=temp;
qDebug("目前从机地址:%d",set_code_multi[0]);
set_code_multi[1]=read_code;
set_code_multi[2]=communication;
//添加CRC校验
unsigned short mycrc=ModBusCRC(set_code_multi,3);
set_code_multi[3]=mycrc;
set_code_multi[4]=mycrc>>8;
for(unsigned char i=0;i<5;i++)
评论0