搜索
bottom↓
回复: 29

【原创分享】Linux下串口以及Qt app通信框架

  [复制链接]

出0入0汤圆

发表于 2015-3-26 22:46:24 | 显示全部楼层 |阅读模式
本帖最后由 345161974 于 2015-3-26 22:50 编辑

晚上码字码了不少,弄了2天时间整理了下之前开发过的一个项目的经验,希望给大家分享下。
=================第一天================

前言:

本文只是分享下自己曾经开发过的一个嵌入式Linux+Qt的系统应用层开发框架,只是分享出来,算不上什么高深的东西,希望可以给需要的人一些帮助吧。本文侧重的是应用层(Linux串口和Qt应用程序通信)这块的框架,并不会去过多的说bootloader,kernel,因为太庞大了,本人也不精通,但是应用层的话,毕竟难度小些,学起来还是挺快,希望分享出来,大家也能学个应用层开发(Linux串口与Qt通信)的一个框架。

讲之前的一些废话:

嵌入式Linux开发系统,在我目前接触的几个项目里,几乎都是这样的一个基础框架:

bootloader->kernel->filesystem->application,也就是:系统引导程序->内核->文件系统->应用程序

bootloader:通常用的都是uboot喽,这个大家应该都晓得,uboot用的最多;

kernel:从官网下载一个,根据自己的硬件平台或者根据kernel提供的相似的硬件平台,编译出kernel;

filesystem:通常是用busybox来构造最小文件系统,busybox小而强大,非常适合构建文件系统;

application:在Linux下的话,现在还是Qt用的多一些喽。

其实这篇博客我想讲的就是当uboot执行了,kernel也执行了,最后文件系统挂载上去之后的一些事情。文件系统挂载之后,下面就是要执行我们的应用程序了,根据Linux开机执行的脚本顺序,我们把开机执行的应用程序,放在/etc/profile文件里执行,比如本文主要讲的程序comm_if,那么,我们在/etc/profile文件的最后,加上一行:./comm_if &即可,这样就实现了开机自动去执行comm_if这个程序,下面我就主要讲怎么在comm_if这个程序里,把串口以及Qt的程序同时打开工作。

我把关键源码附一份,下载地址:http://download.csdn.net/detail/yuan8222/8534069
=================第二天================

首先来介绍下项目背景,这个项目主要是一个高压注射机器,一个注射头+显示器,注射头和显示器间进行联机通讯,注射头通过RS232通信协议和显示器程序进行通信,显示器程序一方面要负责进行注射头传输过来的数据处理,一方面还要负责和Qt界面通信,不然Qt界面是没有数据的,那么其实本文章主要写的就是显示器主板程序基于Linux系统下如何完成这个需求,我们直接开始分析源码。



第一步我们创建了一个消息队列,消息队列是Linux里进程间通信的一种方式,创建这个消息队列,我们显示器这个程序就可以和Qt的gui程序进行通信,如果对消息队列不懂的话,可以参考Linux进程间通信,找下资料学习学习;



第二步骤便是,我们在Linux下实现一个串口通信,完成和注射头之间的RS23协议的通信,这一部分便是将我们Linux下串口编程的知识用了上来,是不是也挺实用的?

然后串口的收发是在下面的这段代码里实现的,通过read函数进行串口的读取:



然后串口的写的话,也就是向注射头发送数据,那么是通过下面这个函数write进行的:



好了,这个Linux下的串口通信程序,在真正的项目开发中,其实也就是这么用起来的;

下面第三步骤就是比较重要的一步了,就是Linux下如何父进程创建子进程,然后我们显示器通信程序便可以顺利的把Qt的图形界面程序调用起来,其实Linux下创建进程无非通过fork()函数或者vfork()函数,这里我们使用fork()函数:



Linux下fork()函数调用后,当返回值pid==0时,便是在子进程里了,这个时候,我们便去调用Qt的应用程序,这个程序里是analysicpro,然后通过execl函数,我们便将Qt的应用程序执行起来了;

通过上面的代码,我们已经建立了如下的操作:

1:建立显示器通信程序和Qt程序的消息队列;

2:创建了显示器通信程序和注射头之间的串口通信;

3:通过Linux下的进程的创建,我们成功打开了Qt的应用程序

通过以上三步骤,现在我们的显示器板子运行着和注射头通信的显示器通信程序,还运行着Qt的应用程序,那么还差最后一步,那就是显示器通信程序和Qt应用程序之间的通信,这个通信就是消息队列的收发喽,看代码:



在显示器端,我们通过消息队列函数msgrcv进行Qt应用程序端的数据发送,然后如果有数据的话,便通过msg_info_type来进行数据判断,然后根据不同的消息类型进行处理。

那么我们再看下Qt应用程序这边的程序,程序代码见:msgthread.h msgthread.cpp



在Qt应用程序这块,为了保证消息的及时性,我们采用了线程,msgThread继承QThread类实现一个线程,然后在线程的run函数里,我们便可以进行数据处理:

