標(biāo)題:
電力采集程序qt源碼
[打印本頁]
作者:
zhangsmart1101
時間:
2024-8-22 08:51
標(biāo)題:
電力采集程序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())//如果串口已經(jīng)打開了 先給他關(guān)閉了
{
m_serialPort->clear();
m_serialPort->close();
}
//設(shè)置串口名字 假設(shè)我們上面已經(jīng)成功獲取到了 并且使用第一個
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);//設(shè)置波特率和讀寫方向
m_serialPort->setDataBits(QSerialPort::Data8); //數(shù)據(jù)位為8位
m_serialPort->setFlowControl(QSerialPort::NoFlowControl);//無流控制
m_serialPort->setParity(QSerialPort::NoParity); //無校驗位
m_serialPort->setStopBits(QSerialPort::OneStop); //一位停止位
//連接信號槽 當(dāng)下位機發(fā)送數(shù)據(jù)QSerialPortInfo 會發(fā)送個 readyRead 信號,我們定義個槽void receiveInfo()解析數(shù)據(jù)
connect(m_serialPort,SIGNAL(readyRead()),this, SLOT(receiveInfo()));
connect(m_timer,SIGNAL(timeout()),this, SLOT(timeUpdate()));
btn->setText("關(guān)閉串口");
}else {//關(guān)閉
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() + "關(guān)閉成功!");
btn->setText("打開串口");
return;
}
serialState->setText(serialCbo->currentText() + "不能重復(fù)關(guān)閉!");
}
}
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){//只對正確的情況做處理,其余數(shù)據(jù)不全的忽略
return;
}
//buf[17] 返回類型為 QByteRef 類型,并非char,不能用它
//而應(yīng)該用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();
}
復(fù)制代碼
部分代碼下載(可能有錯誤,僅供參考):
electricty.rar
(8.6 KB, 下載次數(shù): 0)
2024-8-22 08:51 上傳
點擊文件名下載附件
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1