【原创分享】Linux下串口以及Qt app通信框架
本帖最后由 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下串口编程以及参考书籍
Qt不是自带串口吗 移植好就行 lyxer 发表于 2015-3-26 23:35
Qt不是自带串口吗 移植好就行
这个晓得哦,当时也是考虑到如果Qt也负责串口处理,那Qt易出现问题的几率就大大增加了,后来就分离开来,让Qt主要负责绘图这块功能。 正好最近有相关项目,多谢楼主. Linux 串口 mark 赞!
业余折腾过2440一年多,忘了都. linux正在入门,楼主文章很有帮助 有时间看看!谢谢! 串口通信和qt分开的思路挺好。 收藏再说 这里用到的知识都是Linux里比较经典的,串口,进程创建,进程通信,Qt线程,个人觉得,还是能学不少东西的。Qt 4.x的时候,串口还是很不好用的,还是需要依靠第三方的库,反正我自己也尝试过,总之不如Linux下的串口开发好使唤。{:lol:} 谢了,研究一下 这个好啊!谢谢分享。 QT不搞图形还不如全部用C实现。 好帖子,赞一个 linux基础运用,描述的很实在 收藏,一篇很全面的样例。 正准备学习一下,收藏了 谢谢,分享 收藏串口通讯 可以有新手学习的意义,QT和其他程序通信,共享内存快,还是这个消息队列快,有比较过吗 {:smile:} 收藏,谢谢分享。 赞。学习了{:smile:} 谢谢分享,赞一个。 快要用到这方面知识了 这个不错 感谢楼主分享 感谢楼主分享 感谢楼主分享 学习了,消息队列还没有用过。
页:
[1]