Qt串口通讯的学习
首先,需要在项目工程文件里添加一行:
QT += serialport
然后,添加头文件
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
在串口通讯前,应该先使用QSerialPortInfo的静态函数查询串口信息:
QStringList serialPortName;
foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
{
serialPortName << info.portName();
qDebug()<<info.portName()<<",BaudRates:"<<info.standardBaudRates()<<"\n";
}
查询到想要的串口信息后,我们就可以初始化一个串口对象,然后设置它的名字、波特率等属性:
portName=serialPortName[0]; qDebug()<<"现在使用的串口为:"<<portName; testport=new QSerialPort; //如果串口已经打开,先关闭它 if(testport->isOpen()){ testport->clear(); testport->close(); } testport->setPortName(portName); //设置串口名 if(!testport->open(QIODevice::ReadWrite))//用ReadWrite 的模式尝试打开串口 { qDebug()<<portName<<"打开失败!"; return; } testport->setBaudRate(QSerialPort::Baud9600,QSerialPort::AllDirections);//设置波特率和读写方向 testport->setDataBits(QSerialPort::Data8); //数据位为8位 testport->setFlowControl(QSerialPort::NoFlowControl);//无流控制 testport->setParity(QSerialPort::NoParity); //无校验位 testport->setStopBits(QSerialPort::OneStop); //一位停止位
读取串口信息: 串口在收到数据后,会把数据存入缓冲区,并发出一个readyRead信号,只要连接该信号和你自定义的槽函数即可。比如
connect(testport,&QSerialPort::readyRead,this,&MainWindow::showMsg);
void MainWindow::showMsg() { QByteArray data=testport->readAll();//先读取数据 QTextCodec *codec=QTextCodec::codecForName("GBK");//采用GBK编码(因为我发的是中文) QString msg=codec->toUnicode(data);//然后转为Qstring //英文直接QString msg=QString(data);即可完成QByteArray转QString qDebug()<<msg; }
向串口发信息: 调用串口的wirte函数即可。
QString sendMsg="hello world"; QByteArray cmdMsg=sendMsg.toLatin1(); testport->write(cmdMsg);
使用完毕后要记得关闭串口,通常在析构函数中操作:
MainWindow::~MainWindow() { delete ui; if (testport->isOpen()) { testport->close(); } delete testport; }