#include "widget.h"
#include "ui_widget.h"
#include"form.h"
#include<QPushButton>
#include<QSqlDatabase>
#include<QSqlQuery>
#include<QDebug>
#include<QMessageBox>
#include<QSqlError>
#include<QRadioButton>
#include<QGroupBox>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// QGroupBox *groupBox_3 = new QGroupBox(this);
// QRadioButton *radioButton =new QRadioButton("温度",groupBox_3);//指定其父对象是分组控件
// QRadioButton *radioButton_2 =new QRadioButton("湿度",groupBox_3);
setFixedSize( this->width(),this->height());//窗口定大小
//this->resize(800,600);
this->setWindowTitle("温湿度监控系统");
ui->lcdNumber->setDigitCount(4); //显示位数
ui->lcdNumber->setMode(QLCDNumber::Dec); //十进制
ui->lcdNumber->setSegmentStyle(QLCDNumber::Flat); //显示方式
ui->lcdNumber_2->setDigitCount(4); //显示位数
ui->lcdNumber_2->setMode(QLCDNumber::Dec); //十进制
ui->lcdNumber_2->setSegmentStyle(QLCDNumber::Flat); //显示方式
ui->comboBox_2->addItem("1200");
ui->comboBox_2->addItem("2400");
ui->comboBox_2->addItem("4800");
ui->comboBox_2->addItem("9600");
ui->comboBox_2->addItem("115200");
m_serialPort = new QSerialPort;
serialflag = 0;
timer = new QTimer;
timer->start(1000);//计时1s
connect(timer,&QTimer::timeout,this,&Widget::sendCommand);
//connect(ui->getData,&QPushButton::clicked,this,&Widget::sendCommand);
connect(m_serialPort,&QSerialPort::readyRead,this,&Widget::read_info);//接受反馈数据
// struct Data{
// int tem;
// int hum;
// };
series_w =new QSplineSeries(this);
series_s=new QSplineSeries(this);
// this->setMouseTracking(true);//可以追踪到鼠标的轨迹,鼠标放到点上就显示出坐标
// m_coordX=new QLabel;
// m_coordY=new QLabel;
timer2 = new QTimer;
connect(timer2,&QTimer::timeout,this,&Widget::updateData);
initGraph();
// disconnect(timer2,&QTimer::timeout,this,&Widget::updateData);
//监测子窗口的回退信号
connect(&f,&Form::back,[=](){
f.hide();
this->show();
});
connect(s,&Subwidget::back,[=](){
s->hide();
this->show();
});
}
Widget::~Widget()
{
delete ui;
delete m_serialPort;
}
void Widget::initGraph()//绘实时温湿度图
{
QPen blue;
blue.setWidth(2);//线条宽度
series_w->setPen(blue);
QPen red;
red.setWidth(2);
series_s->setPen(red);
axisX = new QValueAxis();
axisY = new QValueAxis();
axisX->setTitleText("time(1s)");
axisX->setRange(0,30);
axisX->setTickCount(7);//大刻度线有7条,把30分成了6份
axisX->setMinorTickCount(4);//2个大刻度线之间有4条小刻度线,分成了5份
axisX->setGridLineVisible(true);//设置是否显示网格线
axisY->setRange(0,90);
axisY->setTitleText("value");
chart=new QChart();
series_w->setName("temperature");
series_s->setName("humidity");
series_s->setPointsVisible(true);//线由点构成
series_w->setPointsVisible(true);
series_s->setColor(QColor(255,0,0));
series_w->setColor(QColor(22,33,250));
chart->addSeries(series_w);//向图表中添加线
chart->addSeries(series_s);
chart->createDefaultAxes();
chart->setTitle("温湿度实时变化");
//chart->setTheme(QChart::ChartThemeQt);
chart->legend()->setVisible(true);
chart->setTitleFont(QFont("微软雅黑"));
chart->setAxisX(axisX,series_w);//添加坐标轴,必须再addseries后调用
chart->setAxisY(axisY,series_w);
chart->setAxisX(axisX,series_s);
chart->setAxisY(axisY,series_s);
chart->setAnimationOptions(QChart::AllAnimations);
ui->widget->setChart(chart);//把图表固定到视图,先把widget提升为QChartView
}
void Widget::on_pushButton_clicked()
{
f.show();
this->hide();
}
void Widget::on_pushButton_5_clicked()
{
s->show();
this->hide();
}
void Widget::on_searchSerialBtn_clicked()
{
ui->comboBox->clear();
foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
{
QSerialPort serial;
serial.setPort(info); //设置串口
if(serial.open(QIODevice::ReadWrite))
{
ui->comboBox->addItem(info.portName());
serial.close();
}
}
}
void Widget::on_openSerialBtn_clicked()//打开了串口,控件时不可调的
{
if(ui->openSerialBtn->text()==tr("打开串口"))//点击按钮之前,串口已关,下面设置串口信息
{
m_serialPort->setPortName(ui->comboBox->currentText());
switch(ui->comboBox_2->currentIndex())
{
case 0:
m_serialPort->setBaudRate(QSerialPort::Baud1200);break;
case 1:
m_serialPort->setBaudRate(QSerialPort::Baud2400);break;
case 2:
m_serialPort->setBaudRate(QSerialPort::Baud4800);break;
case 3:
m_serialPort->setBaudRate(QSerialPort::Baud9600);break;
case 4:
m_serialPort->setBaudRate(QSerialPort::Baud115200);break;
default:
break;
}
m_serialPort->setDataBits(QSerialPort::Data8); //数据位为8位
m_serialPort->setFlowControl(QSerialPort::NoFlowControl);//无流控制
m_serialPort->setParity(QSerialPort::NoParity); //校验位
m_serialPort->setStopBits(QSerialPort::TwoStop); //二位停止位
if(m_serialPort->open(QIODevice::ReadWrite)==false)//串口是关闭的(没有扫描就打开串口)
{
QMessageBox::warning(NULL , "提示", "串口打开失败!");
return;
}
ui->comboBox->setEnabled(false);
ui->comboBox_2->setEnabled(false);
ui->openSerialBtn->setText(tr("关闭串口"));
serialflag = 1;//串口打开
}
else//点击按钮前,现在是串口是开着的,点了槽函数就关闭串口
{
disconnect(timer2,&QTimer::timeout,this,&Widget::updateData);//停止实时更新曲线
m_serialPort->clear();
m_serialPort->close();//先关串口
ui->comboBox->setEnabled(true);
ui->comboBox_2->setEnabled(true);
ui->openSerialBtn->setText(tr("打开串口"));
ui->lcdNumber->display(0);
ui->lcdNumber_2->display(0);
serialflag = 0;
//timer->stop();//停止定时发送
}
}
void Widget::writedata(int tem,int hum)
{
QSqlQuery query;
// query.exec("create table t(id int primary key auto_increment,time datetime, temperature int, humidity int);");
QString sqlquery = QString("insert into t_ values(0,now(),'%1','%2')").arg(tem).arg(hum);//插入一个数据
query.exec(sqlquery);
}
void Widget::sendCommand()
{
QByteArray sendByte;//协议根据下位机来定
sendByte.resize(8);
sendByte[0]=0Xcc;//帧头
sendByte[1]=0X01;//从站地址
sendByte[2]=0X0d;//功能码
sendByte[3]=0X01;//数据个数
sendByte[4]=0X00;//数据
sendByte[5]=0X00;//校验,根据数据,由CRC算法自动生成
sendByte[6]=0X00;//校验
sendByte[7]=0Xcd;//帧尾
qint64 ref;
ref = m_serialPort->write(sendByte);
//把反馈回来的ref转化为string
// QString B=tr("%1").arg(ref);
// info_text("已成功发送"
上位机和串口建立 Modbus 协议进行数据传输,并使用 Mysql 数据库存储,能够实现实时温湿度显示和动态变化曲线,历史数据
版权申诉
127 浏览量
2024-05-01
20:46:24
上传
评论 1
收藏 24KB ZIP 举报
MarcoPage
- 粉丝: 2729
- 资源: 2760