QT通过串口获取GPS数据有丢包?(语言-qt)

用QT写了一个串口读取GPS接收机数据的程序,使用QTimer定时器,连接槽读取,设置的time_interval 为50ms,但是实际接收0.05s的GPS数据时会出现丢包,读取数据最大时间间隔为0.2S,请教下大家如何设置串口可以实现0.05s数据读取啊

下面是.h文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include < QBasicTimer>
#include <QMainWindow>
#include <QDebug>
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
#include <QStringList>
#include <QTimer>
namespace Ui {
class MainWindow;
}
#define byte unsigned char
void sleep(unsigned int msec);
class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    QTimer         *readTimer_RTK;
    #define time_interval 50
bool m_isFin;


private slots:
    void on_clearButton_clicked();

    void on_sendButton_clicked();
    void on_openButton_clicked();
    void on_openButton_RTK_clicked();
     void Read_Data_RTK();
    int hexToDec(QString strHex);
    int hex2(unsigned char ch);
    void time_change(int m_dTotalTime);
    void datetime_del();
    void Attitude_data_del();
    void GPS_data_del();
    QString checkXorH(QByteArray data);
    QString acsii_to_Hex(QString str);

    void  gps_parse(QByteArray GPSBuffer);

private:
    Ui::MainWindow *ui;
      QSerialPort *serial_RTK;
     QList<QByteArray> gpsByteArrays;

};



#endif // MAINWINDOW_H

下面是.cpp文件

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);//对界面进行初始化
    readTimer_RTK = new QTimer(this);
    connect(readTimer_RTK,SIGNAL(timeout()),this,SLOT(Read_Data_RTK()));
    //查找可用的串口
    foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
    {

        QSerialPort serial_RTK;
        serial_RTK.setPort(info);
        if(serial_RTK.open(QIODevice::ReadWrite))
        {
            ui->PortBox_RTK->addItem(serial_RTK.portName());
            serial_RTK.close();
        }
    }
    //关闭发送按钮的使能
    ui->sendButton->setEnabled(false);
//    qDebug() << tr("界面设定成功!");
}

MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::on_openButton_RTK_clicked()
{
    if(ui->openButton_RTK->text()==tr("打开RTK"))
    {
        serial_RTK = new QSerialPort;
        //设置串口名
        serial_RTK->setPortName(ui->PortBox_RTK->currentText());
        //打开串口
        serial_RTK->open(QIODevice::ReadWrite);
        //设置波特率38400
        serial_RTK->setBaudRate(QSerialPort::Baud38400);
        //设置数据位数 8
        serial_RTK->setDataBits(QSerialPort::Data8);
        //设置奇偶校验 无
        serial_RTK->setParity(QSerialPort::NoParity);
        //设置停止位 1
        serial_RTK->setStopBits(QSerialPort::OneStop);
        //设置流控制 无
        serial_RTK->setFlowControl(QSerialPort::NoFlowControl);

        //关闭设置菜单使能
        ui->PortBox_RTK->setEnabled(false);
        ui->openButton_RTK->setText(tr("关闭RTK"));
        readTimer_RTK->start(time_interval);
    }
    else
    {
        //关闭串口
        serial_RTK->clear();
        serial_RTK->close();
        serial_RTK->deleteLater();
        //恢复设置使能
        ui->PortBox_RTK->setEnabled(true);
        ui->openButton_RTK->setText(tr("打开RTK"));
        readTimer_RTK->stop();
    }
}

void MainWindow::Read_Data_RTK()
{
    QByteArray data_RTK;

    data_RTK = serial_RTK->readAll();//接收到串口数据
    if(!data_RTK.isEmpty())
    {
    if(data_RTK.contains("$GPGGA"))                //如果这串数据中包含$GPGGA
    {
        data_RTK.remove(0,data_RTK.indexOf("$GPGGA")); //删除数据起始到$GPGGA之间的数据
        if(data_RTK.count(",") == 14 && data_RTK.count("$")==1)                     //如果剩下的字符中包含*
        {
            gps_parse(data_RTK);

            ui->textEdit_RX_RTK->clear();
            ui->textEdit_RX_RTK->append(data_RTK); //十六进制显示

    }
}
}data_RTK.clear();

1,在读数据函数中,将读到的数据放到缓冲区,对缓冲区进行操作。或者将读到的数据添加到消息队列中,用消费者线程去处理。
2,绑定串口对象的readyRead信号接收数据试试

connect(serial_RTK, SIGNAL(readyRead()), this, SLOT(Read_Data_RTK()));