Qt读取GPS数据

1、型号版本

GPS型号为ublox(EVK-M8L),配有USB接口,Qt版本5.7

2、实现步骤:

(1)实现串口通信

  采用Qt5.7 内置的串口操作类QSerialPort和QSerialPortInfo,通过QSerialPortInfo提供的函数availablePorts(),可枚举出当前计算机中可用的com口。使用该类需在pro文件中添加:

QT += serialport

(2)筛选感兴趣的信号,解析

  GPRMC数据包基本上包含经纬度、航向角、时间等常用的信号。

3、效果图

4、源码

4.1、头文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QSerialPort>
#include <QSerialPortInfo>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

public:
 QSerialPort serial;//串口实例
 void initSeialPort();//初始化串口函数
private:
    void gpsParse(QByteArray GPSBuffer);//gps解析函数


private slots:
    void serialRead();

    void on_connectBtn_clicked();

    void on_closeBtn_clicked();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

4.2、实现文件

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QDebug>
#include <QList>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QStringList strBaud;
    strBaud<<"4800"<<"9600"<<"115200";
    ui->baudcomboBox->addItems(strBaud);

    initSeialPort();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::initSeialPort()
{
    connect(&serial,SIGNAL(readyRead()),this,SLOT(serialRead()));   //连接槽

    //获取计算机上所有可用串口并添加到comboBox中
    QList<QSerialPortInfo>  infos = QSerialPortInfo::availablePorts();
    if(infos.isEmpty())
    {
        ui->portcomboBox->addItem("无串口");
        return;
    }
    foreach (QSerialPortInfo info, infos) {
        ui->portcomboBox->addItem(info.portName());
        qDebug() << info.portName();
    }

}


void MainWindow::serialRead()
{
    QByteArray qa = serial.readAll();

    ui->textEdit->append(qa);

     gpsParse(qa);

     ui->statusLabel->setText("读取中...");
}

void MainWindow::gpsParse(QByteArray GPSBuffer)
{

 //    qDebug()<<GPSBuffer.size();

    if(GPSBuffer.contains("$GNRMC") )
    {

        QList<QByteArray> gpsByteArrays = GPSBuffer.split(',');
        int count = gpsByteArrays.count();

    int  gpsLat_1 = static_cast<int>(gpsByteArrays.at(3).toDouble()/100);
    double gpsLat_2 = (gpsByteArrays.at(3).toDouble() - gpsLat_1 * 100)/60;
    double gpslat=gpsLat_1 + gpsLat_2;

    int gpsLong_1 = static_cast<int>(gpsByteArrays.at(5).toDouble()/100);
    double gpsLong_2 = (gpsByteArrays.at(5).toDouble()-gpsLong_1 * 100)/60;
    double gpsLong = gpsLong_1 + gpsLong_2;

    ui->timelineEdit->setText(gpsByteArrays.at(1));
    ui->latlineEdit->setText(QString::number(gpslat,'g',9));
    ui->longlineEdit->setText(QString::number(gpsLong,'g',10));

    if(!gpsByteArrays.at(8).isEmpty())
        ui->headlineEdit->setText(gpsByteArrays.at(8));


    }
}

void MainWindow::on_connectBtn_clicked()
{
    QSerialPortInfo info;
        QList<QSerialPortInfo> infos = QSerialPortInfo::availablePorts();
        int i = 0;
        foreach (info, infos) {
            if(info.portName() == ui->portcomboBox->currentText()) break;
            i++;
        }

        if(i != infos.size ()){//can find
           ui->statusLabel->setText("串口打开成功");

            serial.close();
            serial.setPort(info);
            serial.open(QIODevice::ReadWrite);          //读写打开
            switch (ui->baudcomboBox->currentIndex()) {
            case 0:
                serial.setBaudRate(QSerialPort::Baud4800);
                break;
            case 1:
                  serial.setBaudRate(QSerialPort::Baud9600);
                  qDebug()<<"9600";
                break;
            case 2:
                  serial.setBaudRate(QSerialPort::Baud115200);
                  qDebug()<<"115200";
            default:
                break;
            }

      //      serial.setBaudRate(QSerialPort::Baud9600);  //波特率
    //      serial.setDataBits(QSerialPort::Data8);     //数据位
    //      serial.setParity(QSerialPort::NoParity);    //无奇偶校验
    //      serial.setStopBits(QSerialPort::OneStop);   //无停止位
    //      serial.setFlowControl(QSerialPort::NoFlowControl);  //无控制
        }else{
            serial.close();

            ui->statusLabel->setText("串口打开失败");
        }
}

void MainWindow::on_closeBtn_clicked()
{
    serial.close();
    ui->statusLabel->setText("串口断开");
}

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,C++设计模式,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

猜你喜欢

转载自blog.csdn.net/m0_73443478/article/details/130031083