前言
本文主要涉及上位機對接收的串口數(shù)據(jù)處理,LCD Number控件的使用。之前的一篇寫一個簡單的LED控制主要是串口發(fā)出數(shù)據(jù),這里再看一下怎么接收數(shù)據(jù)處理數(shù)據(jù),這樣基本就對串口上位機有簡單的認識了。
LCD Number顯示時間
這一小節(jié)通過用一個LCD Number實時顯示時間的例程認識一下LCD Number控件。
新建一個widget示例工程,前面的文章都有相關內容,請移步查閱,這里不贅述。
雙擊widget.ui打開 Qt 設計器界面,拉一個LCD Number到合適位置
拉大一點:
這里說一下QT開發(fā)的大概模式,和C# 開發(fā)很像,這里是.ui文件是UI設計,同時相關源文件配合,如果UI設計不能直接設置的,就必須通過源碼實現(xiàn),當然UI設計器主要還是設置控件的位置大小顏色和一些基本參數(shù)之類的。ui文件是可有可無的,即使沒有ui文件,完全通過代碼添加控件,設定控件參數(shù)位置等也是完全可行的。
其余的就按下面的代碼改一下就行了。
整體源碼:
widget.cpp文件:
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
/* 設置顯示的位數(shù) 8 位 */
ui->lcdNumber->setDigitCount(8);
/* 設置樣式 */
ui->lcdNumber->setSegmentStyle(QLCDNumber::Flat);
/* 設置 lcd 顯示為當前系統(tǒng)時間 */
QTime time = QTime::currentTime();
/* 設置顯示的樣式 */
ui->lcdNumber->display(time.toString("hh:mm:ss"));
timer = new QTimer(this);
/* 設置定時器 1000 毫秒發(fā)送一個 timeout()信號 */
timer->start(1000);
/* 信號槽連接 */
connect(timer, SIGNAL(timeout()), this, SLOT(timerTimeOut()));
}
Widget::~Widget()
{
delete ui;
}
void Widget::timerTimeOut()
{
/* 當定時器計時 1000 毫秒后,刷新 lcd 顯示當前系統(tǒng)時間 */
QTime time = QTime::currentTime();
/* 設置顯示的樣式 */
ui->lcdNumber->display(time.toString("hh:mm:ss"));
}
widget.h文件:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QLCDNumber>
#include <QTimer>
#include <QTime>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private:
Ui::Widget *ui;
/* 聲明 QTimer 對象 */
QTimer *timer;
private slots:
/* 槽函數(shù) */
void timerTimeOut();
};
#endif // WIDGET_H
其余文件保持默認。
效果:
串口數(shù)據(jù)處理,LCD Number顯示電壓電流
串口協(xié)議是JSON格式:類似{“Cur”:118,“Vol”:7587},電流單位mA,電壓單位mV
雙擊.ui文件打開UI設計器,通過拖動的方式添加控件,如下圖所示放置,紅色框是Label,藍色框是Combo Box,黃色框是兩個Push Button,棕色框是LCD Number,其中的文字都可在放置控件后雙擊改之:
串口部分與這篇文章相似:QT C++入門學習(2) QT Creator寫一個簡單的上位機控制LED,可作參考
Label可以通過font屬性調整字體和大小:
LCD Number可以通過digitCount屬性設定最大顯示位數(shù),這里保持默認5位即可:
.pro文件中添加串口模塊:
程序源碼:
widget.h文件:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QLCDNumber>
#include <QSerialPort>
#include <QSerialPortInfo>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private:
Ui::Widget *ui;
QSerialPort *serialPort;//定義串口指針
private slots:
/*以下為widget.ui文件中點擊“轉到槽”自動生成的函數(shù)*/
void on_openBt_clicked();
void on_btnSerialCheck_clicked();
void DateRead();
};
#endif // WIDGET_H
widget.cpp文件:
#include "widget.h"
#include "ui_widget.h"
#include <QMessageBox>
#include <QDebug>
//解析json格式類
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QJsonValue>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
QStringList serialNamePort;
serialPort = new QSerialPort(this);
ui->serailCb->clear();
//通過QSerialPortInfo查找可用串口
foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
{
ui->serailCb->addItem(info.portName());
}
connect(serialPort,SIGNAL(readyRead()),this,SLOT(DateRead()));/*手動連接槽函數(shù)*/
}
/*打開串口*/
void Widget::on_openBt_clicked()
{
// 初始化串口屬性,設置 端口號、波特率、數(shù)據(jù)位、停止位、奇偶校驗位數(shù)
serialPort->setPortName(ui->serailCb->currentText());
serialPort->setBaudRate(ui->baundrateCb->currentText().toInt());
serialPort->setDataBits(QSerialPort::Data8);
serialPort->setStopBits(QSerialPort::OneStop);
serialPort->setParity(QSerialPort::NoParity);
// 根據(jù)初始化好的串口屬性,打開串口
// 如果打開成功,反轉打開按鈕顯示和功能。打開失敗,無變化,并且彈出錯誤對話框。
if(ui->openBt->text() == "打開串口"){
if(serialPort->open(QIODevice::ReadWrite) == true){
ui->openBt->setText("關閉串口");
// 讓端口號下拉框不可選,避免誤操作(選擇功能不可用,控件背景為灰色)
ui->serailCb->setEnabled(false);
}else{
QMessageBox::critical(this, "錯誤提示", "串口打開失?。。。r\n該串口可能被占用\r\n請選擇正確的串口");
}
}else{
serialPort->close();
ui->openBt->setText("打開串口");
// 端口號下拉框恢復可選,避免誤操作
ui->serailCb->setEnabled(true);
}
}
//檢測通訊端口槽函數(shù)
void Widget::on_btnSerialCheck_clicked()
{
ui->serailCb->clear();
//通過QSerialPortInfo查找可用串口
foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
{
ui->serailCb->addItem(info.portName());
}
}
void Widget::DateRead() //接收數(shù)據(jù)
{
QByteArray recvData=serialPort->readAll();
//解析 JSON格式
QString receive =QString::fromLocal8Bit(recvData.constData());
QJsonDocument doc=QJsonDocument::fromJson(receive.toUtf8());
QJsonObject obj=doc.object();
QJsonValue Current =obj.value("Cur");
QJsonValue Voltage =obj.value("Vol");
ui->current_Num->display(Current.toInt());
ui->voltage_Num->display(Voltage.toInt());
}
Widget::~Widget()
{
delete ui;
}
驗證:
(方法:通過兩個USB轉串口模塊TX和RX對接,其中一個端口通過串口助手發(fā)送JSON字符,注意波特率需相同)文章來源:http://www.zghlxwxcb.cn/news/detail-514880.html
LCD Number還可以更改顏色樣式:
通過styleSheet屬性即可更改:
color是字體顏色,background-color是背景色文章來源地址http://www.zghlxwxcb.cn/news/detail-514880.html
到了這里,關于QT Creator寫一個簡單的電壓電流顯示器的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!