Qt——QtSerialPort/QSerialPort(一)

来源:互联网 发布:oracle update sql语句 编辑:程序博客网 时间:2024/05/17 09:15

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 <QObject>#include <QtSerialPort/QSerialPort>#include <QtSerialPort/QSerialPortInfo>class SPComm :  public QObject{    Q_OBJECTpublic :    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 <QApplication>#include <QObject>#include <QtSerialPort/QSerialPort>#include <QtSerialPort/QSerialPortInfo>#include <serialcom.h>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
运行结果:
这里写图片描述
这是经过测验的cpp与h文件,版本Qt5.7,串口功能会进一步完善……