初次使用QT5串口类QSerialPort

我这里主要是对串口类的简单使用,实现的功能是以读写方式打开串口,点击发送数据按钮将发送区的数据发送到缓冲区,然后在接收区显示出来,界面如下:(源码可以在这里下载)

                                                             初次使用QT5串口类QSerialPort


        这里使用了QSerialPort模块提供的两个类:QSerialPort类和QSerialPortInfo类,QSerialPort类提供了对串口的操作,QSerialPortInfo类提供了对串口信息的获取。下面是主要代码,包含了对串口类的简单使用。


        首先,一定要在.pro文件中添加:QT += serialport


        串口初始化如下:

[cpp] view plain copy
  1. /****************************串口初始化*****************************/  
  2. void MainWindow::initPort()  
  3. {  
  4.     //读取串口信息  
  5.     foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())  
  6.     {  
  7.         qDebug()<<"Name:"<<info.portName();  
  8.         qDebug()<<"Description:"<<info.description();  
  9.         qDebug()<<"Manufacturer:"<<info.manufacturer();  
  10.   
  11.         //这里相当于自动识别串口号之后添加到了cmb,如果要手动选择可以用下面列表的方式添加进去  
  12.         QSerialPort serial;  
  13.         serial.setPort(info);  
  14.         if(serial.open(QIODevice::ReadWrite))  
  15.         {  
  16.             //将串口号添加到cmb  
  17.             ui->cmbPortName->addItem(info.portName());  
  18.             //关闭串口等待人为(打开串口按钮)打开  
  19.             serial.close();  
  20.         }  
  21.     }  
  22.   
  23.     QStringList baudList;//波特率  
  24.     QStringList parityList;//校验位  
  25.     QStringList dataBitsList;//数据位  
  26.     QStringList stopBitsList;//停止位  
  27.   
  28.     baudList<<"50"<<"75"<<"100"<<"134"<<"150"<<"200"<<"300"  
  29.            <<"600"<<"1200"<<"1800"<<"2400"<<"4800"<<"9600"  
  30.           <<"14400"<<"19200"<<"38400"<<"56000"<<"57600"  
  31.          <<"76800"<<"115200"<<"128000"<<"256000";  
  32.   
  33.     ui->cmbBaudRate->addItems(baudList);  
  34.     ui->cmbBaudRate->setCurrentIndex(12);  
  35.   
  36.     parityList<<"无"<<"奇"<<"偶";  
  37.     parityList<<"标志";  
  38.     parityList<<"空格";  
  39.   
  40.     ui->cmbParity->addItems(parityList);  
  41.     ui->cmbParity->setCurrentIndex(0);  
  42.   
  43.     dataBitsList<<"5"<<"6"<<"7"<<"8";  
  44.     ui->cmbDataBits->addItems(dataBitsList);  
  45.     ui->cmbDataBits->setCurrentIndex(3);  
  46.   
  47.     stopBitsList<<"1";  
  48.     stopBitsList<<"1.5";  
  49.     stopBitsList<<"2";  
  50.   
  51.     ui->cmbStopBits->addItems(stopBitsList);  
  52.     ui->cmbStopBits->setCurrentIndex(0);  
  53.   
  54.     //设置按钮可以被按下  
  55.     ui->btnOpen->setCheckable(true);  
  56. }  

        这里通过遍历所有串口将我们需要使用的串口添加到了combox中,如果想要手动选择可以将串口名称通过列表的方式添加到combox中,到使用的时候再选择


        串口设置如下:

[cpp] view plain copy
  1. /****************************串口设置******************************/  
  2. void MainWindow::on_btnOpen_clicked()  
  3. {  
  4.     if(ui->btnOpen->text() == "打开串口")  
  5.     {  
  6.         my_serialport = new QSerialPort(this);  
  7.   
  8.         //设置串口号  
  9.         my_serialport->setPortName(ui->cmbPortName->currentText());  
  10.         //以读写方式打开串口  
  11.         if(my_serialport->open(QIODevice::ReadWrite))  
  12.         {  
  13.             //设置波特率  
  14.             my_serialport->setBaudRate(ui->cmbBaudRate->currentText().toInt());  
  15.             //设置数据位  
  16.             my_serialport->setDataBits(QSerialPort::Data8);  
  17.             //设置校验位  
  18.             my_serialport->setParity(QSerialPort::NoParity);  
  19.             //设置流控制  
  20.             my_serialport->setFlowControl(QSerialPort::NoFlowControl);  
  21.             //设置停止位  
  22.             my_serialport->setStopBits(QSerialPort::OneStop);  
  23.   
  24.             //每秒读一次  
  25.             timer = new QTimer(this);  
  26.             connect(timer, SIGNAL(timeout()), this, SLOT(readComDataSlot()));  
  27.             timer->start(1000);  
  28.   
  29.             setNonSelectable();  
  30.         }  
  31.         else  
  32.         {  
  33.             QMessageBox::about(NULL, "提示""串口没有打开!");  
  34.             return;  
  35.         }  
  36.     }  
  37.     else  
  38.     {  
  39.         timer->stop();  
  40.         setSelectable();  
  41.         my_serialport->close();  
  42.     }  
  43. }  

        这里是对串口的设置,需要先打开串口才能设置串口参数。参数设置好之后就可以通过read()和write()函数进行数据的读写,我这里用的是1秒的定时器来读缓冲区的数据。


        数据收发如下:

[cpp] view plain copy
  1. /****************************数据传输******************************/  
  2. void MainWindow::readComDataSlot()  
  3. {  
  4.     //读取串口数据  
  5.     QByteArray readComData = my_serialport->readAll();  
  6.   
  7.     //将读到的数据显示到数据接收区的te中  
  8.     if(readComData != NULL)  
  9.     {  
  10.         ui->teReceiveData->append(readComData);  
  11.     }  
  12.   
  13.     //清除缓冲区  
  14.     readComData.clear();  
  15. }  
  16.   
  17. void MainWindow::on_btnSend_clicked()  
  18. {  
  19.     //获取发送区的数据  
  20.     QString sendData = ui->teSendData->toPlainText();  
  21.     QByteArray sendData_2 = sendData.toLatin1();  
  22.   
  23.     //写入缓冲区  
  24.     my_serialport->write(sendData_2);  
  25. }