Qt提供了对串口设备的简单操作功能接口,包括串口配置、收/发数据。将串口设备插入到电脑USB接口后,可在电脑的设备管理里查看端口,会多了个COM之类的端口。一般的USB串行设备驱动在window里都已经安装好了,不需要再单独安装驱动,若是设备管理器查看到端口出现了叹号,可以从网上查找对应的驱动,并下载安装。
1.在使用QSerialPort类的文件里,需要包含以下头文件
#include <QtSerialPort/QtSerialPort>
#include <QtSerialPort/QSerialPortInfo>
2.在.pro文件里添加
QT += serialport
3.获取/查看电脑里所有的串口设备
QList<QSerialPortInfo> list;
list = QSerialPortInfo::availablePorts();
for (int i = 0; i < list.size(); i++)
{
qDebug() << list.at(i).portName() ;//串口名字
qDebug() << list.at(i).description();//串口描述
qDebug() << "#########";
}
执行后输出:
可看当前我电脑有COM1/COM3/COM4,三个串口设备。
4.打开和配置串口设备
QSerialPort *port;
port = new QSerialPort("COM4");//通过名字打开,可通过上面的list里查找
/*根据需求对串口进行进行配置*/
port->setBaudRate(QSerialPort::Baud115200);//配置波特率位115200
port->setDataBits(QSerialPort::Data8);//配置数据格式为8bit
port->setParity(QSerialPort::NoParity);//无校验位
port->setStopBits(QSerialPort::OneStop);//一个停止位
port->setFlowControl(QSerialPort::NoFlowControl);//不使用流控制
/*打开设备*/
if (!port->open(QIODevice::ReadWrite))
{
qDebug() << "serial open failed";
return ;
}
else
{
qDebug() << "serial open success";
}
/*设置接收缓冲区大小*/
port->setReadBufferSize(500);
/*绑定接受槽函数,但收到信息是将调用MainSerialRecvMsgEvent函数*/
QObject::connect(port, &QSerialPort::readyRead, this, &MainWindow::MainSerialRecvMsgEvent);
如果打开串口失败,可能是因为该串口已经被其他进程占用,绑定槽函数之后,当串口有数据的时候就会回调该槽函数,值得注意的是,假如要接收连串的10个字节的数据,可能进入多次槽函数,每一次接收部分字节;也有可能进入一次槽函数就已接收完10个字节。
5.接收、发送串口数据
/*数据接收*/
void MainWindow::MainSerialRecvMsgEvent(void)
{
QByteArray MainSerialRecvData;//保存串口数据的数组
if(port->bytesAvailable()>0)//判断等到读取的数据大小
{
MainSerialRecvData = port->readAll();//读取所有的接收数据
if(!MainSerialRecvData.isEmpty()){
qDebug() <<MainSerialRecvData.size();//打印数据大小
for(int i = 0; i < MainSerialRecvData.size();i++)
{
qDebug() <<MainSerialRecvData.at(i);
}
ui->textBrowser->append(MainSerialRecvData);//将数据显示到textBrowser
}else{
qDebug()<<"接受数据出错";
}
}
}
/*数据发送*/
void MainWindow::on_pushButton_2_clicked()
{
QByteArray txdata;
if(port!=NULL&&port->isOpen())
{
txdata = ui->lineEdit->text().toLatin1();
port->write(txdata);
ui->lineEdit->clear();
}
else
{
qDebug() <<"串口未打开!";
}
}
调用write发送数据是将数据写入了内部发送数据缓冲区,并不等于马上从底层串行端口发出,真正发出去的时间受电脑当前性能的影响。这一点在我们一般的使用过程中不会受到太大影响。使用flush()可尽可能的将发送缓冲区的数据从端口发出,在大多数的情况下,不需要使用它。
附上一个简单的例程:点击下载。