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
    +关注

    关注

    88

    文章

    11628

    浏览量

    217968
  • 嵌入式主板
    +关注

    关注

    7

    文章

    6107

    浏览量

    36950
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    嵌入式主板的选型与应用

    一、嵌入式主板核心元器件选型的关键考量在嵌入式主板设计中,核心元器件的选型直接决定产品性能与可靠性,需结合场景需求精准匹配。以处理器为例,除算力与功耗外,还需关注工业级温度范围——如
    的头像 发表于 11-03 17:20 501次阅读
    <b class='flag-5'>嵌入式</b><b class='flag-5'>主板</b>的选型与应用

    嵌入式工程师为什么要学QT?

    Qt嵌入式工程师来说,真的很重要吗? Qt是一个跨平台的C++应用程序开发框架,非常适合嵌入式系统的开发,
    发表于 08-14 15:15

    一文带你了解嵌入式主板

    嵌入式主板是专为嵌入式系统设计的计算机主板。它与我们常见的台式机或笔记本电脑主板有着显著的区别,核心在于它不是为了通用计算,而是为了执行特定
    的头像 发表于 06-30 16:12 478次阅读
    一文带你了解<b class='flag-5'>嵌入式</b><b class='flag-5'>主板</b>

    Linux嵌入式和单片机嵌入式的区别?

    :使用Linux操作系统,可以运行各种复杂的应用程序和驱动程序。 4. 资源需求 : 单片机嵌入式 :对硬件资源的需求较低,通常只需要一个单片机芯片,内存和存储空间较小。
    发表于 06-20 09:46

    嵌入式主板详解与选购指南

    什么是嵌入式主板嵌入式主板是专为嵌入式系统设计的核心计算平台。它与我们日常使用的台式机或笔记本电脑主板
    的头像 发表于 06-06 13:23 553次阅读
    <b class='flag-5'>嵌入式</b><b class='flag-5'>主板</b>详解与选购指南

    Linux的作用

    。 2、嵌入式系统:Linux可以被嵌入到各种嵌入式设备中,如智能路由器、智能电视等。它提供了一个灵活的平台,可以根据设备的需求进行定制和优化。 3、个人电脑操作系统:
    发表于 04-04 01:57

    嵌入式主板开发详细指南

    嵌入式主板开发涉及硬件设计、软件集成、系统优化等多个环节,需要结合具体应用场景进行深度定制。以下是嵌入式主板开发的详细指南,涵盖关键步骤、工具、挑战及实际案例:一、开发流程与关键步骤1
    的头像 发表于 04-02 11:35 937次阅读
    <b class='flag-5'>嵌入式</b><b class='flag-5'>主板</b>开发详细指南

    高可靠性嵌入式主板设计

    设计直接影响整个系统的稳定性和寿命。因此,设计高可靠性的嵌入式主板不仅是技术挑战,也是提高产品竞争力的关键因素。本文将深入探讨高可靠性嵌入式主板
    的头像 发表于 03-25 15:11 809次阅读
    高可靠性<b class='flag-5'>嵌入式</b><b class='flag-5'>主板</b>设计

    嵌入式主板选型与应用指南

    嵌入式主板是专为嵌入式系统设计的核心硬件平台,广泛应用于工业控制、物联网、医疗设备等领域。以下是关于嵌入式主板的详细介绍:1.
    的头像 发表于 02-27 14:53 936次阅读
    <b class='flag-5'>嵌入式</b><b class='flag-5'>主板</b>选型与应用指南

    ElfBoard技术贴|如何在ELF 1开发板上交叉移植Qt

    嵌入式系统开发领域,针对特定硬件平台进行Qt框架的移植与适配是一项关键技术任务。作为业界主流的跨平台应用开发框架,Qt凭借其完善的图形界面支持能力,在
    的头像 发表于 02-24 16:18 1038次阅读
    ElfBoard<b class='flag-5'>技术</b>贴|如何在ELF 1开发板上交叉移植<b class='flag-5'>Qt</b>

    小身材大能量:解读小尺寸嵌入式主板

    此前,已经带大家认识了嵌入式主板的尺寸版型,相信大家对此已有了初步印象。在科技日新月异的当下,各类设备都朝着更小体积、更高性能的方向发展。小尺寸嵌入式主板正悄无声息改变着我们的生活与商
    的头像 发表于 02-17 18:02 993次阅读
    小身材大能量:解读小尺寸<b class='flag-5'>嵌入式</b><b class='flag-5'>主板</b>

    盘点无风扇嵌入式主板应用优势

    在科技飞速发展的今天,嵌入式主板在各个领域发挥着重要作用。而无风扇嵌入式主板以独特优势在工业自动化、医疗设备和智能交通等领域广泛应用。今天,就让我们一起深入了解无风扇
    的头像 发表于 02-15 18:04 653次阅读
    盘点无风扇<b class='flag-5'>嵌入式</b><b class='flag-5'>主板</b>应用优势

    嵌入式主板的概述与发展

    随着科技的迅猛发展,嵌入式系统在现代电子产品中扮演着越来越重要的角色。嵌入式主板作为嵌入式系统的核心组件之一,承担着控制、处理和通讯等多种功能。本文将对
    的头像 发表于 01-13 16:30 1184次阅读
    <b class='flag-5'>嵌入式</b><b class='flag-5'>主板</b>的概述与发展

    基于QT开发国产主板终端桌面程序 高效、稳定、跨平台的解决方案

    了开发者们面临的一个重要挑战。本文将介绍如何基于QT框架,开发适用于国产主板的终端桌面程序,并探讨其优势和应用场景。 QT是一个跨平台的C++图形用户界面
    的头像 发表于 01-08 15:34 1442次阅读

    ARM架构嵌入式主板特点

    嵌入式主板可以理解为嵌入在设备中用于控制和数据处理的CPU板,也就是设备的“大脑”。当主板嵌入到设备中,当然对
    的头像 发表于 12-31 16:03 1839次阅读
    ARM架构<b class='flag-5'>嵌入式</b><b class='flag-5'>主板</b>特点