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;
}
相关推荐
艾莉丝努力练剑9 分钟前
【LeetCode&数据结构】单链表的应用——反转链表问题、链表的中间节点问题详解
c语言·开发语言·数据结构·学习·算法·leetcode·链表
还债大湿兄2 小时前
《C++内存泄漏8大战场:Qt/MFC实战详解 + 面试高频陷阱破解》
c++·qt·mfc
倔强青铜34 小时前
苦练Python第18天:Python异常处理锦囊
开发语言·python
u_topian4 小时前
【个人笔记】Qt使用的一些易错问题
开发语言·笔记·qt
珊瑚里的鱼5 小时前
LeetCode 692题解 | 前K个高频单词
开发语言·c++·算法·leetcode·职场和发展·学习方法
AI+程序员在路上5 小时前
QTextCodec的功能及其在Qt5及Qt6中的演变
开发语言·c++·qt
xingshanchang5 小时前
Matlab的命令行窗口内容的记录-利用diary记录日志/保存命令窗口输出
开发语言·matlab
Risehuxyc5 小时前
C++卸载了会影响电脑正常使用吗?解析C++运行库的作用与卸载后果
开发语言·c++
AI视觉网奇5 小时前
git 访问 github
运维·开发语言·docker
不知道叫什么呀6 小时前
【C】vector和array的区别
java·c语言·开发语言·aigc