QT5 串口应用

来源:互联网 发布:男王升级数据 编辑:程序博客网 时间:2024/06/04 18:39

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;                               //每次累加这部分数据,因为可能没发完          }      }  }  


0 0