我们通过仿写一个串口界面来学习。
首先我们创建一个界面,
我们需要添加一个功能:打开界面后,串口就自动搜索串口号。
我们首先在.pro文件中 添加
QT += core gui serialport
其次在wigedt.cpp中填写
#include<QSerialPortInfo>
QStringlist serialnameport;//定义一个叫serialnameport的QStringlist对象,用来存储串口名称。
foreach(const QSerialPortInfo & info,QSerialPortInfo::availablePort())
{
serialnameport<<info.portName();
}
ui->serialcb->addItems(serialnameport);
//使用 foreach 循环遍历 QSerialPortInfo::availablePorts() 返回的可用串口列表。每次迭代都会将当前的 QSerialPortInfo 对象存储在名为 Info 的变量中。
在循环的每次迭代中,通过 Info.portName() 获取当前串口的名称,并使用 << 操作符将其添加到 serialnameport 字符串列表中。
最后,使用 ui->serialcb->addItems(serialnameport) 将 serialnameport 列表中的所有串口名称添加到名为 serialcb的下拉框控件中(通过 ui 对象访问 UI 界面的控件)。
const QSerialPortInfo & Info 声明了一个常量引用变量 Info,它表示每次迭代时从容器中获取的元素,并且在循环体内不能修改该元素的值。在示例代码中,Info 表示一个可用串口的信息对象,用于获取串口的属性和状态。
QSerialPort::BaudRate baudrate;
QSerialPort::DataBits databits;
QSerialPort::StopBits stopbits;
QSerialPort::Parity patity;
//初始化 波特率 数据位 停止位 校验位
//波特率
if(ui->comboBox_2->currentText()== "4800")
{
baudrate = QSerialPort::Baud4800;
}
else if(ui->comboBox_2->currentText()== "9600")
{
baudrate = QSerialPort::Baud9600;
}
else if(ui->comboBox_2->currentText()== "115200")
{
baudrate = QSerialPort::Baud115200;
}
//数据位
if(ui->comboBox_3->currentText() == "5")
{
databits = QSerialPort::Data5;
}
else if(ui->comboBox_3->currentText() == "6")
{
databits = QSerialPort::Data6;
}
else if(ui->comboBox_3->currentText() == "7")
{
databits = QSerialPort::Data7;
}
else if(ui->comboBox_3->currentText() == "8")
{
databits = QSerialPort::Data8;
}
//停止位
if(ui->comboBox_4->currentText() == "1")
{
stopbits = QSerialPort::OneStop;
}
if(ui->comboBox_4->currentText() == "1.5")
{
stopbits = QSerialPort::OneAndHalfStop;
}
if(ui->comboBox_4->currentText() == "2")
{
stopbits = QSerialPort::TwoStop;
}
//校证位
if(ui->comboBox_5->currentText() == "none")
{
patity = QSerialPort::NoParity;
}
//相互绑定起来
serilaPort -> setPortName(ui->serialcb->currentText());
serilaPort -> setBaudRate(baudrate);
serilaPort -> setDataBits(databits);
serilaPort -> setStopBits(stopbits);
serilaPort -> setParity(patity);
// 如果open成功,小窗口提示。
if(serilaPort ->open(QIODevice::ReadWrite) == true )
{
QMessageBox::information(this,"提示","成功");
}
else
{
QMessageBox::critical(this,"提示","失败");
}
//接受屏,手动关联槽函数
serilaPort = new QSerialPort(this);
connect(serilaPort,SIGNAL(readyRead()),this,SLOT(on_recv_readyRead()));
void Widget::on_recv_readyRead()
{
QString buf;
buf = QString(serilaPort->readAll());
ui->resvEdit->appendPlainText(buf);
}
//关闭按钮,自动关联槽函数
void Widget::on_pushButton_3_clicked()
{
serilaPort->close();
}
//发送按钮,自动关联槽函数
void Widget::on_sendBT_clicked()
{
serilaPort -> write(ui->sendEdit->text().toLocal8Bit().data());
}
//清除按钮。。。。。
void Widget::on_clearlBT_clicked()
{
ui->resvEdit -> clear();
}