QT串口

1、pro 文件添加

  QT += serialport

2、新建类MySerial

#ifndef MYSERIAL_H
#define MYSERIAL_H

#include <QObject>
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
#include <QDebug>

//如果不继承自QSerialPort也要继承自QObject,因为要使用信号与槽
class MySerial : public QSerialPort
{
    Q_OBJECT
private slots:
  //  void receiver(void);
public:
    MySerial();
    ~MySerial();
    int MySrtialInit(QString port_name, int baudrate, int bits, char parity, QString stop, char flow); //串口初始化
};

#endif // MYSERIAL_H
myserial.h
#include "myserial.h"

MySerial::MySerial()
{
}

MySerial::~MySerial()
{
    if(isOpen()) {
        close();
    }
}

/**
 * \brief 串口初始化
 *
 * \param[in] port_name:串口名,需与设备管理器上的COM口一致,如"COM1"
 * \param[in] baudrate:波特率
 *              #1200
 *              #2400
 *              #4800
 *              #9600
 *              #19200
 *              #38400
 *              #57600
 *              #115200
 * \param[in] bits:数据位
 *              #{5, 6, 7, 8}
 * \param[in] parity:校验位
 *              #'n'/'N':无校验
 *              #'e'/'E':偶校验
 *              #'o'/'O':奇校验
 *              #'0':0校验,或space parity,校验位始终为0
 *              #'1':1校验,或mark parity,校验位始终为1
 * \param[in] stop:停止位
 *              #{"1", "1.5", "2"}
 * \param[in] flow:流控
 *              #'n'/'N':不使用流控
 *              #'h'/'H':硬件流控
 *              #'s'/'S':软件流控
 *
 * \retval 成功返回0,失败返回-1
 */
int MySerial::MySrtialInit(QString port_name, int baudrate, int bits, char parity, QString stop, char flow)
{
    setPortName(port_name);

    //检查串口是否已经打开
    if(isOpen()) {
        qDebug() << port_name << " is opened";
        return -1;
    }

    //打开串口
    if(!open(QIODevice::ReadWrite)) {
        qDebug() << port_name << "open failed";
        return -1;
    }

    //设置波特率和读写方向,可以传入第2个参数设置读写方向,默认值就是可读可写
    setBaudRate(QSerialPort::BaudRate(baudrate));

    //设置数据位
    setDataBits(QSerialPort::DataBits(bits));

    //设置校验位
    switch (parity) {
        case 'n':
        case 'N':
            setParity(QSerialPort::NoParity);  //无校验
        break;

        case 'e':
        case 'E':
            setParity(QSerialPort::EvenParity);  //偶校验
        break;

        case 'o':
        case 'O':
            setParity(QSerialPort::OddParity);  //奇校验
        break;

        case '0':
            setParity(QSerialPort::SpaceParity);  //0校验
        break;

        case '1':
            setParity(QSerialPort::MarkParity);  //1校验
        break;

        default:
            return -1;
    }

    //设置停止位
    if (stop == "1") {
        setStopBits(QSerialPort::OneStop);  //1位停止位
    } else if (stop == "1.5") {
        setStopBits(QSerialPort::OneAndHalfStop);  //1.5位停止位
    } else if (stop == "2") {
        setStopBits(QSerialPort::TwoStop);  //2位停止位
    } else {
        return -1;
    }

    //设置流控
    switch (flow) {
        case 'n':
        case 'N':
            setFlowControl(QSerialPort::NoFlowControl); //无流控
        break;

        case 'h':
        case 'H':
            setFlowControl(QSerialPort::HardwareControl); //硬件流控
        break;

        case 's':
        case 'S':
            setFlowControl(QSerialPort::SoftwareControl); //软件流控
        break;

        default:
            return -1;
    }

    //连接信号槽
//    connect(this, SIGNAL(readyRead()), this, SLOT(receiver()));

    return 0;
}


//void MySerial::receiver(void)
//{
//    QString dat = readAll();
//    qDebug() << "read data:" << dat;
//}
myserial.cpp

3、定义类、连接信号和槽

serial.MySrtialInit("COM6", 9600, 8, 'N', "1", 'N');
    connect(&serial,&QSerialPort::readyRead,this,&Widget::ReadData);     //连接接收数据函数信号槽
widget.cpp

4、数据的接收(防止分帧处理)

       QByteArray data;
       disconnect(&serial,&QSerialPort::readyRead,this,&Widget::ReadData);     //连接接收数据函数信号槽
       while(serial.waitForReadyRead(100));
       connect(&serial,&QSerialPort::readyRead,this,&Widget::ReadData);     //连接接收数据函数信号槽

       data = serial.readAll();                      // 读取数据
       QString tempData = data.toHex(); // 显示为 "7a 07 13 04 fa"

       qDebug() << "receive : " << tempData;
       if(!data.isEmpty())                                 // 接收到数据
ReadData

 

posted @ 2022-08-17 16:49  Tankiii  阅读(67)  评论(0)    收藏  举报