0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

英创信息技术嵌入式Linux主板Qt串口应用程序简介

英创信息技术 来源:英创信息技术 作者:英创信息技术 2020-01-17 09:41 次阅读

串口和其他设备一样,在Linux系统中都是以设备文件的形式存在的,在英创公司提供的Linux主板配套光盘中,已经提供了基于C/C++ 的Linux标准串口操作例程,使用open函数来打开串口设备文件:'/dev/ttyS1',设置串口参数,创建一个单独的线程来对数据进行收发,使用read函数读取数据,write函数发送数据。并且英创公司将其封装成一个serial类,可以使用serial类方便的操作英创工控主板的串口资源。

本文介绍如何在英创公司提供的Linux工控主板的串口例程Step2_serialtest的基础上,加入了Qt显示,实现在LCD显示屏上控制串口通讯。基本的思想是利用Qt的信号和插槽机制进行对象间的通讯,当串口接收的数据的时候,发出Signal,Qt 的显示事件循环中接收到这个信号,调用定义好的Slot显示串口的数据,如下图:

串口和Qt显示

先使用Qt Creator创建一个工程,加入英创公司提供的Linux工控主板串口例程中的serial.h和serial.cpp文件,因为要在Step2_serialtest例程的基础上加入Qt显示单元,所以我们需要让英创公司封装好的serial类继承QObject类的属性,使QObject成为serial类的基类,然后在serial类中加入一个signal,让serial类和Qt显示通过信号和插槽的机制连接。但是对于串口的操作部分并不用做修改。

QObject类是所有Qt对象的基类并且是Qt对象模型的中心。这个模型的中心特征就是一种用于无缝对象通讯的被叫做信号和槽的非常强大的机制。只有继承了 QObject 类的类,才具有信号和槽的能力。所以,为了使用信号和槽,必须继承 QObject。凡是 QObject 类(不管是直接子类还是间接子类),都应该在第一行代码写上 Q_OBJECT。不管是不是使用信号和槽,都应该添加这个宏。这个宏的展开将为我们的类提供信号和槽机制、国际化机制以及 Qt 提供的不基于 C++ RTTI 的反射能力。所以在serial.h中作如下修改:

class CSerial: public QObject //继承QObject
{
Q_OBJECT
signals:
void readyRead(QString);
};

在serial.cpp中,串口数据接收线程检测到有数据可读时,添加发送信号的语句,提示显示对象有数据可以显示,并把数据发送给显示对象:

emit pSer->readyRead(pSer->DatBuf);

对串口程序的修改已经完成,在工程中加入Qt设计师界面,根据需要设计显示界面,本例程中的界面如下:

设计的界面

可以看到,在界面中添加了三个按钮,分别为“打开串口”,“关闭串口”和“清除数据”,两个组合框,用来选择串口的端口号和比特率,一个文本浏览器用来显示串口接收的数据。在工程中加入窗口显示程序:widget.h和 widget.cpp,首先要对显示界面进行初始化,实现代码如下:

Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this); //显示界面的初始化
setActionsEnabled(true); //使能组件
setComboBoxEnabled(true);
}

定义接收串口发送信号的插槽,在窗口的文本浏览器中显示串口接收的数据:

void Widget::readMyCom(QString buf)
{
//将串口的数据显示在窗口的文本浏览器中
ui->textBrowser->setText(ui->textBrowser->document()->toPlainText() + buf);
QTextCursor cursor = ui->textBrowser->textCursor();
cursor.movePosition(QTextCursor::End);
ui->textBrowser->setTextCursor(cursor);
}

将串口发送的Signal和显示窗口类中Slot连接起来,以便响应:

QObject::connect(myCom,SIGNAL(readyRead(QString)),this,SLOT(readMyCom(QString)),Qt::QueuedConnection);

这里需要特别说明一点,由于串口例程会打开一个线程对数据进行处理,所以这里发送Signal的是串口处理数据的线程,而接收Signal是在显示的线程中,所以他们的连接方式需要采用Qt::QueuedConnection,这样使用跨线程的Signal和Slot连接,Signal发送以后,会等到控制权返回到接收者线程的事件循环后才调用槽,就是说槽在接收者的线程中被执行,如果采用其他方式连接,显示可能就会出现各种错误。

如果在显示界面中添加了一些其他功能组件,比如按钮等,可以在这里编写组件的事件响应函数,实现想要的功能,在本例程中,添加了一些组合框和按钮,用来选择串口的端口号和波特率,并且打开或者关闭串口,部分实现代码如下:

