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模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