QT5中已经增加了串口类QSrialPort,可以直接调用API函数进行快速开发。
1. 获取串口信息
Dialog::Dialog(QWidget *parent) : QDialog(parent) { const auto infos = QSerialPortInfo::availablePorts(); for (const QSerialPortInfo &info : infos) serialPortComboBox->addItem(info.portName()); }
- QSerialPortInfo::availablePorts()
函数的功能时会检测当前电脑上串行端口,并且返回系统上串行端口的信息。
之后将获取到的信息加入Qcombobox下拉选项框中。本例中只添加了串口的名字即COM4。
2.设置串口参数并开启串口
void Dialog::openSerial() { if(runButton->text() == tr("开启")) { serial = new QSerialPort(); //port name serial->setPortName(serialPortComboBox->currentText()); //open serial->open(QIODevice::ReadWrite); serial->setBaudRate(115200); serial->setDataBits(QSerialPort::Data8); serial->setStopBits(QSerialPort::OneStop); serial->setFlowControl(QSerialPort::NoFlowControl); connect(serial, SIGNAL(readyRead()), this, SLOT(readParam())); runButton->setText("关闭"); } else { serial->clear(); serial->close(); serial->deleteLater(); runButton->setText("开启"); } }connect(serial, SIGNAL(readyRead()), this, SLOT(readParam()));
该函数是启动串口接收功能。即当串口有数据时,readyRead()信号就会被抛出。对应的readParam()即QT中所定义的槽就会被调用。
注意:
readyRead()信号是有数据就直接抛出,在实际数据交互中,往往一帧数据有很多字节。这意味着我们一帧数据数据会触发多次信号。应当在对数据进行操作时候对数据进行校验。
3.串口发送数据
serial->write(sendData);
sendData为QByteArray类所创建的对象,即数据缓存区。
4.串口发送数据
g_RecBuf.append(serial->readAll());
readAll函数会读取当前设备所有剩余数据,并将它作为字节数组返回