【小白谈编程】之一

来源:互联网 发布:俊知集团有救吗 编辑:程序博客网 时间:2024/06/06 13:00

【小白谈编程】

生产者消费者模式之串口数据的接收处理显示

 

1、串口数据接收问题;2、数据缓存类实现;3、多线程及其同步问题;4、子线程间数据传递问题;5、子线程数据如何实时更新到界面问题;6、窗体数据传递问题。

问题这么多?谁让我是小白啊?小白的痛,小白懂!

 

在开始这个题目之前,先介绍一下实例背景吧。这个程序所做的事情是:从串口接收数据,数据形式为字节流,然后从这些字节流中按照相关的通信协议提取出需要的信息,并将其更新显示于程序界面。串口数据来源于上位机,假设上位机按每秒20帧的频率,帧长50字节发出数据,

首先,对新手而言,源源不断的数据如何处理就是一个麻烦!这从CSDN论坛频繁出现串口数据接收相关提问就可见一斑。小白之所以为此头疼,是因为他们不知道缓存是个什么东西,或者说即便听说过缓存,也知道大体功能,但是缓存在代码层面上,到底是什么样子的仍然是模糊不清的!

其次,数据缓存好了,我如何才能准确无误的提取信息?为了让接收方正确解读出数据信息,通信协议中必然会涉及帧结构等信息,比如帧头、帧尾或者校验位等特定标志位。小白不要问说,会不会没有这些东西?不会的!要实现通信,必然要有协议(通俗些叫约定),不然鬼知道你给我的一堆字节流是什么意思!好了,有了协议,知道了帧头帧尾,我从字节流逐个找就可以了,找到这些标志位,对应起来了,OK,这部分字节就是一个完整的数据帧了(通信上,这叫帧同步)。继续看协议,必然有这个数据帧的构成啦,各个字段占多少字节啦,各个字段如何解读啦!大体这些,我想到这里,小白们基本就意识到如何解读这些数据信息了。好了,协议如何解析,各种场合下根据协议文档来就可以了。如果采用了一些标准协议,比如说谷歌地球支持的一些GPS数据协议,那可以到网上下协议文本的,照着协议走就没问题了。

再次,到这里,貌似大脑里面有了一个大概的解决思路,但是要如何具体实现呢?小白还是会茫然无措。因为这个缓存里面有了一些数据后,我程序马上开始找数据帧,解析之类,可是那边数据没停啊,还在继续来,我在处理这个数据的时候,那边串口数据不接收了?这里就涉及一个多线程,靠,对小白而言,多线程,多么高端的名词呵!好吧,就硬着头皮上吧,我开一个线程接收串口数据,数据进缓存,然后我再有一个线程监听这个缓存数据,不断从里面取数据找数据帧,找到一帧数据马上按照通信协议处理,提取信息,嗯到这里,好像有点头绪了。

最次,小白突然想到一个问题,读取串口的线程要往缓存写数据,数据处理的线程要从缓存读数据,这缓存如何实现?好多小白到这里,又开始迷茫了,不停的百度之类,搜到一堆什么多线程同步的文章,看完后,还是迷茫,然后默默的来到CSDN,写下一个帖子,标题是:我这种情况,多线程操作同一缓存,如何不乱,急,在线等!,

其实,作为一个小白,在这个实例面前,先后会碰到的问题很多,大体有:1、串口的数据如何接收?2、多线程如何实现?3、多线程如何同步?4、缓存是什么样子的,怎么实现?5、线程数据如何更新显示到界面?

要解答这些问题,首先小白先百度一下生产者消费者问题!生产者消费者模式就不再这里赘述了,具体到我们这个实例就是,数据接收线程不断的接收到数据,可以把这个线程视为生产者,而数据处理线程不停的处理数据,为消费者。了解了一些消费者生产者问题后,我们来看我们的问题。

我们先解决一个缓存的问题,数据接收线程不停的接收数据,然后往缓存写数据,数据处理线程则不停的从缓存取数据,结合看了生产者消费者相关资料,小白们开始了解到环形缓存这么个东东!环形缓存,形象又陌生,我们换个简单的通俗的名字:循环数组。那如何实现?直接上我写的一个非常简陋,但实用的类。

 (2015/9/16)先写到这里,后面继续!

0 0
原创粉丝点击