使用COM6,这样,对于电脑来说已经装了一个“外接”GPS模块。
下面就是串口获取数据,之前我在看例子的时候有看到串口的东西,还有QSerialxxx的东西,一找,有还几个。
运行 Simple Terminal这个例子,打开COM6(波特率,对于这个模拟的设备,无所谓),可以看到接收到了GPS信息。
main.cpp
#include <QApplication>
#include "mainwindow.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}很普通
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QtCore/QtGlobal>
#include <QMainWindow>
#include <QtSerialPort/QSerialPort>
QT_BEGIN_NAMESPACE
class QLabel;
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE
class Console;
class SettingsDialog;
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void openSerialPort();
void closeSerialPort();
void about();
void writeData(const QByteArray &data);
void readData();
void handleError(QSerialPort::SerialPortError error);
private:
void initActionsConnections();
private:
void showStatusMessage(const QString &message);
Ui::MainWindow *ui;
QLabel *status;
Console *console;
SettingsDialog *settings;
QSerialPort *serial;
};
#endif // MAINWINDOW_HConsole 之前就做过了,不去看了, SettingsDialog 只是设置,也不看了 ,关键看当前这个,串口相关的, mainwindow.cpp:
//! [0]
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
//! [0]
ui->setupUi(this);
console = new Console;
console->setEnabled(false);
setCentralWidget(console);
//! [1]
serial = new QSerialPort(this);
//! [1]
settings = new SettingsDialog;
ui->actionConnect->setEnabled(true);
ui->actionDisconnect->setEnabled(false);
ui->actionQuit->setEnabled(true);
ui->actionConfigure->setEnabled(true);
status = new QLabel;
ui->statusBar->addWidget(status);
initActionsConnections();
connect(serial, static_cast<void (QSerialPort::*)(QSerialPort::SerialPortError)>(&QSerialPort::error),
this, &MainWindow::handleError);
//! [2]
connect(serial, &QSerialPort::readyRead, this, &MainWindow::readData);
//! [2]
connect(console, &Console::getData, this, &MainWindow::writeData);
//! [3]
}
//! [3]
MainWindow::~MainWindow()
{
delete settings;
delete ui;
}首先new一个 QSerialPort 对象,连接信号和槽。
//! [4]
void MainWindow::openSerialPort()
{
SettingsDialog::Settings p = settings->settings();
serial->setPortName(p.name);
serial->setBaudRate(p.baudRate);
serial->setDataBits(p.dataBits);
serial->setParity(p.parity);
serial->setStopBits(p.stopBits);
serial->setFlowControl(p.flowControl);
if (serial->open(QIODevice::ReadWrite)) {
console->setEnabled(true);
console->setLocalEchoEnabled(p.localEchoEnabled);
ui->actionConnect->setEnabled(false);
ui->actionDisconnect->setEnabled(true);
ui->actionConfigure->setEnabled(false);
showStatusMessage(tr("Connected to %1 : %2, %3, %4, %5, %6")
.arg(p.name).arg(p.stringBaudRate).arg(p.stringDataBits)
.arg(p.stringParity).arg(p.stringStopBits).arg(p.stringFlowControl));
} else {
QMessageBox::critical(this, tr("Error"), serial->errorString());
showStatusMessage(tr("Open error"));
}
}
//! [4]打开串口,这个和我们一般串口的操作是一样的,先设置参数,再open打开。
//! [6]
void MainWindow::writeData(const QByteArray &data)
{
serial->write(data);
}
//! [6]
//! [7]
void MainWindow::readData()
{
QByteArray data = serial->readAll();
console->putData(data);
}
//! [7]读写数据,就直接读写。
//! [8]
void MainWindow::handleError(QSerialPort::SerialPortError error)
{
if (error == QSerialPort::ResourceError) {
QMessageBox::critical(this, tr("Critical Error"), serial->errorString());
closeSerialPort();
}
}
//! [8]如果串口资源出错,可能串口不存在了,关闭它。
//! [5]
void MainWindow::closeSerialPort()
{
if (serial->isOpen())
serial->close();
console->setEnabled(false);
ui->actionConnect->setEnabled(true);
ui->actionDisconnect->setEnabled(false);
ui->actionConfigure->setEnabled(true);
showStatusMessage(tr("Disconnected"));
}
//! [5]关闭串口。
OK,就这样简单。