首页 > 软件开发 > 编程语言 >

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

来源:互联网 2023-03-17 00:28:13 95

Qt软件编程,windows下的Qt编程,实现功能串口通信,数据发送和接收。ubT办公区 - 实用经验教程分享!

根据协议编写打印机串口通信程序。ubT办公区 - 实用经验教程分享!

工具/原料

  • windows xp 系统一个
  • Qt 5.4.1软件安装包

方法/步骤

  • 1

    新建一个Qt项目:ubT办公区 - 实用经验教程分享!

    文件->新建文件或项目(ctrl n)ubT办公区 - 实用经验教程分享!

    用Qt编写一个串口通讯程序ubT办公区 - 实用经验教程分享!

  • 2

    单机 choose 之后ubT办公区 - 实用经验教程分享!

    用Qt编写一个串口通讯程序ubT办公区 - 实用经验教程分享!

  • 3

    全部下一步到完成ubT办公区 - 实用经验教程分享!

  • 4

    成功建立一个Qt Widgets ApplicationubT办公区 - 实用经验教程分享!

    用Qt编写一个串口通讯程序ubT办公区 - 实用经验教程分享!

  • 5

    新建一个管理SerialPort的类 右击项目名字->添加新文件 弹出 如下框:ubT办公区 - 实用经验教程分享!

    用Qt编写一个串口通讯程序ubT办公区 - 实用经验教程分享!

  • 6

    选择C Class,单机 choose 弹出如下框: 并填写 单机下一步 之后 单机完成ubT办公区 - 实用经验教程分享!

    用Qt编写一个串口通讯程序ubT办公区 - 实用经验教程分享!

  • 7

    编写SPComm类:ubT办公区 - 实用经验教程分享!

    在SPComm.h中加入头文件ubT办公区 - 实用经验教程分享!

    #include QtSerialPort/QtSerialPort>ubT办公区 - 实用经验教程分享!

    用Qt编写一个串口通讯程序ubT办公区 - 实用经验教程分享!

  • 8

    在头文件中 声明串口功能:ubT办公区 - 实用经验教程分享!

    bool isOpen() const;ubT办公区 - 实用经验教程分享!

    ubT办公区 - 实用经验教程分享!

    void setPortName(const QString &name);ubT办公区 - 实用经验教程分享!

    QString portName() const;ubT办公区 - 实用经验教程分享!

    ubT办公区 - 实用经验教程分享!

    void setBaudRate(int baudRate);ubT办公区 - 实用经验教程分享!

    int baudRate() const;ubT办公区 - 实用经验教程分享!

    ubT办公区 - 实用经验教程分享!

    virtual bool open();ubT办公区 - 实用经验教程分享!

    virtual void close();ubT办公区 - 实用经验教程分享!

    virtual bool clear();ubT办公区 - 实用经验教程分享!

    ubT办公区 - 实用经验教程分享!

    int readData(char *buffer, int count, int timeout = 1000);ubT办公区 - 实用经验教程分享!

    int writeData(char *data, int size);ubT办公区 - 实用经验教程分享!

    int write(char ch);ubT办公区 - 实用经验教程分享!

    ubT办公区 - 实用经验教程分享!

    protected:ubT办公区 - 实用经验教程分享!

    QString m_portName;ubT办公区 - 实用经验教程分享!

    int m_baudRate;ubT办公区 - 实用经验教程分享!

    QSerialPort *m_serialPort;ubT办公区 - 实用经验教程分享!

    用Qt编写一个串口通讯程序ubT办公区 - 实用经验教程分享!

  • 9

    在CPP文件中实现对应的功能:ubT办公区 - 实用经验教程分享!

    ubT办公区 - 实用经验教程分享!

    //这个函数用来设置波特率,打开串口的时候用到ubT办公区 - 实用经验教程分享!

    static QSerialPort::BaudRate getBaudRate(int baudRate)ubT办公区 - 实用经验教程分享!

    {ubT办公区 - 实用经验教程分享!

    switch (baudRate)ubT办公区 - 实用经验教程分享!

    {ubT办公区 - 实用经验教程分享!

    case 1200:ubT办公区 - 实用经验教程分享!

    return QSerialPort::Baud1200;ubT办公区 - 实用经验教程分享!

    case 2400:ubT办公区 - 实用经验教程分享!

    return QSerialPort::Baud2400;ubT办公区 - 实用经验教程分享!

    case 4800:ubT办公区 - 实用经验教程分享!

    return QSerialPort::Baud4800;ubT办公区 - 实用经验教程分享!

    case 9600:ubT办公区 - 实用经验教程分享!

    return QSerialPort::Baud9600;ubT办公区 - 实用经验教程分享!

    case 19200:ubT办公区 - 实用经验教程分享!

    return QSerialPort::Baud19200;ubT办公区 - 实用经验教程分享!

    case 38400:ubT办公区 - 实用经验教程分享!

    return QSerialPort::Baud38400;ubT办公区 - 实用经验教程分享!

    case 57600:ubT办公区 - 实用经验教程分享!

    return QSerialPort::Baud57600;ubT办公区 - 实用经验教程分享!

    case 115200:ubT办公区 - 实用经验教程分享!

    return QSerialPort::Baud115200;ubT办公区 - 实用经验教程分享!

    default:ubT办公区 - 实用经验教程分享!

    return QSerialPort::UnknownBaud;ubT办公区 - 实用经验教程分享!

    }ubT办公区 - 实用经验教程分享!

    }ubT办公区 - 实用经验教程分享!

    ubT办公区 - 实用经验教程分享!

    //这个函数用来设置串口的名字ubT办公区 - 实用经验教程分享!

    //window 下用"com1" linux下用"/dev/ttyS0"ubT办公区 - 实用经验教程分享!

    void SPComm::setPortName(const QString &name)ubT办公区 - 实用经验教程分享!

    {ubT办公区 - 实用经验教程分享!

    m_portName = name;ubT办公区 - 实用经验教程分享!

    }ubT办公区 - 实用经验教程分享!

    ubT办公区 - 实用经验教程分享!

    //用来获取串口的名字ubT办公区 - 实用经验教程分享!

    QString SPComm::portName() constubT办公区 - 实用经验教程分享!

    {ubT办公区 - 实用经验教程分享!

    return m_portName;ubT办公区 - 实用经验教程分享!

    }ubT办公区 - 实用经验教程分享!

    ubT办公区 - 实用经验教程分享!

    //设置波特率 9600 19200 38400ubT办公区 - 实用经验教程分享!

    void SPComm::setBaudRate(int baudRate)ubT办公区 - 实用经验教程分享!

    {ubT办公区 - 实用经验教程分享!

    m_baudRate = baudRate;ubT办公区 - 实用经验教程分享!

    }ubT办公区 - 实用经验教程分享!

    //用来打开串口,调用前,先设置串口名字和波特率ubT办公区 - 实用经验教程分享!

    bool SPComm::open()ubT办公区 - 实用经验教程分享!

    {ubT办公区 - 实用经验教程分享!

    if (m_serialPort->isOpen())ubT办公区 - 实用经验教程分享!

    {ubT办公区 - 实用经验教程分享!

    return true;ubT办公区 - 实用经验教程分享!

    }ubT办公区 - 实用经验教程分享!

    ubT办公区 - 实用经验教程分享!

    m_serialPort->setPortName(m_portName);ubT办公区 - 实用经验教程分享!

    m_serialPort->setBaudRate(getBaudRate(m_baudRate));ubT办公区 - 实用经验教程分享!

    m_serialPort->setParity(QSerialPort::NoParity);ubT办公区 - 实用经验教程分享!

    m_serialPort->setDataBits(QSerialPort::Data8);ubT办公区 - 实用经验教程分享!

    m_serialPort->setStopBits(QSerialPort::OneStop);ubT办公区 - 实用经验教程分享!

    m_serialPort->setFlowControl(QSerialPort::NoFlowControl);ubT办公区 - 实用经验教程分享!

    m_serialPort->setReadBufferSize(1024);ubT办公区 - 实用经验教程分享!

    return m_serialPort->open(QSerialPort::ReadWrite);ubT办公区 - 实用经验教程分享!

    }ubT办公区 - 实用经验教程分享!

  • 10

    //用来关闭串口ubT办公区 - 实用经验教程分享!

    void SPComm::close()ubT办公区 - 实用经验教程分享!

    {ubT办公区 - 实用经验教程分享!

    if (m_serialPort->isOpen())ubT办公区 - 实用经验教程分享!

    {ubT办公区 - 实用经验教程分享!

    m_serialPort->close();ubT办公区 - 实用经验教程分享!

    }ubT办公区 - 实用经验教程分享!

    }ubT办公区 - 实用经验教程分享!

  • 11

    //重启串口,清楚数据ubT办公区 - 实用经验教程分享!

    bool SPComm::clear()ubT办公区 - 实用经验教程分享!

    {ubT办公区 - 实用经验教程分享!

    if (m_serialPort->isOpen())ubT办公区 - 实用经验教程分享!

    {ubT办公区 - 实用经验教程分享!

    m_serialPort->clear();ubT办公区 - 实用经验教程分享!

    this->close();ubT办公区 - 实用经验教程分享!

    return this->open();ubT办公区 - 实用经验教程分享!

    }ubT办公区 - 实用经验教程分享!

    return false;ubT办公区 - 实用经验教程分享!

    }ubT办公区 - 实用经验教程分享!

  • 12

    //用来接收串口发来的数据ubT办公区 - 实用经验教程分享!

    int SPComm::readData(char *buffer, int count, int timeout)ubT办公区 - 实用经验教程分享!

    {ubT办公区 - 实用经验教程分享!

    int len = 0;ubT办公区 - 实用经验教程分享!

    foreverubT办公区 - 实用经验教程分享!

    {ubT办公区 - 实用经验教程分享!

    int n = m_serialPort->read(&buffer[len], count - len);ubT办公区 - 实用经验教程分享!

    if (n == -1)ubT办公区 - 实用经验教程分享!

    {ubT办公区 - 实用经验教程分享!

    return -1;ubT办公区 - 实用经验教程分享!

    }ubT办公区 - 实用经验教程分享!

    else if (n == 0 && !m_serialPort->waitForReadyRead(timeout))ubT办公区 - 实用经验教程分享!

    {ubT办公区 - 实用经验教程分享!

    return -2;ubT办公区 - 实用经验教程分享!

    }ubT办公区 - 实用经验教程分享!

    elseubT办公区 - 实用经验教程分享!

    {ubT办公区 - 实用经验教程分享!

    len = n;ubT办公区 - 实用经验教程分享!

    if (count == len)ubT办公区 - 实用经验教程分享!

    break;ubT办公区 - 实用经验教程分享!

    }ubT办公区 - 实用经验教程分享!

    }ubT办公区 - 实用经验教程分享!

    ubT办公区 - 实用经验教程分享!

    return len;ubT办公区 - 实用经验教程分享!

    }ubT办公区 - 实用经验教程分享!

  • 13

    //发送数据到串口 比如发送协议ubT办公区 - 实用经验教程分享!

    int SPComm::writeData(char *data, int size)ubT办公区 - 实用经验教程分享!

    {ubT办公区 - 实用经验教程分享!

    int len = 0;ubT办公区 - 实用经验教程分享!

    foreverubT办公区 - 实用经验教程分享!

    {ubT办公区 - 实用经验教程分享!

    int n = m_serialPort->write(&data[len], size - len);ubT办公区 - 实用经验教程分享!

    if (n == -1)ubT办公区 - 实用经验教程分享!

    {ubT办公区 - 实用经验教程分享!

    return -1;ubT办公区 - 实用经验教程分享!

    }ubT办公区 - 实用经验教程分享!

    elseubT办公区 - 实用经验教程分享!

    {ubT办公区 - 实用经验教程分享!

    len = n;ubT办公区 - 实用经验教程分享!

    if (size == len)ubT办公区 - 实用经验教程分享!

    break;ubT办公区 - 实用经验教程分享!

    }ubT办公区 - 实用经验教程分享!

    }ubT办公区 - 实用经验教程分享!

    ubT办公区 - 实用经验教程分享!

    return len;ubT办公区 - 实用经验教程分享!

    }ubT办公区 - 实用经验教程分享!

  • 13相关内容未经授权抓取自百度经验
  • 14

    //别忘记了ubT办公区 - 实用经验教程分享!

    //构造函数 添加初始化数据 ubT办公区 - 实用经验教程分享!

    SPComm::SPComm(QObject *parent) : QObject(parent)ubT办公区 - 实用经验教程分享!

    {ubT办公区 - 实用经验教程分享!

    m_serialPort = new QSerialPort();ubT办公区 - 实用经验教程分享!

    m_baudRate = 9600;ubT办公区 - 实用经验教程分享!

    m_portName = "";ubT办公区 - 实用经验教程分享!

    }ubT办公区 - 实用经验教程分享!

    //析构的时候 删除 数据ubT办公区 - 实用经验教程分享!

    SPComm::~SPComm()ubT办公区 - 实用经验教程分享!

    {ubT办公区 - 实用经验教程分享!

    delete m_serialPort;ubT办公区 - 实用经验教程分享!

    }ubT办公区 - 实用经验教程分享!

  • 15

    串口类编写完成:ubT办公区 - 实用经验教程分享!

    测试一下能否调用:ubT办公区 - 实用经验教程分享!

    1.双击mainwindow.uiubT办公区 - 实用经验教程分享!

    用Qt编写一个串口通讯程序ubT办公区 - 实用经验教程分享!

  • 16

    切换到了设计模式:ubT办公区 - 实用经验教程分享!

    2 拖入按钮ubT办公区 - 实用经验教程分享!

    用Qt编写一个串口通讯程序ubT办公区 - 实用经验教程分享!

  • 17

    3 双击按钮,设置按钮的名字ubT办公区 - 实用经验教程分享!

    用Qt编写一个串口通讯程序ubT办公区 - 实用经验教程分享!

  • 18

    4设置好按钮的名字为 打开串口>ubT办公区 - 实用经验教程分享!

    ubT办公区 - 实用经验教程分享!

    5右击按钮->转到曹->选择clicked()->点击OK ubT办公区 - 实用经验教程分享!

    跳转到了 一下界面ubT办公区 - 实用经验教程分享!

    用Qt编写一个串口通讯程序ubT办公区 - 实用经验教程分享!

  • 19

    为这个按钮添加功能代码:ubT办公区 - 实用经验教程分享!

    首先在mainwindow.h中添加SPComm.h的头文件ubT办公区 - 实用经验教程分享!

    用Qt编写一个串口通讯程序ubT办公区 - 实用经验教程分享!

  • 20

    在mainwindow.h头文件中,添加这行代码SPComm *m_spcomm;ubT办公区 - 实用经验教程分享!

    private: ubT办公区 - 实用经验教程分享!

    Ui::MainWindow *ui;ubT办公区 - 实用经验教程分享!

    SPComm *m_spcomm;ubT办公区 - 实用经验教程分享!

    用Qt编写一个串口通讯程序ubT办公区 - 实用经验教程分享!

  • 21

    在mainwindow.cpp的构造函数中ubT办公区 - 实用经验教程分享!

    添加 m_spcomm = new SPComm();ubT办公区 - 实用经验教程分享!

    ubT办公区 - 实用经验教程分享!

    析构函数中ubT办公区 - 实用经验教程分享!

    添加delete m_spcomm;ubT办公区 - 实用经验教程分享!

    用Qt编写一个串口通讯程序ubT办公区 - 实用经验教程分享!

  • 22

    双击mainwindow.cpp 回到按钮那里添加功能ubT办公区 - 实用经验教程分享!

    ubT办公区 - 实用经验教程分享!

    void MainWindow::on_pushButton_clicked()ubT办公区 - 实用经验教程分享!

    {ubT办公区 - 实用经验教程分享!

    ubT办公区 - 实用经验教程分享!

    if(m_spcomm->isOpen())ubT办公区 - 实用经验教程分享!

    return;ubT办公区 - 实用经验教程分享!

    m_spcomm->setBaudRate(9600);ubT办公区 - 实用经验教程分享!

    m_spcomm->setPortName("com1");ubT办公区 - 实用经验教程分享!

    if(m_spcomm->open())ubT办公区 - 实用经验教程分享!

    qDebug() "打开串口成功";ubT办公区 - 实用经验教程分享!

    }ubT办公区 - 实用经验教程分享!

  • 23

    同上关闭串口的代码为ubT办公区 - 实用经验教程分享!

    void MainWindow::on_pushButton_2_clicked()ubT办公区 - 实用经验教程分享!

    {ubT办公区 - 实用经验教程分享!

    if(m_spcomm->isOpen())ubT办公区 - 实用经验教程分享!

    m_spcomm->close();ubT办公区 - 实用经验教程分享!

    qDebug() "关闭串口成功";ubT办公区 - 实用经验教程分享!

    }ubT办公区 - 实用经验教程分享!

  • 24

    点击 按钮 编译 并且运行成ubT办公区 - 实用经验教程分享!

    用Qt编写一个串口通讯程序ubT办公区 - 实用经验教程分享!

  • 25

    如果想编写一个打印机串口程序ubT办公区 - 实用经验教程分享!

    根据以上步骤 同理ubT办公区 - 实用经验教程分享!

    添加一个Printer类ubT办公区 - 实用经验教程分享!

    根据协议编发送指令,写打印机的功能。ubT办公区 - 实用经验教程分享!

    比如发送协议 进行 切纸 换行 打印数据ubT办公区 - 实用经验教程分享!

  • 以上方法由办公区教程网编辑摘抄自百度经验可供大家参考!ubT办公区 - 实用经验教程分享!


    标签: 编程语言

    办公区 Copyright © 2016-2023 www.bgqu.net. Some Rights Reserved. 备案号:湘ICP备2020019561号统计代码