标题:
电力采集程序qt源码
[打印本页]
作者:
zhangsmart1101
时间:
2024-8-22 08:51
标题:
电力采集程序qt源码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTimer>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow), m_serialPort(new QSerialPort()), m_timer(new QTimer)
{
ui->setupUi(this);
QComboBox* serialCbo = findChild<QComboBox*>("cboSerial", Qt::FindChildOption::FindChildrenRecursively);
//获取所有串口信息
foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
{
qDebug() << "serialPortName:" << info.portName();
qDebug() << "isBusy:" << info.isBusy();
qDebug() << "isNull:" << info.isNull();
qDebug() << "serialCbo:" << serialCbo;
if(!info.isBusy()){
serialCbo->addItem(info.portName());
}
}
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_btnOpenSerial_clicked()
{
QPushButton* btn = findChild<QPushButton*>("btnOpenSerial", Qt::FindChildOption::FindChildrenRecursively);
if(btn->text() == "打开串口"){//打开
if(m_serialPort->isOpen())//如果串口已经打开了 先给他关闭了
{
m_serialPort->clear();
m_serialPort->close();
}
//设置串口名字 假设我们上面已经成功获取到了 并且使用第一个
QComboBox* serialCbo = findChild<QComboBox*>("cboSerial", Qt::FindChildOption::FindChildrenRecursively);
m_serialPort->setPortName(serialCbo->currentText());
QLabel* serialState = findChild<QLabel*>("lblSerialState", Qt::FindChildOption::FindChildrenRecursively);
if(!m_serialPort->open(QIODevice::ReadWrite))//用ReadWrite 的模式尝试打开串口
{
serialState->setText(serialCbo->currentText() + "打开失败!");
return;
}
//打开成功
serialState->setText(serialCbo->currentText() + "打开成功!");
m_serialPort->setBaudRate(QSerialPort::Baud9600,QSerialPort::AllDirections);//设置波特率和读写方向
m_serialPort->setDataBits(QSerialPort::Data8); //数据位为8位
m_serialPort->setFlowControl(QSerialPort::NoFlowControl);//无流控制
m_serialPort->setParity(QSerialPort::NoParity); //无校验位
m_serialPort->setStopBits(QSerialPort::OneStop); //一位停止位
//连接信号槽 当下位机发送数据QSerialPortInfo 会发送个 readyRead 信号,我们定义个槽void receiveInfo()解析数据
connect(m_serialPort,SIGNAL(readyRead()),this, SLOT(receiveInfo()));
connect(m_timer,SIGNAL(timeout()),this, SLOT(timeUpdate()));
btn->setText("关闭串口");
}else {//关闭
QComboBox* serialCbo = findChild<QComboBox*>("cboSerial", Qt::FindChildOption::FindChildrenRecursively);
QLabel* serialState = findChild<QLabel*>("lblSerialState", Qt::FindChildOption::FindChildrenRecursively);
if (m_serialPort->isOpen())
{
m_serialPort->close();
serialState->setText(serialCbo->currentText() + "关闭成功!");
btn->setText("打开串口");
return;
}
serialState->setText(serialCbo->currentText() + "不能重复关闭!");
}
}
float power;
int i = 1;
QByteArray buf;
void MainWindow::receiveInfo()
{
m_timer->start(100);
buf.append(m_serialPort->readAll());
}
void MainWindow::timeUpdate(){
m_timer->stop();
if(buf.length() > 0){
qDebug() << "receive..." << buf.length();
//上述方法不是每次都返回21,每次可能不能完全读完,分几次读取,或一次读完的都有
if(buf.length() != 25){//只对正确的情况做处理,其余数据不全的忽略
return;
}
//buf[17] 返回类型为 QByteRef 类型,并非char,不能用它
//而应该用at()
//取电压
qDebug("volt %02x-%02x", buf.at(3), buf.at(4));
float volt = ((unsigned char)buf.at(3) << 8) + (unsigned char)buf.at(4);
qDebug() << volt;
volt *= 0.1;
QString data = QString("电压:%1 V").arg(volt);
QLabel* lblVolt = findChild<QLabel*>("lblVolt", Qt::FindChildOption::FindChildrenRecursively);
lblVolt->setText(data);
//取电流
float circuit = (buf.at(5) << 8) + buf.at(6);
circuit += ((buf.at(7) << 8) + buf.at(8)) << 16;
data = QString("电流:%1 mA").arg(circuit);
QLabel* lblCircut = findChild<QLabel*>("lblCircut", Qt::FindChildOption::FindChildrenRecursively);
lblCircut->setText(data);
//取功率
power = (buf.at(9) << 8) + buf.at(10);
power += ((buf.at(11) << 8) + buf.at(12)) << 16;
power *= 0.1;
data = QString("功率:%1 W").arg(power);
QLabel* lblPower = findChild<QLabel*>("lblPower", Qt::FindChildOption::FindChildrenRecursively);
lblPower->setText(data);
//取频率
qDebug("%02x-%02x", buf.at(17), buf.at(18));
float freq = ((unsigned char)buf.at(17) << 8) + (unsigned char)buf.at(18);
freq *= 0.1;
data = QString("频率:%1 Hz").arg(freq);
QLabel* lblFreq = findChild<QLabel*>("lblFreq", Qt::FindChildOption::FindChildrenRecursively);
lblFreq->setText(data);
QLabel* serialState = findChild<QLabel*>("lblSerialState", Qt::FindChildOption::FindChildrenRecursively);
QString statebuf = QString("正在采集 %1 次").arg(i);
serialState->setText(statebuf);
//update 图形
//PaintFrame* frame = findChild<PaintFrame*>("frame", Qt::FindChildOption::FindChildrenRecursively);
//frame->update(i, 140-(int)power, i, 140);
}
buf.clear();
}
复制代码
部分代码下载(可能有错误,仅供参考):
electricty.rar
(8.6 KB, 下载次数: 0)
2024-8-22 08:51 上传
点击文件名下载附件
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1