串口读取(Qt C++)

6 篇文章 0 订阅

文章目录


前言

前一篇文章有讲GPS的NMEA-0813协议报文具体解析,但是前提是需要先读取串口获取报文,此篇主要讲如何获取串口的数据,即读取串口。

具体方法

头文件:

#ifndef GPSPositionWidget_H
#define GPSPositionWidget_H

#include <QWidget>

QT_BEGIN_NAMESPACE
	namespace Ui {class CGPSPositionWidget;}
QT_END_NAMESPACE

class QSerialPort;
class CGPSPositionWidget : public QWidget
{
	Q_OBJECT
	
public:
	CGPSPositionWidget(QWidget *parent = 0);
	~CGPSPositionWidget();

public:

	/**
	* @fn  Initialize        
	* @brief 初始化窗体
	* @param 
	* @return 
	*/
	void Initialize();

	/**
	* @fn  SetPara        
	* @brief 初始化打开串口的各项参数
	* @param 
	* @return bool
	*/
	bool SetPara();

public slots:
	
	/**
	* @fn  SlotPushButton_Switch        
	* @brief 打开或关闭串口切换按钮
	* @param 
	* @return 
	*/
	void SlotPushButton_Switch();

	/**
	* @fn  SlotSerialRead        
	* @brief 读取串口数据
	* @param 
	* @return 
	*/
	void SlotSerialRead();

private:
	Ui::CGPSPositionWidget* ui;
	QSerialPort *m_pserial;
};

#endif // GPSPositionWidget_H

 源文件:

#include "GPSPositionWidget.h"
#include "ui_GPSPositionWidget.h"
#include <QSerialPort>
#include <QSerialPortInfo>
#include "qdebug.h"
#include "AcBaseWidget/Include/dlgmessagebox.h"

CGPSPositionWidget::CGPSPositionWidget(QWidget *parent)
	, m_pserial(NULL)
{
	ui = new Ui::CGPSPositionWidget();
	ui->setupUi(panel);
	setTitle(ConvertCharArrayToQString("GPS定位"));

	connect(ui->switchButton,SIGNAL(clicked()),this,SLOT(SlotPushButton_Switch()));
	Initialize();
}

CGPSPositionWidget::~CGPSPositionWidget()
{
	delete ui;
	ui = nullptr;
}

void CGPSPositionWidget::Initialize()
{

	ui->portComboBox->clear();
	ui->baudComboBox->clear();
	ui->dataBitsComboBox->clear();
	ui->stopBitsComboBox->clear();
	ui->parityComboBox->clear();
	ui->flowControlComboBox->clear();
	ui->modeComboBox->clear();
	//状态栏清空
	ui->statusLabel->clear();
	//获取计算机上所有可用串口并添加到comBox中
	QList<QSerialPortInfo>  infos = QSerialPortInfo::availablePorts();
	if(infos.isEmpty())
	{
		ui->portComboBox->addItem(ConvertCharArrayToQString("无串口"));
		return;
	}
	else
	{
		m_pserial = new QSerialPort;
	}
	foreach (QSerialPortInfo info, infos) {
		ui->portComboBox->addItem(info.portName());
		qDebug() << info.portName();
	}

	//设置三种波特率
	QStringList strBaud;
	strBaud<<ConvertCharArrayToQString("4800")<<ConvertCharArrayToQString("9600")<<ConvertCharArrayToQString("115200");
	ui->baudComboBox->addItems(strBaud);
	ui->baudComboBox->setCurrentIndex(1);

	//设置四种数据位
	QStringList strData;
	strData<<ConvertCharArrayToQString("5")<<ConvertCharArrayToQString("6")<<ConvertCharArrayToQString("7")<<ConvertCharArrayToQString("8");
	ui->dataBitsComboBox->addItems(strData);
	ui->dataBitsComboBox->setCurrentIndex(3);

	//设置三种停止位
	QStringList strStop;
	strStop<<ConvertCharArrayToQString("1")<<ConvertCharArrayToQString("1.5")<<ConvertCharArrayToQString("2");
	ui->stopBitsComboBox->addItems(strStop);
	ui->stopBitsComboBox->setCurrentIndex(0);

	//设置五种校验位
	QStringList strParity;
	strParity<<ConvertCharArrayToQString("None")<<ConvertCharArrayToQString("Odd")<<ConvertCharArrayToQString("Even")<<ConvertCharArrayToQString("Mark")<<ConvertCharArrayToQString("Space");
	ui->parityComboBox->addItems(strParity);
	ui->parityComboBox->setCurrentIndex(0);

	//设置四种流控
	QStringList strFlowControl;
	strFlowControl<<ConvertCharArrayToQString("None")<<ConvertCharArrayToQString("Hardware")<<ConvertCharArrayToQString("Software");
	ui->flowControlComboBox->addItems(strFlowControl);
	ui->flowControlComboBox->setCurrentIndex(0);

	//设置三种定位模式
	QStringList strMode;
	strMode<<ConvertCharArrayToQString("推荐定位")<<ConvertCharArrayToQString("GPS定位")<<ConvertCharArrayToQString("北斗定位");
	ui->modeComboBox->addItems(strMode);
	ui->modeComboBox->setCurrentIndex(0);
}

