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;
}
相关推荐
一只幸运猫.3 小时前
JAVA后端面试题
java·开发语言
还是阿落呀3 小时前
基本控制结构
开发语言·c++·算法
笑虾3 小时前
Win10 修改注册表 让鼠标悬停PNG上时 tip 始终显示分辨率
开发语言·javascript·ecmascript
lolo大魔王3 小时前
Go语言的并发、协调创建和通信机制
开发语言·golang
xxyy8883 小时前
关于labelimg安装后在标注过程中闪退和死机的问题处理
开发语言·python
JAVA面经实录9173 小时前
Java开发工程基础完整手册(企业实战完整版)
java·开发语言·git·ci/cd·svn·github·intellij idea
skywalk81633 小时前
【文言心】- 中文编程语言> 一门追求同像性(Homoiconicity)的中文编程语言,代码即数据,数据即代码。
开发语言
南境十里·墨染春水3 小时前
C++笔记 forward完美转发
开发语言·c++·笔记
代码羊羊3 小时前
Rust 格式化输出完全攻略:从入门到精通
开发语言·后端·rust
不会编程的懒洋洋3 小时前
WPF XAML+布局+控件
xml·开发语言·c#·视觉检测·wpf·机器视觉·视图