QSerial 串口通信

简单记录一下使用Qserial模块实现Qt的串口通信,我使用的环境是VS+qt,因此需要在创建项目的时候勾选Serial Port模块。
提前准备:
1、虚拟串口工具
创建一组虚拟串口,我是COM2和COM3;
2、串口调试助手
用于和上位机进行信息交互;

步骤:
1、设计交互UI界面;
2、查找可用串口(我省略了,直接开的虚拟串口);
3、串口初始化 —— 打开串口、设置串口参数;
4、在发送槽函数里面发送数据;
5、在接收槽函数里面接收和显示数据;
6、关闭串口,释放串口变量。
代码:

#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_serial_test.h"
#include <QSerialPort>
#include <QSerialPortInfo>



class serial_test : public QMainWindow
{
    Q_OBJECT

public:
    serial_test(QWidget *parent = Q_NULLPTR);
	//QStringList getPortNameList();//获取所有可用的串口列表

	void initserial();

public slots:
	void sendInfo();
	void receiveInfo();
	void closeSerial();

private:
    Ui::serial_testClass ui;

	QSerialPort* m_serialPort; //串口类
	QStringList m_portNameList;

};

我发现在cpp文件中,不需要创建按钮的信号和槽函数,也就是说不用connect按钮和槽也能使用按钮,不知道是不是因为在 ui 的h文件中已经创建了connect的原因,麻烦知道的朋友留言,谢谢。

#include "serial_test.h"

serial_test::serial_test(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);

	m_serialPort = new QSerialPort();
	initserial();
	connect(ui.ptn1, SIGNAL(clicked()), this, SLOT(sendInfo()), Qt::UniqueConnection);
	connect(m_serialPort, &QSerialPort::readyRead, this, &serial_test::receiveInfo);
	connect(this, &serial_test::destroyed, this, &serial_test::closeSerial);
}


void serial_test::initserial() {

	if (m_serialPort->isOpen())//如果串口已经打开了 先给他关闭了
	{
		m_serialPort->clear();
		m_serialPort->close();
	}
	m_serialPort->setPortName("COM2");
	if (!m_serialPort->open(QIODevice::ReadWrite))//用ReadWrite 的模式尝试打开串口
	{
//		qDebug() << "打开失败!";
		ui.label->setText("couldn't open");
		return;
	}
//	qDebug() << "串口打开成功!";
	ui.label->setText("open ok");
	m_serialPort->setBaudRate(QSerialPort::Baud115200, QSerialPort::AllDirections);//设置波特率和读写方向
	m_serialPort->setDataBits(QSerialPort::Data8);      //数据位为8位
	m_serialPort->setFlowControl(QSerialPort::NoFlowControl);//无流控制
	m_serialPort->setParity(QSerialPort::NoParity); //无校验位
	m_serialPort->setStopBits(QSerialPort::OneStop); //一位停止位
}

void serial_test::sendInfo() {
	m_serialPort->write(ui.lineEdit->text().toLatin1());
}

void serial_test::receiveInfo() {
	QByteArray buf;
	buf = m_serialPort->readAll();
	if (!buf.isEmpty()) {
		QString str = ui.textEdit->toPlainText();
		str += tr(buf);
		ui.textEdit->clear();
		ui.textEdit->append(str);
	}
	buf.clear();
}

void serial_test::closeSerial() {
	m_serialPort->clear();
	m_serialPort->close();
	delete m_serialPort;
}

结果:
上位机:
在这里插入图片描述
串口助手:

在这里插入图片描述
附上:查找可用串口的代码

//查找可用的串口
 foreach (const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
{
      QSerialPort serial;
      serial.setPort(info);
      if(serial.open(QIODevice::ReadWrite))
      {
          ui->PortBox->addItem(serial.portName());
          serial.close();
      }
 }

本文代码来自:https://www.cnblogs.com/wurenzhong/p/8186437.html

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值