=================第一天================
前言:
本文只是分享下自己曾经开发过的一个嵌入式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界面的显示,数据呈现,那么其实本文章主要写的就是显示器主板基于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下的串口和注射头进行通信,那么这个框架便搭建完成了。
具体的细节,那就是靠伟大的程序员一点点添砖加瓦的完成喽。
文章的脚注信息由WordPress的wp-posturl插件自动生成