QT下的串口编程
对串口进行读和写。编程实例:写一个自己的串口助手。
1.创建工程
依旧是选择qt widget application,然后再配置好相关操作,基类选择QWidget。创建后马上编译一下,验证一下初始工程没有问题。
2. 做好相关的UI界面
- 做一个文本接收界面,Plain Text Edit。
- 作一些相关的属性选择下拉框(诸如串口号,波特率,校验位等),使用Combo Box。双击控件就可以编辑相关的下拉选项。
- 做一个发送框,使用Line Edit,注意设置为readOnly。
- 做一些按钮,使用Push Button。
- 做一个控件箱子,就是可以存放多个控件的小包。使用Group Box。
3. 调用serialport相关内容,做好串口端口号的检查并列出到UI。
在widget的建构函数中,设置串口相关内容。
#include<QSerialPortInfo>
widget::widget():QWidget(parent),ui(new Ui::Widget)
{QStringList serialNamePort;foreach(const QSerialPortInfo &inf0 ,QSerialPortInfo::availablePorts()){serialNamePort<<info0.portName();}//当前ui的serialCb对象(ComboBox类的对象),调用它的addItems()方法//效果就是把字符串list中的字符串组,依次制作成下拉框的选项。ui->serialCb->addItems(serialNamePort);
}
4.调用serialport相关内容,完成相关的逻辑功能
//记得包含头文件
#include<QSerialPortInfo>
//设置好当前窗口的建构函数
widget::widget():QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);QStringList serialNamePort;serialPort=new QserialPort(this);foreach(const QSerialPortInfo &inf0 ,QSerialPortInfo::availablePorts()){serialNamePort<<info0.portName();}//当前ui的serialCb对象(ComboBox类的对象),调用它的addItems()方法//效果就是把字符串list中的字符串组,依次制作成下拉框的选项。ui->serialCb->addItems(serialNamePort);
}//设置一个按键信号的槽函数(就是按下按键后,关联的槽函数根据相关的属性设置,设置好串口属性)
//可以在帮助界面查阅串口类QSerialPort的各种属性、方法。
//不妨令槽函数为on_openBt_clicked()
void Widget::on_openBt_clicked()
{QSerialPort::BaudRate baudRate;QSerialPort::DataBits dataBits;QSerialPort::StopBits stopBits;QSerialPort::Parity checkBits;//仅作演示,建议使用map容器,更加方便。可以直接将字符串映射到相应的类的静态成员枚举变量if(ui->baudrateCb->currentText()=="4800"){baudRate=QSerialPort::Baud4800;}else if(ui->baudrateCb->currentText()=="9600"){baudRate=QSerialPort::Baud9600;}
}serialPort->setPortName(ui->serialCb->currentText());serialPort->setBaudRate(baudRate);serialPort->setDataBits(dataBits);serialPort->setStopBits(stopBits);serialPort->setParity(checkBits);//最后检查串口是否打开成功if(serialPort->open(QIODevice::ReadWrite)==true){QMessageBox::information(this,"提示","成功");}else{QMessageBox::critical(this,"提示","失败");}//关闭串口的槽函数,记得在对应的头文件下的类中声明
void Widget::on_closeBt_clicked()
{serialPort->close();//关闭串口
}//接受到数据,可以读取串口传过来的内容对应的的槽函数,记得在对应的头文件下的类中声明
void serialPortReadyToRead_Slot()
{QString buf;buf = QString(serialPort->readAll());ui->recvEdit->appendPlainText(buf);//recvEdit是Plain Text Edit类的一个对象
}//发送数据的按键的按下信号的槽函数,记得在对应的头文件下的类中声明
void Widget::on_senBy_clicked()
{serialPort->write(ui->sendEdit->text().toLocal8Bit().data());
}//清空数据的按键的点击信号的槽函数,记得在对应的头文件下的类中声明
void Widget::on_clearBt_clicked()
{ui->recvEdit->clear();
}