多语言展示
当前在线:579今日阅读:26今日分享:39

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

Qt软件编程,windows下的Qt编程,实现功能串口通信,数据发送和接收。根据协议编写打印机串口通信程序。
工具/原料
1

windows xp 系统一个

2

Qt 5.4.1软件安装包

方法/步骤
1

新建一个Qt项目:文件->新建文件或项目(ctrl+n)

2

单机 choose 之后

3

全部下一步到完成

4

成功建立一个Qt Widgets Application

5

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

6

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

7

编写SPComm类:在SPComm.h中加入头文件#include

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;

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  38400void 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

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

11

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

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

//发送数据到串口  比如发送协议 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

//别忘记了//构造函数 添加初始化数据   SPComm::SPComm(QObject *parent) : QObject(parent){    m_serialPort = new QSerialPort();    m_baudRate = 9600;    m_portName = '';}//析构的时候  删除 数据SPComm::~SPComm(){    delete m_serialPort;}

15

串口类编写完成:测试一下能否调用:1.双击mainwindow.ui

16

切换到了设计模式:2 拖入按钮

17

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

18

4设置好按钮的名字为 <打开串口>5右击按钮->转到曹->选择clicked()->点击OK  跳转到了 一下界面

19

为这个按钮添加功能代码:首先在mainwindow.h中添加SPComm.h的头文件

20

在mainwindow.h头文件中,添加这行代码 SPComm *m_spcomm;private:          Ui::MainWindow *ui;      SPComm *m_spcomm;

21

在mainwindow.cpp的构造函数中添加  m_spcomm = new SPComm();析构函数中 添加delete m_spcomm;

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() << '打开串口成功';}

23

同上关闭串口的代码为void MainWindow::on_pushButton_2_clicked(){    if(m_spcomm->isOpen())        m_spcomm->close();        qDebug() << '关闭串口成功';}

24

点击 按钮 编译 并且运行成

25

如果想编写一个打印机串口程序根据以上步骤 同理添加一个Printer类 根据协议编发送指令,写打印机的功能。比如发送协议  进行 切纸  换行  打印数据

推荐信息