一、查找串口(windows)
//下面这个循环语句用来查找可以用的串口端口
//不确定有多少串口可用,也就不知道循环多少次,所以用foreach(不知道用的就百度)
foreach (const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
{
QSerialPort serial; //在循环语句内部实例化类,因为可用串口不一定只就一个
serial.setPort(info); //设置能够用的串口端口
if(serial.open(QIODevice::ReadWrite)) //用ReadWrite可读写的方式打开串口
{
//记录可用的uart名字serial.portName(),前面的ui->PortBox->addItem不用管,这个是界面里面的。
ui->PortBox->addItem(serial.portName());
//然后关闭串口,因为这段代码打开串口只是为了查找串口可以用不可用而已。
serial.close();
}
}
二、 创建并设置串口
//新建一个串口类
serial = new QSerialPort;
//设置串口号,这个就是上面我们serial.portName()保存的串口号了
serial->setPortName(ui->PortBox->currentText());
//设定了串口号,那就是用读写方式打开串口了,前面说了是吧。
serial->open(QIODevice::ReadWrite);
//设置波特率9600吧 心情好
serial->setBaudRate(QSerialPort::Baud9600);
/* Baud1200 = 1200, 波特率想设置哪个就设置哪个,这个枚举定义了
Baud2400 = 2400, 躲起来慢慢试
Baud4800 = 4800,
Baud9600 = 9600,
Baud19200 = 19200,
Baud38400 = 38400,
Baud57600 = 57600,
Baud115200 = 115200, ********/
//设置数据位数,这个就是数据位了,枚举了5、6、7、8位,我们一般都用的8位的
switch (ui->BitBox->currentIndex())
{
case 5: serial->setDataBits(QSerialPort::Data5); break;//设置数据位8
case 6: serial->setDataBits(QSerialPort::Data6); break;//设置数据位8
case 7: serial->setDataBits(QSerialPort::Data7); break;
case 8: serial->setDataBits(QSerialPort::Data8); break;
default: break;
}
//设置校验位
switch (ui->ParityBox->currentIndex())
{
case 0: serial->setParity(QSerialPort::NoParity); break;
default: break;
}
//设置停止位,串口一般有一个停止位或两个停止位,选择吧
switch (ui->BitBox->currentIndex())
{
case 1: serial->setStopBits(QSerialPort::OneStop); break; //停止位设置为1
case 2: serial->setStopBits(QSerialPort::TwoStop); break;
default: break;
}
//设置流控制 无控制流
serial->setFlowControl(QSerialPort::NoFlowControl); //设置为无流控制
三、 读写串口
serial->write(data); // 写数据
data = serial->readAll(); //读数据,数据类型可以查看函数原型
serial->close(); //最后关闭串口
四、把上面代码封装成一个类
h文件:
#ifndef SERIAL_H
#define SERIAL_H
#include <QObject>
#include<QtSerialPort/QSerialPort>
#include <QSerialPortInfo>
//#define IS_INSTANCE
class Serial : public QObject
{
Q_OBJECT
public:
#ifdef IS_INSTANCE
static Serial *instance();
#else
explicit Serial(QObject *parent = nullptr);
#endif
QStringList findPort();
bool open(QString port, quint64 baud = 9600);
void close(){ serial->close(); }
bool isOpen(){ return serial->isOpen(); }
qint64 sendData(QByteArray data);
qint64 sendData(QString data);
signals:
void haveReceive(QByteArray data);
void sendDataShow(QString data,bool isOk);
private:
#ifdef IS_INSTANCE
static Serial* mPtr;
explicit Serial(QObject *parent = nullptr);
#endif
QSerialPort *serial;
};
#endif // SERIAL_H
cpp文件:
#include "serial.h"
#include<QDataStream>
#ifdef IS_INSTANCE
Serial* Serial::mPtr = nullptr;
Serial *Serial::instance()
{
if(nullptr == mPtr)
mPtr = new Serial();
return mPtr;
}
#endif
Serial::Serial(QObject *parent) : QObject(parent)
{
serial = new QSerialPort;
connect(serial, &QSerialPort::readyRead, this, [=]()
{
QByteArray data = serial->readAll();
emit haveReceive(data);
});
}
QStringList Serial::findPort()
{
QStringList portBuff;
foreach (const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
{
QSerialPort serial;
serial.setPort(info);
if(serial.open(QIODevice::ReadWrite))
{
portBuff.append(serial.portName());
serial.close();
}
}
return portBuff;
}
bool Serial::open(QString port,quint64 baud)
{
if(serial->isOpen()) serial->close();
serial->setPortName(port);
if(!serial->open(QIODevice::ReadWrite))
return false;
switch (baud)
{
case 1200: serial->setBaudRate(QSerialPort::Baud1200); break;
case 4800: serial->setBaudRate(QSerialPort::Baud4800); break;
case 9600: serial->setBaudRate(QSerialPort::Baud9600); break;
case 19200: serial->setBaudRate(QSerialPort::Baud19200); break;
case 38400: serial->setBaudRate(QSerialPort::Baud38400); break;
case 57600: serial->setBaudRate(QSerialPort::Baud57600); break;
case 115200: serial->setBaudRate(QSerialPort::Baud115200); break;
}
switch (8){
case 5: serial->setDataBits(QSerialPort::Data5); break;
case 6: serial->setDataBits(QSerialPort::Data6); break;
case 7: serial->setDataBits(QSerialPort::Data7); break;
case 8: serial->setDataBits(QSerialPort::Data8); break;
default: break;
}
switch (0){
case 0: serial->setParity(QSerialPort::NoParity); break;
default: break;
}
switch (1){
case 1: serial->setStopBits(QSerialPort::OneStop); break;
case 2: serial->setStopBits(QSerialPort::TwoStop); break;
default: break;
}
serial->setFlowControl(QSerialPort::NoFlowControl);
return true;
}
qint64 Serial::sendData(QByteArray data)
{
bool isOk = 0;
if(serial->write(data) > 0)
isOk = 1;
return isOk;
}
qint64 Serial::sendData(QString data)
{
bool isOk = 0;
if(serial->write(data.toLatin1()) > 0)
isOk = 1;
return isOk;
}
930





