前言:
在嵌入式系统中,诸多设备都可以通过串口来控制,比如WiFi、蓝牙、RFID等等,因此在嵌入式设备中使用串口就显得特别重要。在QT5中又自带了串口通信模块,所以用QT来制作串口助手相比较简单些。
一、工程文件的修改
在项目的.pro文件中加入一句 QT += serialport,如下图
一、界面设计
如下图所示,天气窗口界面由图中①、②、③三部分。其中:
(1)第①部分是串口信息的配置,打开/关闭串口按钮,。
(2)第②部分是信息接收区,由一个QTextBrowser框和一个QPushButton按钮组成
(3)第③部分是信息发送区,由一个QTextEdit输入框和3个QPushButton按钮以及QCheckBox复选框组成
三、实现步骤
1、找到串口设备文件
3、配置串口设备(波特率 、数据位 8b、停止位 1b 和校验,无硬件流控模式)
2、打开串口设备
4、发送数据, 接收数据
5、关闭串口设备
四、具体实现
1、通过QSerialPortInfo查询所有串口设备
//扫描串口
void ComWin::on_scanBt_clicked()
{
ui->comboBox->clear();
//获取当前设备上的所有串口
QList<QSerialPortInfo> infos = QSerialPortInfo::availablePorts();
foreach (QSerialPortInfo info, infos)
{
ui->comboBox->addItem( info.portName() );
}
}
2、创建串口对象 QSerialPort
QSerialPort mserial;
3、配置串口信息(波特率 、数据位 、停止位 和校验)
//配置串口属性
void ComWin::setSerial()
{
//配置串口属性
mserial.setBaudRate(ui->baudBox->currentText().toInt());//波特率
switch (ui->dataBox->currentText().toInt()) { //数据位
case 5: mserial.setDataBits(QSerialPort::Data5);break; //5位
case 6: mserial.setDataBits(QSerialPort::Data6);break; //6位
case 7: mserial.setDataBits(QSerialPort::Data7);break; //7位
case 8: mserial.setDataBits(QSerialPort::Data8);break; //8位
}
switch (ui->stopBox->currentText().toInt()) { //停止位
case 1: mserial.setStopBits(QSerialPort::OneStop);break; //1位
case 2: mserial.setStopBits(QSerialPort::TwoStop);break; //2位
}
if(ui->checkBox->currentText() == "NONE")
{
mserial.setParity(QSerialPort::NoParity);//无校验
}
else if(ui->checkBox->currentText() == "ODD")
{
mserial.setParity(QSerialPort::OddParity);//奇校验
}
else if(ui->checkBox->currentText() == "EVEN")
{
mserial.setParity(QSerialPort::EvenParity);//偶校验
}
}
4、调用对象方法打开/关闭串口-----open/close
这里有一个标记falg判断现在按下该按钮是打开还是关闭串口,falg初始值为0,当按钮每按下时,标记falg就加一,所以判断falg是否能被2整除,来判断当前按下是做啥操作
//打开/关闭串口
void ComWin::on_openBt_clicked()
{
if(falg%2 == 0){
setSerial();
mserial.setPortName(ui->comboBox->currentText());
//打开串口
if(!mserial.open(QIODevice::ReadWrite))
{
qDebug()<<"open fail";
}
ui->openBt->setText("关闭");
ui->openBt->setStyleSheet("background-color: rgb(0, 255, 0);");
ui->label_6->setStyleSheet("border-image: url(:/open.png);");
}
else {
//关闭串口
mserial.close();
ui->openBt->setText("打开");
ui->openBt->setStyleSheet("background-color: rgb(255, 0, 0);");
ui->label_6->setStyleSheet("border-image: url(:/close.png);");
}
falg++;
}
5、往串口发送数据---write
这里通过write函数发送信息,并且当复选按钮(自动换行)选上的话,line为2,所以发出去的信息会加一个"\n"。
//发送数据
void ComWin::on_sendBt_clicked()
{
msg = ui->textEdit->toPlainText();
if(this->line!=0) this->msg+="\n";
//发送数据
mserial.write(msg.toUtf8());
}
//是否自动换行
void ComWin::on_newlineBox_stateChanged(int arg1)
{
this->line = arg1;
qDebug()<<line;
}
6、接收串口的数据---当串口有数据可读的时候会发送readyRead信号 readall
关联有数据可读的信号
connect(&mserial, &QSerialPort::readyRead, this, &ComWin::read_data);
读数据函数
//读取串口数据
void ComWin::read_data()
{
//读取串口数据
msg = mserial.readAll();
ui->textBrowser->append(msg);;
}
五、效果展示
问题咨询及项目源码请加群:
QQ群
名称:IT项目交流群
群号:245022761