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();
}