void Widget::on_openpushButton_clicked() //打开按钮
{
qint8 i;
portno=ui->portNamecomboBox->currentText(); //读取端口号
ba = portno.toLatin1();
m_portno=ba.data(); //转换为字符串
ba.clear();
baudRate=ui->baudRatecomboBox->currentText(); //读取波特率
m_baudRate=baudRate.toInt(); //转换为整形
myCom=new CSerial;
i=myCom ->OpenPort( m_portno, m_baudRate, '8', '1', 'N' ); //打开串口
if(i<0)
{
QMessageBox::information(this, tr('打开失败'), tr('打开串口失败') , QMessageBox::Ok); //打开失败弹出提示框
delete myCom;
myCom = NULL;
return;
}

void Widget::on_closeopenpushButton_clicked() //关闭按钮
{
myCom->ClosePort(); //关闭串口
delete myCom;
myCom = NULL;
setComboBoxEnabled(true);
ui->closeopenpushButton->setEnabled(false);
}

最后在工程中添加main.cpp,在main函数中,主要是对字体进行设置,并且显示我们设计的窗口:

int main( int argc,char* argv[] )
{
QApplication a(argc, argv);
QFont font('simsun',11,QFont::Bold); //设置字体
a.setFont(font);
QTextCodec::setCodecForTr(QTextCodec::codecForName('utf8'));
Widget w;
w.showFullScreen(); //显示窗口
return a.exec();
}

运行程序,例程的效果如下:

程序运行效果

可以通过显示界面选择开启哪一路串口,设置波特率,显示接收到的数据。本例程只是简单的把Step2_serialtest和Qt的显示连接起来,将串口收到的数据显示在Qt的界面中,并且进行回发,客户的使用方法还是和以前的Step2_serialtest一样只是增加了显示界面。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    10987

    浏览量

    206723
  • 嵌入式主板
    +关注

    关注

    7

    文章

    6064

    浏览量

    34605
收藏 人收藏

    评论

    相关推荐

    嵌入式人工智能的就业方向有哪些?

    操作系统使用及C高级编程 数据结构与算法 二:嵌入式Linux应用工程师,Linux网络开发工程师 文件IO 并发程序设计 项目实战:基于Linux
    发表于 02-26 10:17

    如何用RK3588编写应用程序

    由于笔者平时的嵌入式开发工作,主要是集中在嵌入式LinuxQt应用开发方向,因此,本篇文章我们尝试参考飞凌官方提供的嵌入式
    发表于 12-19 13:24

    【从0开始创建AWTK应用程序】编译应用到嵌入式Linux平台运行

    。搭建Linux平台交叉编译环境在上一篇文章我们介绍了使用AWTK开发简单的应用并在PC上模拟运行,本篇文章就来介绍一下怎么让应用程序运行在嵌入式Linux平台上。1
    的头像 发表于 12-07 12:08 280次阅读
    【从0开始创建AWTK<b class='flag-5'>应用程序</b>】编译应用到<b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b>平台运行

    嵌入式Linux应用程序开发详解-第3章

    电子发烧友网站提供《嵌入式Linux应用程序开发详解-第3章.pdf》资料免费下载
    发表于 11-16 11:19 0次下载
    <b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b><b class='flag-5'>应用程序</b>开发详解-第3章

    嵌入式Linux应用程序开发详解-第2章

    电子发烧友网站提供《嵌入式Linux应用程序开发详解-第2章.pdf》资料免费下载
    发表于 11-16 11:18 0次下载
    <b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b><b class='flag-5'>应用程序</b>开发详解-第2章

    嵌入式Linux应用程序开发详解-第1章

    电子发烧友网站提供《嵌入式Linux应用程序开发详解-第1章.pdf》资料免费下载
    发表于 11-16 11:17 0次下载
    <b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b><b class='flag-5'>应用程序</b>开发详解-第1章

    基于嵌入式LinuxQT的汽车虚拟仪表设计

    电子发烧友网站提供《基于嵌入式LinuxQT的汽车虚拟仪表设计.pdf》资料免费下载
    发表于 10-26 14:38 0次下载
    基于<b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b>与<b class='flag-5'>QT</b>的汽车虚拟仪表设计

    基于QT-E的嵌入式Linux系统的软键盘实现

    电子发烧友网站提供《基于QT-E的嵌入式Linux系统的软键盘实现.pdf》资料免费下载
    发表于 10-24 10:42 0次下载
    基于<b class='flag-5'>QT</b>-E的<b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b>系统的软键盘实现

    什么是嵌入式Linux

    Linux到底是什么呢? 嵌入式linux 是将日益流行的Linux操作系统进行裁剪修改,使之能在嵌入式计算机系统上运行的一种操作系统。简单
    发表于 10-11 13:47

    嵌入式Linux应用开发的完全手册

    嵌入式Linux嵌入式领域发展迅速、需求旺盛,但是嵌入式Linux 的入门很难。初学者多是自己琢磨,效率不高。学习过程中碰到的问题千奇百怪
    发表于 09-25 07:12

    创建一个简单Hello World Linux应用程序的过程

    本教程将向您介绍创建一个简单的Hello World Linux应用程序的过程,然后将该应用程序加载到运行ARM嵌入式Linux的Corte
    发表于 08-28 06:32

    如何使用DS-5 1.0版调试Linux应用程序

    本教程将带领您完成创建一个简单的Hello World Linux应用程序的过程,使用C Linux应用程序创建一个简单的Hello World L
    发表于 08-12 06:01

    嵌入式Linux GDB是什么

    GDB 调试工具,通过 GDB 来调试嵌入式 C 程序。 GDB 简介 gdb 工具是 GNU 项目调试器,基于命令行。和其他的调试器一样,我们可以使用 gdb来一行行的运行程序、单
    的头像 发表于 07-27 16:29 452次阅读
    <b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b> GDB是什么

    嵌入式学习路线你知道吗?

    应用和驱动开发打下坚实的基础。 4学习嵌入式Linux应用程序开发 这一阶段主要学习上层的嵌入式Linux
    发表于 06-14 16:00

    瑞萨嵌入式应用程序编程接口参考手册

    瑞萨嵌入式应用程序编程接口参考手册
    发表于 05-04 19:44 1次下载
    瑞萨<b class='flag-5'>嵌入式</b><b class='flag-5'>应用程序</b>编程接口参考手册