用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()));