Qt之打印机串口

  1. 新建一个Qt项目:

    文件->新建文件或项目(ctrl+n)

    用Qt编写一个串口通讯程序
  2. 2

    单机 choose 之后

    用Qt编写一个串口通讯程序
  3. 3

    全部下一步到完成

  4. 4

    成功建立一个Qt Widgets Application

    用Qt编写一个串口通讯程序
  5. 5

    新建一个管理SerialPort的类   右击项目名字->添加新文件  弹出  如下框:

    用Qt编写一个串口通讯程序
  6. 6

    选择C++ Class,单机 choose 弹出如下框: 并填写  单机下一步  之后  单机完成

    用Qt编写一个串口通讯程序
  7. 7

    编写SPComm类:

    在SPComm.h中加入头文件

    #include <QtSerialPort/QtSerialPort>

    用Qt编写一个串口通讯程序
  8. 8

    在头文件中 声明串口功能:

        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;

    用Qt编写一个串口通讯程序
  9. 9

    在CPP文件中实现对应的功能:

    //这个函数用来设置波特率,打开串口的时候用到

    static QSerialPort::BaudRate getBaudRate(int baudRate)

    {

        switch (baudRate)

        {

        case 1200:

            return QSerialPort::Baud1200;

        case 2400:

            return QSerialPort::Baud2400;

        case 4800:

            return QSerialPort::Baud4800;

        case 9600:

            return QSerialPort::Baud9600;

        case 19200:

            return QSerialPort::Baud19200;

        case 38400:

            return QSerialPort::Baud38400;

        case 57600:

            return QSerialPort::Baud57600;

        case 115200:

            return QSerialPort::Baud115200;

        default:

            return QSerialPort::UnknownBaud;

        }

    }

    //这个函数用来设置串口的名字

    //window 下用"com1"   linux下用"/dev/ttyS0"

    void SPComm::setPortName(const QString &name)

    {

        m_portName = name;

    }

    //用来获取串口的名字

    QString SPComm::portName() const

    {

        return m_portName;

    }

    //设置波特率 9600  19200  38400

    void SPComm::setBaudRate(int baudRate)

    {

        m_baudRate = baudRate;

    }

    //用来打开串口,调用前,先设置串口名字和波特率

    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);

    }

  10. 10

    //用来关闭串口

    void SPComm::close()

    {

        if (m_serialPort->isOpen())

        {

            m_serialPort->close();

        }

    }

  11. 11

    //重启串口,清楚数据

    bool SPComm::clear()

    {

        if (m_serialPort->isOpen())

        {

            m_serialPort->clear();

            this->close();

            return this->open();

        }

        return false;

    }

  12. 12

    //用来接收串口发来的数据

    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;

    }

  13. 13

    //发送数据到串口  比如发送协议 

    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;

    }

  14. 14

    //别忘记了

    //构造函数 添加初始化数据   

    SPComm::SPComm(QObject *parent) : QObject(parent)

    {

        m_serialPort = new QSerialPort();

        m_baudRate = 9600;

        m_portName = "";

    }

    //析构的时候  删除 数据

    SPComm::~SPComm()

    {

        delete m_serialPort;

    }

  15. 15

    串口类编写完成:

    测试一下能否调用:

    1.双击mainwindow.ui

    用Qt编写一个串口通讯程序


  16. 16

    切换到了设计模式:

    2 拖入按钮

    用Qt编写一个串口通讯程序





  17. 17

    3 双击按钮,设置按钮的名字

    用Qt编写一个串口通讯程序

  18. 18

    4设置好按钮的名字为 <打开串口>

    5右击按钮->转到曹->选择clicked()->点击OK  

    跳转到了 一下界面

    用Qt编写一个串口通讯程序




  19. 19

    为这个按钮添加功能代码:

    首先在mainwindow.h中添加SPComm.h的头文件

    用Qt编写一个串口通讯程序




  20. 20

    在mainwindow.h头文件中,添加这行代码 SPComm *m_spcomm;

    private:    

          Ui::MainWindow *ui;

          SPComm *m_spcomm;

    用Qt编写一个串口通讯程序





  21. 在mainwindow.cpp的构造函数中

  22. 添加  m_spcomm = new SPComm();

    析构函数中 

    添加delete m_spcomm;

    用Qt编写一个串口通讯程序



  23. 22

    双击mainwindow.cpp 回到按钮那里添加功能

    void MainWindow::on_pushButton_clicked()

    {

        if(m_spcomm->isOpen())

            return;

        m_spcomm->setBaudRate(9600);

        m_spcomm->setPortName("com1");

        if(m_spcomm->open())

            qDebug() << "打开串口成功";

    }

  24. 23

    同上关闭串口的代码为

    void MainWindow::on_pushButton_2_clicked()

    {

        if(m_spcomm->isOpen())

            m_spcomm->close();

            qDebug() << "关闭串口成功";

    }

  25. 24

    点击 按钮 编译 并且运行成

    用Qt编写一个串口通讯程序





  26. 25

    如果想编写一个打印机串口程序

    根据以上步骤 同理

    添加一个Printer类 

    根据协议编发送指令,写打印机的功能。

    比如发送协议  进行 切纸  换行  打印数据

猜你喜欢

转载自blog.csdn.net/u014252478/article/details/80389395