bool CGPSPositionWidget::SetPara()
{
	if (m_pserial == NULL)
	{
		ui->statusLabel->setText(ConvertCharArrayToQString("无串口!"));
		return false;
	}
	//设置串口名字
	m_pserial->setPortName(ui->portComboBox->currentText());
	//设置波特率
	m_pserial->setBaudRate(ui->baudComboBox->currentText().toInt());
	//设置数据位
	switch (ui->flowControlComboBox->currentIndex())
	{
	case 0:
		{
			m_pserial->setDataBits(QSerialPort::Data5);
		}
		break;
	case 1:
		{
			m_pserial->setDataBits(QSerialPort::Data6);
		}
		break;
	case 2:
		{
			m_pserial->setDataBits(QSerialPort::Data7);
		}
		break;
	case 3:
		{
			m_pserial->setDataBits(QSerialPort::Data8);
		}
		break;
	default:
		{
			m_pserial->setDataBits(QSerialPort::Data8);
		}
		break;
	}
	//设置停止位
	switch (ui->flowControlComboBox->currentIndex())
	{
	case 0:
		{
			m_pserial->setStopBits(QSerialPort::OneStop);
		}
		break;
	case 1:
		{
			m_pserial->setStopBits(QSerialPort::OneAndHalfStop);
		}
		break;
	case 2:
		{
			m_pserial->setStopBits(QSerialPort::TwoStop);
		}
		break;
	default:
		{
			m_pserial->setStopBits(QSerialPort::OneStop);
		}
		break;
	}
	//设置奇偶校验位
	switch (ui->parityComboBox->currentIndex())
	{
	case 0:
		{
			m_pserial->setParity(QSerialPort::NoParity);
		}
		break;
	case 1:
		{
			m_pserial->setParity(QSerialPort::OddParity);
		}
		break;
	case 2:
		{
			m_pserial->setParity(QSerialPort::EvenParity);
		}
		break;
	case 3:
		{
			m_pserial->setParity(QSerialPort::MarkParity);
		}
		break;
	case 4:
		{
			m_pserial->setParity(QSerialPort::SpaceParity);
		}
		break;
	default:
		{
			m_pserial->setParity(QSerialPort::NoParity);
		}
		break;
	}
	//设置流控
	switch (ui->flowControlComboBox->currentIndex())
	{
	case 0:
		{
			m_pserial->setFlowControl(QSerialPort::NoFlowControl);
		}
		break;
	case 1:
		{
			m_pserial->setFlowControl(QSerialPort::HardwareControl);
		}
		break;
	case 2:
		{
			m_pserial->setFlowControl(QSerialPort::SoftwareControl);
		}
		break;
	default:
		{
			m_pserial->setFlowControl(QSerialPort::NoFlowControl);
		}
		break;
	}
	return  true;
}

void CGPSPositionWidget::SlotPushButton_Switch()
{
	if (ui->switchButton->text() == ConvertCharArrayToQString("打开串口"))
	{
		//状态栏清空
		ui->statusLabel->clear();
		//设置参数
		if (!SetPara())
		{
			return;
		}		
		//打开串口
		if (m_pserial->open(QIODevice::ReadWrite))
		{
			//ui->modeComboBox->setEditable(false);
			/*if (m_pGPSMapEventHandler->GetCurrent2DObject() != NULL)
			{
			m_pGPSMapEventHandler->SetTraVisible(false);
			}*/
			m_pGPSMapEventHandler->CreatePLineLayer();
			connect(m_pGPSMapEventHandler, &CGPSMapEventHandler::SigCurrent2DObjectDestroyed, this, &CGPSPositionWidget::SlotCurrent2DObjectDestroyed);
			ui->switchButton->setText(ConvertCharArrayToQString("关闭串口"));
			//检测点和轨迹显隐状态
			SlotCheckBox_Show();
			if (ui->showTraCheckBox->isChecked())
			{
				m_pGPSMapEventHandler->SetTraVisible(true);
			}
			else
			{
				m_pGPSMapEventHandler->SetTraVisible(false);
			}
			//SlotCheckBox_ShowTra();
			//信号与槽函数关联
			connect(m_pserial,SIGNAL(readyRead()),this,SLOT(SlotSerialRead()));   //连接槽
		}
		else
		{
			DLgMessageBox dlgMsg(this);
			dlgMsg.SetMessage(ConvertCharArrayToQString("串口打开失败!"), MS_Information);
			dlgMsg.exec();
		}
	}
	else
	{
		//关闭串口
		m_pserial->close();
		//恢复设置功能
		ui->switchButton->setText(ConvertCharArrayToQString("打开串口"));
		ui->timelineEdit->clear();
		ui->latlineEdit->clear();
		ui->lonlineEdit->clear();
		ui->elevationlineEdit->clear();
		//m_pGPSMapEventHandler->SetTraVisible(false);
		//ui->showTraCheckBox->setChecked(false);
		//SlotCheckBox_ShowTra();
		//ui->saveTraCheckBox->setEnabled(true);
		ui->statusLabel->setText(ConvertCharArrayToQString("串口关闭"));
	}
}

void CGPSPositionWidget::SlotSerialRead()
{
	QByteArray qa = m_pserial->readAll();	
	GPSParse(qa);	
	ui->statusLabel->setText(ConvertCharArrayToQString("读取中..."));
}


总结

具体效果如下:

注:只提供了读取相关代码。 

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值