- #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 上傳
點擊文件名下載附件
|