在Qt的线程类的run方法里,我们便进行消息队列的数据接收,然后根据msg.info_type进行判断处理,其中消息队列的发送通过这些函数:


上面两个函数便是消息队列消息的发送。

好了,至此,Qt应用程序和显示器通信程序之间也可以进行消息的通信了,然后显示器通信程序通过Linux下的串口和注射头进行通信,那么这个框架便搭建完成了。

具体的细节,那就是靠伟大的程序员一点点添砖加瓦的完成喽。
最后附上一份Linux下的串口编程资料:
[整理]Linux下串口编程以及参考书籍

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2015-3-26 23:35:23 来自手机 | 显示全部楼层
Qt不是自带串口吗 移植好就行

出0入0汤圆

 楼主| 发表于 2015-3-26 23:43:00 | 显示全部楼层
lyxer 发表于 2015-3-26 23:35
Qt不是自带串口吗 移植好就行

这个晓得哦,当时也是考虑到如果Qt也负责串口处理,那Qt易出现问题的几率就大大增加了,后来就分离开来,让Qt主要负责绘图这块功能。

出0入0汤圆

发表于 2015-3-27 08:38:46 | 显示全部楼层
正好最近有相关项目,多谢楼主.

出0入0汤圆

发表于 2015-3-27 09:00:05 | 显示全部楼层
Linux 串口 mark

出0入0汤圆

发表于 2015-3-27 09:06:42 | 显示全部楼层
赞!
业余折腾过2440一年多,忘了都.

出25入84汤圆

发表于 2015-3-27 09:23:50 | 显示全部楼层
linux正在入门,楼主文章很有帮助

出0入16汤圆

发表于 2015-3-27 09:27:44 | 显示全部楼层
有时间看看!谢谢!

出0入0汤圆

发表于 2015-3-27 09:28:58 | 显示全部楼层
串口通信和qt分开的思路挺好。

出0入0汤圆

发表于 2015-3-27 09:30:38 | 显示全部楼层
收藏再说

出0入0汤圆

 楼主| 发表于 2015-3-27 10:27:32 | 显示全部楼层
这里用到的知识都是Linux里比较经典的,串口,进程创建,进程通信,Qt线程,个人觉得,还是能学不少东西的。Qt 4.x的时候,串口还是很不好用的,还是需要依靠第三方的库,反正我自己也尝试过,总之不如Linux下的串口开发好使唤。

出0入0汤圆

发表于 2015-3-27 10:35:12 | 显示全部楼层
谢了,研究一下

出0入0汤圆

发表于 2015-3-27 11:48:56 | 显示全部楼层
这个好啊!谢谢分享。

出0入0汤圆

发表于 2015-3-27 11:50:53 | 显示全部楼层
QT不搞图形  还不如全部用C实现。

出0入0汤圆

发表于 2015-3-27 12:15:39 | 显示全部楼层
好帖子,赞一个

出0入0汤圆

发表于 2015-3-27 12:37:36 | 显示全部楼层
linux基础运用,描述的很实在

出0入0汤圆

发表于 2015-3-27 13:14:32 | 显示全部楼层
收藏,一篇很全面的样例。

出0入0汤圆

发表于 2018-10-26 11:48:39 | 显示全部楼层
正准备学习一下,收藏了

出0入0汤圆

发表于 2019-2-15 22:01:55 | 显示全部楼层
谢谢,分享

出0入0汤圆

发表于 2019-2-15 22:36:35 来自手机 | 显示全部楼层
收藏串口通讯

出0入0汤圆

发表于 2019-3-7 16:45:30 | 显示全部楼层
可以有新手学习的意义,QT和其他程序通信,共享内存快,还是这个消息队列快,有比较过吗

出0入0汤圆

发表于 2019-3-7 17:24:15 | 显示全部楼层
收藏,谢谢分享。

出0入0汤圆

发表于 2019-3-26 00:00:39 | 显示全部楼层
赞。学习了

出0入0汤圆

发表于 2019-3-30 22:11:06 来自手机 | 显示全部楼层
谢谢分享,赞一个。

出0入0汤圆

发表于 2019-3-30 22:36:15 来自手机 | 显示全部楼层
快要用到这方面知识了

出0入114汤圆

发表于 2019-3-31 08:08:43 来自手机 | 显示全部楼层
这个不错

出0入0汤圆

发表于 2019-3-31 13:13:51 来自手机 | 显示全部楼层
感谢楼主分享

出0入0汤圆

发表于 2019-6-30 10:18:23 | 显示全部楼层
感谢楼主分享

出0入0汤圆

发表于 2019-6-30 16:02:47 | 显示全部楼层
感谢楼主分享

出0入0汤圆

发表于 2019-7-1 14:11:20 来自手机 | 显示全部楼层
学习了,消息队列还没有用过。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 03:46

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表