itop4412开发板Qt串口编程-实现串口功能
发布时间:2021-4-15 10:43
发布者:落风
1.编辑工程文件(后缀为 .pro 的文件)在 QT += core gui 后添加 serialport。![]() 2.自动获取串口 使用 QSerialPortInfo:::availablePorts()获取当前串口,该函数返回容器类 Qlist { { ui->setupUi(this); QStringList serialNamePort; //遍历:availablePorts()返回的串口信息 foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()){ serialNamePort << info.portName(); } ui->serialCb->addItems(serialNamePort); } 编译后点击串口选择框,会出现已经连接的串口。 ![]() 3.打开串口功能和属性设置 步骤一:实例化串口类 QSerialPort 对象 serialPort,对串口的操作就是对 serialPort 对象的操作,调用QSerialPort 封装的成员变量(属性)和成员函数(功能)就能控制串口。 class Example : public QMainWindow { public: .......... QSerialPort * serialPort; .......... }; ui(new Ui::Example) { ui->setupUi(this); ...... serialPort = new QSerialPort; ...... } 步骤二:填充波特率,数据位,停止位,校验位等属性。获取 ui 组件传递过来的串口信息,将串口属性填充到 serialPort 对象。 ![]() 步骤三:打开串口,判断是否打开成功。 /*打开按钮*/ void Example: ![]() { QSerialPort::BaudRate bauRate; //波特率 QSerialPort: ![]() QSerialPort::StopBits stopBits; //停止位 QSerialPort: ![]() //设置波特率 if (ui->baudCb->currentText() == "4800" ) { bauRate = QSerialPort::Baud4800; } else if(ui->baudCb->currentText() == "9600" ) { bauRate = QSerialPort::Baud9600; } else if(ui->baudCb->currentText() == "115200") { bauRate = QSerialPort::Baud115200;} //设置数据位 if (ui->dataCb->currentText() == "5") { dataBits = QSerialPort: ![]() else if(ui->dataCb->currentText() == "6") { dataBits = QSerialPort: ![]() else if(ui->dataCb->currentText() == "7") { dataBits = QSerialPort: ![]() else if(ui->dataCb->currentText() == "8") { dataBits = QSerialPort: ![]() //设置停止位 if (ui->stopCb->currentText() == "1" ) { stopBits = QSerialPort::OneStop; } else if(ui->stopCb->currentText() == "1.5" ) { stopBits = QSerialPort::OneAndHalfStop; } else if(ui->stopCb->currentText() == "2" ) { stopBits = QSerialPort::TwoStop; } //设置校验位 if(ui->checkCb->currentText() == "none" ) { checkBits = QSerialPort::NoParity; } //填充串口对象的属性值 serialPort->setPortName(ui->serialCb->currentText()); serialPort->setBaudRate(bauRate); serialPort->setDataBits(dataBits); serialPort->setStopBits(stopBits); serialPort->setParity(checkBits); //设置好属性后打开串口 if(serialPort->open(QIODevice::ReadWrite) == true){ QMessageBox::information(this,"提示","成功"); }else{ QMessageBox::critical(this,"提示","失败"); } } 4.收发串口数据功能 读数据:每当数据流从串口到达系统一次,就会传到 Qt 应用程序一次,readyRead 信号就会触 发 一次,所以可以用前面章节讲的信号和槽机制将 readyRead 信号和槽函数绑定,然后就可以在槽函数中读取串口数据。槽函数中使用 readAll()读取数据,使用带换行功能的 appendPlainText()显示到 ui 的接收窗口。 //类中声明槽函数 private slots: void serialPortReadyRead_Solt(void); //readyRead 信号和槽函数绑定 connect(serialPort,SIGNAL(readyRead()),this,SLOT(serialPortReadyRead_Solt())); //读串口 void Example::serialPortReadyRead_Solt(void) { QString buf; buf = QString(serilaPort->readAll()); ui->recvEdit->appendPlainText(buf); } 写数据:获取 ui 界面填写的信息,ui->sendEdit->text(),使用 QSerialPort 的成员函数 write 将数据写到 串口。 void Widget: ![]() { serilaPort->write(ui->sendEdit->text().toLocal8Bit().data()); } 5.关闭串口功能 使用 QSerialPort 的成员函数 close()关闭串口。 void Widget: ![]() { serilaPort->close(); } 6.清空发送栏数据 调用 ui 组件 lineEdit 的成员函数 clear 即可清空数据。 void Widget: ![]() { ui->recvEdit->clear(); } 编译测试,结果如图: ![]() ![]() |
网友评论