Qt同步读取串口

头文件

复制代码
#include "InsScpi.h"
#include <QObject>
#include <QSerialPort>


class TestSerial : public QObject
{
    Q_OBJECT
public:
    explicit TestSerial(QObject *parent = nullptr);

    //打开设备
    bool    openDevice(const QString &portName);

    //关闭设备
    void    closeDevice();

    //发送数据
    bool    write(const char* cmd, qint64 maxSize);

	//-- 获取温度 
	//-- 返回字符串格式:
	//-- "22.3408    22.7402    24.3184    24.6043"
	QString getTemp(bool& ok, int msec = 500);

signals:
    void    sig_finishReadSerial();     //完成串口读取信号

private:
    void    init();                     //初始化函数

private:
    QSerialPort*    m_serialPort    = nullptr;  //串口
    QString         m_portName      = "COM1";   //串口号

    //串口描述信息
    using QtSP = QSerialPort;
    QtSP::BaudRate   m_baudRate  = QtSP::Baud115200;    //波特率
    QtSP::DataBits   m_dataBits  = QtSP::Data8;         //数据位长度
    QtSP::Parity     m_parity    = QtSP::NoParity;      //校验位
    QtSP::StopBits   m_stopBits  = QtSP::OneStop;       //停止位
};

实现

复制代码
#include <QDebug>
#include <QEventLoop>
#include <QTimer>

TestSerial::TestSerial( QObject *parent)
    : QObject{parent}
{
    (void)init();
}

void TestSerial::init()
{
    //[1] 实例化串口对象
    if (!m_serialPort)
    {
        m_serialPort = new QSerialPort();
    }
}

bool TestSerial::openDevice(const QString &portName)
{
    //[1] 判断串口对象是否实例化
    if (!m_serialPort)
    {
        qDebug() << "serial obj is null";
        return false;
    }

    //[2] 判断串口是否已经打开
    if (m_serialPort->isOpen())
    {
        qDebug() << "device is already open";
        return false;
    }

    //[3] 设置串口信息
    m_portName = portName;
    m_serialPort->setPortName(m_portName);
    m_serialPort->setBaudRate(m_baudRate, QSerialPort::AllDirections);
    m_serialPort->setDataBits(m_dataBits);
    m_serialPort->setParity(m_parity);
    m_serialPort->setStopBits(m_stopBits);
    m_serialPort->setFlowControl(QSerialPort::NoFlowControl);

    //[4] 打开串口
    return m_serialPort->open(QIODevice::ReadWrite);
}

void TestSerial::closeDevice()
{
    //[1] 判断串口对象是否实例化
    if (!m_serialPort)
    {
        qDebug() << "serial obj is null";
        return;
    }

    //[2] 关闭串口
    m_serialPort->close();
}

bool TestSerial::write(const char *cmd, qint64 maxSize)
{
    //[1] 判断串口对象是否实例化
    if (!m_serialPort)
    {
        qDebug() << "serial obj is null";
        return false;
    }

    //[2] 判断串口是否打开
    if (!m_serialPort->isOpen())
    {
        qDebug() << "serial is not open";
        return false;
    }

    //[3] 发送数据
    if(maxSize != m_serialPort->write(cmd, maxSize))
    {
        qDebug() << "send serial data failed";
        return false;
    }
    return true;
}

//-- 获取温度 
//-- 返回字符串格式:
//-- "22.3408    22.7402    24.3184    24.6043"
QString TestSerial::getTemp(bool& ok, int msec)
{
	static QString ret;
	ret.clear();
	if (!m_serialPort){
		qDebug() << "serial obj is null";
		return "";
	}
	QEventLoop loop;
	QObject::connect(this, &TestSerial::sig_finishReadSerial, &loop, &QEventLoop::quit);
	QTimer::singleShot(msec, this, [&]{ emit sig_finishReadSerial(); });

	QByteArray cmdBa = "getTemp()";
	m_serialPort->clear();
	if(0 != cmdBa.size()) {
		if(cmdBa.size() == m_serialPort->write(cmdBa)) ok = true;
		else ok = false;
	}
	auto async = QObject::connect(m_serialPort, &QSerialPort::readyRead, [&]() {
		auto rcvData = m_serialPort->readAll();
		ret = QString::fromLatin1(rcvData);
		emit sig_finishReadSerial();
	});

	loop.exec();
	QObject::disconnect(async);
	return ret;
}
相关推荐
光军oi28 分钟前
全栈开发杂谈————JAVA微服务全套技术栈详解
java·开发语言·微服务
帮帮志28 分钟前
目录【系列文章目录】-(关于帮帮志,关于作者)
java·开发语言·python·链表·交互
执尺量北斗35 分钟前
LinkMate 智能会议室系统:基于 Qt / QML / WebRTC / FFmpeg / Whisper / OpenGL 的实时音视频会议平台
qt·ffmpeg·webrtc
qiuiuiu4131 小时前
正点原子RK3568学习日记-GIT
linux·c语言·开发语言·单片机
草莓熊Lotso1 小时前
《C++ STL list 完全指南:从基础操作到特性对比,解锁链表容器高效用法》
开发语言·c++·list
二王一个今2 小时前
Python打包成exe(windows)或者app(mac)
开发语言·python·macos
C嘎嘎嵌入式开发6 小时前
(2)100天python从入门到拿捏
开发语言·python
Stanford_11067 小时前
如何利用Python进行数据分析与可视化的具体操作指南
开发语言·c++·python·微信小程序·微信公众平台·twitter·微信开放平台
Vallelonga8 小时前
Rust 中的数组和数组切片引用
开发语言·rust
Kiri霧8 小时前
Rust模式匹配详解
开发语言·windows·rust