345161974 发表于 2015-3-26 22:46:24

【原创分享】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下串口编程以及参考书籍

lyxer 发表于 2015-3-26 23:35:23

Qt不是自带串口吗 移植好就行

345161974 发表于 2015-3-26 23:43:00

lyxer 发表于 2015-3-26 23:35
Qt不是自带串口吗 移植好就行

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

good_luck 发表于 2015-3-27 08:38:46

正好最近有相关项目,多谢楼主.

study_hardware 发表于 2015-3-27 09:00:05

Linux 串口 mark

swap2013 发表于 2015-3-27 09:06:42

赞!
业余折腾过2440一年多,忘了都.

chun2495 发表于 2015-3-27 09:23:50

linux正在入门,楼主文章很有帮助

liuruoshui 发表于 2015-3-27 09:27:44

有时间看看!谢谢!

youthdou 发表于 2015-3-27 09:28:58

串口通信和qt分开的思路挺好。

fiaanull 发表于 2015-3-27 09:30:38

收藏再说

345161974 发表于 2015-3-27 10:27:32

这里用到的知识都是Linux里比较经典的,串口,进程创建,进程通信,Qt线程,个人觉得,还是能学不少东西的。Qt 4.x的时候,串口还是很不好用的,还是需要依靠第三方的库,反正我自己也尝试过,总之不如Linux下的串口开发好使唤。{:lol:}

liuyingqing139 发表于 2015-3-27 10:35:12

谢了,研究一下

sblpp 发表于 2015-3-27 11:48:56

这个好啊!谢谢分享。

ljt80158015 发表于 2015-3-27 11:50:53

QT不搞图形还不如全部用C实现。

danielyuan 发表于 2015-3-27 12:15:39

好帖子,赞一个

KunShan_a_dai 发表于 2015-3-27 12:37:36

linux基础运用,描述的很实在

huangqi412 发表于 2015-3-27 13:14:32

收藏,一篇很全面的样例。

ckhf 发表于 2018-10-26 11:48:39

正准备学习一下,收藏了

qsv 发表于 2019-2-15 22:01:55

谢谢,分享

jordonwu 发表于 2019-2-15 22:36:35

收藏串口通讯

abnerle 发表于 2019-3-7 16:45:30

可以有新手学习的意义,QT和其他程序通信,共享内存快,还是这个消息队列快,有比较过吗

wt19891114 发表于 2019-3-7 17:24:15

{:smile:} 收藏,谢谢分享。

aohu_2012 发表于 2019-3-26 00:00:39

赞。学习了{:smile:}

JohnSmith 发表于 2019-3-30 22:11:06

谢谢分享,赞一个。

tdh03z 发表于 2019-3-30 22:36:15

快要用到这方面知识了

cloudxxcloud 发表于 2019-3-31 08:08:43

这个不错

eliterxzgxu 发表于 2019-3-31 13:13:51

感谢楼主分享

limaotaizi 发表于 2019-6-30 10:18:23

感谢楼主分享

leonliu_1128 发表于 2019-6-30 16:02:47

感谢楼主分享

大浪淘沙 发表于 2019-7-1 14:11:20

学习了,消息队列还没有用过。
页: [1]
查看完整版本: 【原创分享】Linux下串口以及Qt app通信框架