Qt——QtSerialPort/QSerialPort(一)

1.在H文件中创建串口类class SPComm ——定义相关的变量,函数
2.在Cpp文件中,完善函数功能
3.两者之间的桥梁是基于QSerialPort *m_serialport这个变量
4.例子
如:m_serialport->isOpen()来判断COM口是否打开,进一步完善SPComm中 bool isOpen() const; 这个函数。
5.注意
在函数实现的过程中,第一要注意,在func名前加类名 SPComm :: func();
第二,函数名一定要一致,如bool isOpen() const 一定要加const ,否则会出错。

#ifndef SERIALCOM_H
#define SERIALCOM_H

#include 
#include 
#include 

class SPComm :  public QObject
{
    Q_OBJECT
public :
    explicit SPComm(QObject *parent = 0);
    ~SPComm();

    bool isOpen() const;

    void setPortName(const QString &name);
    QString portName() const;
    void setBaudRate(int baudRate);
    int baudRate() const;

    virtual bool open();
    virtual void close();
    virtual bool clear();

    int readData(char *buffer, int count, int timeout = 1000);
    int writeData(char *data, int size);
    int write(char ch);

protected :
    QString m_portname;
    int m_baudRate;
    QSerialPort *m_serialPort;

signals :

public  slots:

};


#endif // SERIALCOM_H
#include "mainwindow.h"
#include 
#include 
#include 
#include 
#include 

static QSerialPort::BaudRate getBaudRate(int baudRate)
{
    switch (baudRate)
    {
    case 1200:
        return QSerialPort ::Baud1200;
        break;
    case 2400:
        return QSerialPort::Baud2400;
        break;
    case 4800:
        return QSerialPort ::Baud4800;
        break;
    case 9600:
        return QSerialPort ::Baud9600;
        break;
    case 19200:
        return QSerialPort ::Baud19200;
        break;
    case 38400:
        return QSerialPort ::Baud38400;
        break;
    case 57600:
        return QSerialPort ::Baud57600;
        break;
    case 115200:
        return QSerialPort ::Baud115200;
        break;
    default :
        return QSerialPort ::UnknownBaud;
    }
}

//设置串口名
void SPComm::setPortName(const QString &name)
{
    m_portname = name;
}

QString SPComm::portName() const
{
    return m_portname;
}

//设置波特率
void SPComm::setBaudRate(int baudRate)
{
    m_baudRate = baudRate;
}
//p判断串口是否打开
bool SPComm::isOpen() const
{
    if(m_serialPort->isOpen())
        return true;
    else
        return false;
}


//打开串口
bool SPComm::open()
{
    if(m_serialPort->isOpen())
    {
        return true;
    }
    m_serialPort->setPortName(m_portname);
    m_serialPort->setBaudRate(getBaudRate(m_baudRate));
    m_serialPort->setParity(QSerialPort::NoParity);
    m_serialPort->setDataBits(QSerialPort::Data8);
    m_serialPort->setStopBits(QSerialPort::OneStop);
    m_serialPort->setFlowControl(QSerialPort::NoFlowControl);
    m_serialPort->setReadBufferSize(1024);

    return m_serialPort->open(QSerialPort::ReadWrite);
}

//关闭串口
void SPComm::close()
{
    if(m_serialPort->isOpen())
    {
        m_serialPort->close();
    }
}

//重启串口并清除数据
bool SPComm::clear()
{
    if(m_serialPort->isOpen())
    {
        m_serialPort->clear(); //清除
        this->close();
        return this->open();   //重启
    }
    return false;
}

//接受数据
int SPComm::readData(char *buffer, int count, int timeout)
{
    int len = 0;
    forever
    {
        int n = m_serialPort->read(&buffer[len],count-len);
        if(n == -1)
        {
            return -1;
        }
        else if(n == 0 && m_serialPort->waitForReadyRead(timeout))
        {
            return -2;
        }
        else
        {
            len += n;
            if(count == len )
            break;
        }
    }
    return len;
}

//发送数据
int SPComm::writeData(char *data, int size)
{
    int len = 0;
    forever
    {
        int n = m_serialPort->write(&data[len],size-len);
        if(n == -1)
        {
            return -1;
        }
        else
        {
            len += n;
            if(size == len)
                break;
        }
    }
    return len;
}


//够着函数并添加初始化参数
SPComm::SPComm(QObject *parent) :QObject(parent)
{
    m_serialPort = new QSerialPort();
    m_baudRate = 115200;
    m_portname = "";
}

//析构
SPComm::~SPComm()
{
    delete m_serialPort;
}

注意将指针delete
本文涉及到的有 m_serialPort —— QSerialPort类 protected
m_spcomm —— SPComm 类 private
运行结果:
Qt——QtSerialPort/QSerialPort(一)_第1张图片
这是经过测验的cpp与h文件,版本Qt5.7,串口功能会进一步完善……

你可能感兴趣的:(Qt串口)