【北京迅为】iTOP-4412全能版使用手册-第七十七章 Qt串口编程

iTOP-4412全能版采用四核Cortex-A9,主频为1.4GHz-1.6GHz,配备S5M8767 电源管理,集成USB HUB,选用高品质板对板连接器稳定可靠,大厂生产,做工精良。接口一应俱全,开发更简单,搭载全网通4G、支持WIFI、蓝牙、陀螺仪、CAN总线、RS485总线、500万摄像头等模块,稳定运行Android 4.0.3/Android 4.4操作,系统通用Linux-3.0.15+Qt操作系统(QT支持5.7版本),Ubuntu版本:12.04,接口智能分配 方便好用。


第七十七章 Qt串口编程

本节我们使用Qt来编写一个简单的上位机。

实验介绍:组装ui界面,使用Qt提供的串口类来实现串口收发功能,需要掌握的相关 Qt知识有以下几点:

QSerialPort是 Qt5中的附加模块,提供了基本的功能,包括配置、I/O操作、获取和设置RS-232引脚的信号,要链接QtSerialPort模块,需要在.pro文件中添加+=serialport。

QSerialPort封装了丰富的成员变量来对应串口属性,还有很多操作串口的成员函数,常用的成员函数有setPort()或setPortName(),setBaudRate(),setDataBits(),setStopBits(),setParity()等,可以用这些函数设置要访问的串口设备。本实验使用了readyRead()信号,当有数据到来时会触发类对象的readyRead()信号,然后利用它的成员函数 readAll()读取。

类QSerialPortInfo可以获取可用的串口信息,如端口名称,系统位置,产品号,描述,制造商等信息。我们把它获取到的端口信息交给QSerialPort类对象。

77.1 界面布局

步骤一:将控件拖到ui界面上

接收框使用Plain Text Edit,发送框使用lineEdit,属性选择组件使用Combo Box。

步骤二:属性设置栏布局,以串口号为例,依次水平布局属性选择位。

然后全部选中属性选择框,点垂直布局

效果如图:

步骤三:功能栏布局,在按钮间添加弹簧,点击水平布局。

选中Lbel,发送框和功能按钮,点击垂直布局:

如图 :

选中属性栏和右侧组件,然后点击水平布局,如图:

完成后:

再仿照上边的方法将下方的功能部分和接收框垂直布局:

添加完组件后,更改接收框为只读:点击接收框,在QTextEdit里标记readOnly。

在右上角更改ui界面对象名,界面组装完成后可以根据需要自行修改,

双击属性选择框添加属性:

如图:

77.2 实现串口功能

1.编辑工程文件(后缀为 .pro的文件)在QT += core gui后添加 serialport。

2.自动获取串口

使用QSerialPortInfo:::availablePorts()获取当前串口,该函数返回容器类Qlist<QSerialPortInfo>,用Qt定义的关键字foreach遍历容器Qlist里的串口信息,并将串口信息放到QStringList的类对象serialNamePort,显示到ui的串口组件。

{
{
    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::on_openCb_clicked()
{
    QSerialPort::BaudRate bauRate;   //波特率
    QSerialPort::DataBits dataBits;  //数据位
    QSerialPort::StopBits stopBits;  //停止位
    QSerialPort::Parity   checkBits; //校验位
 
    //设置波特率
    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::Data5;}
    else if(ui->dataCb->currentText() == "6")   { dataBits = QSerialPort::Data6;}
    else if(ui->dataCb->currentText() == "7")   { dataBits = QSerialPort::Data7;}
    else if(ui->dataCb->currentText() == "8")   { dataBits = QSerialPort::Data8;}
 
    //设置停止位
    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::on_sendBt_clicked()
{
    serilaPort->write(ui->sendEdit->text().toLocal8Bit().data());
}

5.关闭串口功能

使用QSerialPort的成员函数close()关闭串口。

void Widget::on_closeBt_clicked()
{
serilaPort->close();
}

6.清空发送栏数据

调用ui组件lineEdit的成员函数clear即可清空数据。

void Widget::on_clearBt_clicked()
{
    ui->recvEdit->clear();
}

编译测试,结果如图:

相关推荐
LuckyLay1 小时前
Linux网络知识——路由表
linux·服务器·网络·路由·ip route
ydswin1 小时前
Chrony:让你的服务器时间精准到微秒级的神器!
linux
刘泽美1 小时前
Ubuntu/centOS 如何安装 OpenGL
linux·运维·ubuntu
kucupung2 小时前
【编译构建】用cmake编译libjpeg动态库并实现转灰度图片
linux·c++
釉色清风2 小时前
【Linux】常见指令(一)
linux·运维·服务器
honey ball2 小时前
过压保护电路
单片机·嵌入式硬件
扛枪的书生2 小时前
Linux 提权指南
linux·渗透·kali·提权
二当家的素材网3 小时前
SDK调用文心一言如何接入,文心一言API接入教程
linux·运维·服务器
Jack153027682793 小时前
高性能、低成本立体声音频模数转换器—— GC1808,支持掉电和时钟检测低功耗模式
单片机·嵌入式硬件·fpga开发·制造·蓝牙·家庭影院·麦克风阵列处理器