QT<27> Qt中编写串口通讯,例如读RFID、EKS等等

时间:2024-10-13 13:14:37

一、添加文件

①在项目中添加C++文件,继承自QObject

②添加必要模块以及头文件

项目pro文件添加 serialport模块

项目.h文件中添加头文件

#include <QSerialPort>
#include <QSerialPortInfo>

二、具体代码

①在.h文件中声明一个类对象

QSerialPort *serial;

并在.cpp构造函数中实例化

②定义一个public的打开串口函数,串口号、波特率、数据位等等可根据情况选择

sendMessage是一个自定义信号,可更换qdebug打印信息

void SerialRFID::Open_serial_RFID()
{
    QString portName = "COM8";
    QString baudRate = "9600";
    QSerialPortInfo info(portName);
    if(info.isBusy())
    {
        sendMessage("COM:" + portName + "--The serial port is occupied");
        return;
    }

    serial -> setPortName(portName);
    serial -> setBaudRate(baudRate.toInt());
    serial -> setStopBits(QSerialPort::TwoStop);
    serial -> setDataBits(QSerialPort::Data7);
    serial -> setParity(QSerialPort::EvenParity);
    serial -> setFlowControl(QSerialPort::NoFlowControl);
    bool flag = serial -> open(QIODevice::ReadWrite);
    if(!flag)
    {
        sendMessage("COM:" + portName + "--Failed to open serial port:");
        serial -> clearError();
    }
    else
    {
        sendMessage("COM:" + portName + "--The serial port is open:");
    }
}

③定义一个槽函数,并在构造函数中连接

connect(serial,SIGNAL(readyRead()),this,SLOT(slot_serialRead()));

在读串口数据槽函数中对读到的数据进行处理

void SerialRFID::slot_serialRead()
{
    QByteArray receiveBuf = serial -> readAll();
    QString RS = receiveBuf;
    。。。
}

 ④定义一个public类型函数进行写串口数据,参数可去掉

void SerialRFID::slot_readHRWordData(int address)
{
    QString startStr = "RDSTA101000064";
    char *readStr;
    startStr.append("*\r");
    QByteArray readBa = startStr.toUtf8();
    readStr = readBa.data();
    serial -> clear();
    serial -> write(readStr);
}