QT5 串口应用

qt4的网上一大堆,qt5的在网上好像没有,自己摸索出来了。这是原文链接! http://blog.csdn.net/qq363692146/article/details/10366713  希望转发者保留,多谢。

QT5的有一大好处就是  【串口正确初始化!!!】qt4的初始化常常要借助其他软件。

正文开始,因为用到信号和槽,所以就直接用GUI程序,建立QMainWindow吧

首先,pro文件,你懂的
[cpp] view plaincopyprint?
QT       += serialport  


接着,在mainwindow.h文件中修改:
1.增加头文件
[cpp] view plaincopyprint?
#include <QDebug>         //可由可无,看你是否用qdebug或qCritical等输出  
#include <QSerialPort>  

2.增加下面的后三行,增加串口成员 和 读取槽
[cpp] view plaincopyprint?
private:  
    Ui::MainWindow *ui;  
    QSerialPort *serial;  
private slots:  
    void serialRead();  

最后,进入mainwindow.cpp这篇可以直接复制
我连ui->setupUi(this);都删了,因为根本没用到界面【直接在应用程序输出那里显示,界面只是为了connect方法】,不懂的请细看注释,再不懂就问我吧
提示:我在我的单片机或arm设置发送的最后一位数据是‘~’,即“123456~”的形式,用~符号识别是否真的结束【因为串口常常只接受一半数据,就触发serialRead函数了,例如常常先发送"123"再发送"456~",然后读取就出错了,这是个秘密!!】
[cpp] view plaincopyprint?
#include "mainwindow.h"  
#include "ui_mainwindow.h"  
MainWindow::MainWindow(QWidget *parent) :  
    QMainWindow(parent)  
{  
    serial = new QSerialPort("COM4");       //串口号,一定要对应好,大写!!!下面这些设置都是针对单片机11.0592的晶振的,但是串口号就要修改,假如不是这种情况,那么波特率之类很可能也要改!!  
    serial->open(QIODevice::ReadWrite);      //读写打开  
    serial->setBaudRate(QSerialPort::Baud9600);  //波特率  
    serial->setDataBits(QSerialPort::Data8); //数据位  
    serial->setParity(QSerialPort::NoParity);    //无奇偶校验  
    serial->setStopBits(QSerialPort::OneStop);   //无停止位  
    serial->setFlowControl(QSerialPort::NoFlowControl);  //无控制  
    connect(serial,SIGNAL(readyRead()),this,SLOT(serialRead()));    //连接槽  
}  
MainWindow::~MainWindow()  
{  
    delete ui;  
    //下面两行不能忘了哦  
    serial->close();  
    delete serial;  
}  
void MainWindow::serialRead()  
{  
    static QByteArray allData;         //静态变量!!在串口只发送一半的时候用来累加数据  
    QByteArray dataTemp;            //每次读到的数据,可能只是部分的,大多数情况下是正确的,大约1/5会出错  
    while (!serial->atEnd()) {  
        QByteArray dataTemp = serial->readAll();                //因为串口是不稳定的,也许读到的是部分数据而已,但也可能是全部数据  
        if( dataTemp.data()[dataTemp.length() - 1] == '~'){     //当临时数据最后一位是'~',代表一条数据读完了  
            allData += dataTemp;                                //总数据加上临时数据  
            allData.resize(allData.size() - 1);                 //删除结尾的~符号  
  
            qCritical() << allData;                             //这时候allData将是你要的数据  
  
  
  
  
            allData.clear();                                    //清除数据!!!!!  
        }  
        else{                                                  //当最后一位数据不是'~',即未读完  
            allData += dataTemp;                               //每次累加这部分数据,因为可能没发完  
        }  
    }  
}  


  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值