【北京迅为】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();
}

编译测试,结果如图:

相关推荐
A小辣椒2 天前
TShark:Wireshark CLI 功能
linux
A小辣椒2 天前
TShark:基础知识
linux
AlfredZhao2 天前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao3 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334663 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪3 天前
linux 拷贝文件或目录到指定的位置
linux
摇滚侠4 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
bush44 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5204 天前
Linux 11 动态监控指令top
linux
不会C语言的男孩4 天前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言