我这里主要是对串口类的简单使用,实现的功能是以读写方式打开串口,点击发送数据按钮将发送区的数据发送到缓冲区,然后在接收区显示出来,界面如下:(源码可以在这里下载)
这里使用了QSerialPort模块提供的两个类:QSerialPort类和QSerialPortInfo类,QSerialPort类提供了对串口的操作,QSerialPortInfo类提供了对串口信息的获取。下面是主要代码,包含了对串口类的简单使用。
首先,一定要在.pro文件中添加:QT += serialport
串口初始化如下:
- /****************************串口初始化*****************************/
- void MainWindow::initPort()
- {
- //读取串口信息
- foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
- {
- qDebug()<<"Name:"<<info.portName();
- qDebug()<<"Description:"<<info.description();
- qDebug()<<"Manufacturer:"<<info.manufacturer();
- //这里相当于自动识别串口号之后添加到了cmb,如果要手动选择可以用下面列表的方式添加进去
- QSerialPort serial;
- serial.setPort(info);
- if(serial.open(QIODevice::ReadWrite))
- {
- //将串口号添加到cmb
- ui->cmbPortName->addItem(info.portName());
- //关闭串口等待人为(打开串口按钮)打开
- serial.close();
- }
- }
- QStringList baudList;//波特率
- QStringList parityList;//校验位
- QStringList dataBitsList;//数据位
- QStringList stopBitsList;//停止位
- baudList<<"50"<<"75"<<"100"<<"134"<<"150"<<"200"<<"300"
- <<"600"<<"1200"<<"1800"<<"2400"<<"4800"<<"9600"
- <<"14400"<<"19200"<<"38400"<<"56000"<<"57600"
- <<"76800"<<"115200"<<"128000"<<"256000";
- ui->cmbBaudRate->addItems(baudList);
- ui->cmbBaudRate->setCurrentIndex(12);
- parityList<<"无"<<"奇"<<"偶";
- parityList<<"标志";
- parityList<<"空格";
- ui->cmbParity->addItems(parityList);
- ui->cmbParity->setCurrentIndex(0);
- dataBitsList<<"5"<<"6"<<"7"<<"8";
- ui->cmbDataBits->addItems(dataBitsList);
- ui->cmbDataBits->setCurrentIndex(3);
- stopBitsList<<"1";
- stopBitsList<<"1.5";
- stopBitsList<<"2";
- ui->cmbStopBits->addItems(stopBitsList);
- ui->cmbStopBits->setCurrentIndex(0);
- //设置按钮可以被按下
- ui->btnOpen->setCheckable(true);
- }
这里通过遍历所有串口将我们需要使用的串口添加到了combox中,如果想要手动选择可以将串口名称通过列表的方式添加到combox中,到使用的时候再选择。
串口设置如下:
- /****************************串口设置******************************/
- void MainWindow::on_btnOpen_clicked()
- {
- if(ui->btnOpen->text() == "打开串口")
- {
- my_serialport = new QSerialPort(this);
- //设置串口号
- my_serialport->setPortName(ui->cmbPortName->currentText());
- //以读写方式打开串口
- if(my_serialport->open(QIODevice::ReadWrite))
- {
- //设置波特率
- my_serialport->setBaudRate(ui->cmbBaudRate->currentText().toInt());
- //设置数据位
- my_serialport->setDataBits(QSerialPort::Data8);
- //设置校验位
- my_serialport->setParity(QSerialPort::NoParity);
- //设置流控制
- my_serialport->setFlowControl(QSerialPort::NoFlowControl);
- //设置停止位
- my_serialport->setStopBits(QSerialPort::OneStop);
- //每秒读一次
- timer = new QTimer(this);
- connect(timer, SIGNAL(timeout()), this, SLOT(readComDataSlot()));
- timer->start(1000);
- setNonSelectable();
- }
- else
- {
- QMessageBox::about(NULL, "提示", "串口没有打开!");
- return;
- }
- }
- else
- {
- timer->stop();
- setSelectable();
- my_serialport->close();
- }
- }
这里是对串口的设置,需要先打开串口才能设置串口参数。参数设置好之后就可以通过read()和write()函数进行数据的读写,我这里用的是1秒的定时器来读缓冲区的数据。
数据收发如下:
- /****************************数据传输******************************/
- void MainWindow::readComDataSlot()
- {
- //读取串口数据
- QByteArray readComData = my_serialport->readAll();
- //将读到的数据显示到数据接收区的te中
- if(readComData != NULL)
- {
- ui->teReceiveData->append(readComData);
- }
- //清除缓冲区
- readComData.clear();
- }
- void MainWindow::on_btnSend_clicked()
- {
- //获取发送区的数据
- QString sendData = ui->teSendData->toPlainText();
- QByteArray sendData_2 = sendData.toLatin1();
- //写入缓冲区
- my_serialport->write(sendData_2);
- }
本文简单介绍了下Qt串口通信模块QSerialPort简单使用方法与实例,更详细的Qt串口通信模块QSerialPort知识请查看下面的相关链接
原文链接:https://blog.csdn.net/lmhuanying1012/article/details/78747737