• 大彩串口屏使用队列处理指令,具体均在例程的cmd_queue.c文件中实现。

cmd_queue.c中共5个函数:

  1. 清空指令数据queue_reset()
  2. 从串口添加指令数据queue_push()
  3. 从队列中取一个数据queue_pop()
  4. 获取队列中有效数据个数queue_size()
  5. 从指令队列中取出一条完整的指令queue_find_cmd()

若移植到其他平台,需要修改底层寄存器设置,但禁止修改函数名称,否则无法与HMI驱动库(hmi_driver.c)匹配。


队列结构定义:

#define CMD_MAX_SIZE 64           // 单条指令大小,根据需要调整,尽量设置大一些
#define QUEUE_MAX_SIZE 512        // 指令接收缓冲区大小,根据需要调整,尽量设置大一些typedef struct _QUEUE
{                                                                 qsize _head;                                                       //队列头qsize _tail;                                                       //队列尾qdata _data[QUEUE_MAX_SIZE];                                       //队列数据缓存区
}QUEUE;                                                           static QUEUE que = {0,0,0};                                            //指令队列
static uint32 cmd_state = 0;                                           //队列帧尾检测状态
static qsize cmd_pos = 0;                                              //当前指令指针位置

大彩屏例程中用到的队列是循环队列


清空指令数据queue_reset()

void queue_reset()
{que._head = que._tail = 0;cmd_pos = cmd_state = 0;
}

当que._head=que._tail是表示队列为空,此时将头尾指针位置均置0,即可以使队列中数据清空。


从串口添加指令数据queue_push()

typedef unsigned short qsize;   //unsigned short无符号整型数据类型,用两字节(16位二进制)void queue_push(qdata _data)//1个字节
{qsize pos = (que._head+1)%QUEUE_MAX_SIZE;//qsize--2个字节if(pos!=que._tail)                                                //非满状态{que._data[que._head] = _data;que._head = pos;}
}

添加指令数据实际上就是入队操作,指针pos始终指向队列头的下一位置。当pos指向指针尾时,说明队列已满,无法再放入指令数据,否则,即可将数据放入了队列的缓冲区中。

注意:指令数据是放入队列头que._head所在位置,放入后,队列头向下移一位,继续一个操作。队列头尾所在位置始终均为空!


从队列中取一个数据queue_pop()

//从队列中取一个数据
static void queue_pop(qdata* _data)
{if(que._tail!=que._head)                                          //非空状态{*_data = que._data[que._tail];que._tail = (que._tail+1)%QUEUE_MAX_SIZE;}
}

首先判断队列尾与队列头不在同一位置,即队列状态非空;然后,从队列尾将所需要的指令数据取出,队列尾向后移一位


获取队列中有效数据个数queue_size()

#define QUEUE_MAX_SIZE 512        // 指令接收缓冲区大小,根据需要调整,尽量设置大一些static qsize queue_size()
{return ((que._head+QUEUE_MAX_SIZE-que._tail)%QUEUE_MAX_SIZE);
}

有数据的时候,队列头尾相减的长度加上缓冲区大小并与其取余就是队列中的数据个数。


从指令队列中取出一条完整的指令queue_find_cmd()

#define CMD_HEAD 0XEE                                                  //帧头
#define CMD_TAIL 0XFFFCFFFF                                            //帧尾/*!
*  \brief  从指令队列中取出一条完整的指令
*  \param  cmd 指令接收缓存区
*  \param  buf_len 指令接收缓存区大小
*  \return  指令长度,0表示队列中无完整指令
*/
qsize queue_find_cmd(qdata *buffer,qsize buf_len)
{qsize cmd_size = 0;qdata _data = 0;qsize tt=queue_size();while(queue_size()>0){//取一个数据queue_pop(&_data);if(cmd_pos==0&&_data!=CMD_HEAD)                               //指令第一个字节必须是帧头,否则跳过{continue;}if(cmd_pos<buf_len)                                           //防止缓冲区溢出buffer[cmd_pos++] = _data;cmd_state = ((cmd_state<<8)|_data);                           //拼接最后4个字节,组成一个32位整数//最后4个字节与帧尾匹配,得到完整帧if(cmd_state==CMD_TAIL){cmd_size = cmd_pos;                                       //指令字节长度cmd_state = 0;                                            //重新检测帧尾巴cmd_pos = 0;                                              //复位指令指针//下面语句为了在串口助手上显示(UART3)//--------------------------------for (qsize i=0;i<cmd_size;i++){SendChar_uart3(buffer[i]);}//---------------------------------
#if(CRC16_ENABLE)//去掉指令头尾EE,尾FFFCFFFF共计5个字节,只计算数据部分CRCif(!CheckCRC16(buffer+1,cmd_size-5))                      //CRC校验return 0;cmd_size -= 2;                                            //去掉CRC16(2字节)
#endifreturn cmd_size;}}return 0;                                                         //没有形成完整的一帧
}

先取出一条完整的指令,根据指令格式帧分割处理数据,这里为了更加直观的观察数据,我将取出的数据返回通过串口三显示在串口助手上。

首先判断队列是否有有效数据,即队列大小是否大于0,是则继续处理;

判断当前指令指针位置为空,且数据不为帧头时,直接跳出到while


题外话:

continue和break

if...continue语句用于循环语句中,作用是不执行循环体剩余部分,直接进行下次循环

continue是中止当前循环,进行下一次循环。
而break会跳出整个for循环


当前指针位置在指令接收缓冲区内,数据不断存放到buffer中,

最后四位时数据不断左移或上data,判断是否是帧尾。是,将cmd_pos大小赋值确定指令字节长度,并将cmd_state, cmd_pos均置0重写。


以上就是关于大彩屏例程中的队列处理操作,做个笔记方便以后更好的学习运用~

STM32使用大彩屏程序总结(一)相关推荐

  1. 使用大batch优化深度学习:训练BERT仅需76分钟 | ICLR 2020

    作者 | Yang You, Jing Li等 译者 | 刘畅 在海量数据集上训练大型深度神经网络,是非常具有挑战性的.最近,有许多研究均使用大batch随机优化方法来解决此问题.在该研究领域中,目前 ...

  2. Linux进程缓冲区大小,Linux IOCTL动态命令、动态|自定义缓冲区大小、IOCTL使用大缓冲区的问题...

    深夜睡不着,点根烟起来写点儿东西吧. 一个驱动程序除了具备读写设备的能力之外,其也应当具有对硬件控制的能力.在Windows下用户层代码使用API函数DeviceIoControl,通过传入驱动句柄, ...

  3. 如何使用大数据算法改善有效链接

    对人们来说,大数据似乎是一个巨大的概念.然而,许多公司已经在其业务中使用了大数据,这可能会让人感到意外.分析工具和软件实际上使用大数据收集汇总的统计数据和指标进行分析.此外,如果企业想要最大限度地扩大 ...

  4. 使用大华NetSDK对接大华相机

    使用大华NetSDK对接相机 一. 下载大华NetSDK support 根据自己的需要下载对应版本的sdk.这边我们就以Win32版本作为开发使用. 下载的文件解压后,内部文件如下图所示: 开发使用 ...

  5. 什么是大数据公司面临的问题以及如何使用大数据解决

    Heyy EveryOne ..!! 大家好.. !! In this article, you will come to know- what is Hadoop, Big Data & D ...

  6. 使用大华设备开发行AI人流量统计出现时间不正确的原因分析

    人流量统计是基于AI人工智能算法,可以实时统计视频图像中的人体个数和流动趋势,与视频监控技术结合,能实现当前监控区域的人流量统计,实时了解行人流量动态,还能达到人群密度监测.避免人群聚集的目的,在安防 ...

  7. 使用大恒水星相机利用OpenCV+ Zbar 解QR码在ROS下定位的实现

    使用大恒水星相机利用OpenCV+ Zbar 解QR码在ROS下定位的实现 本次的程序功能实现是在师兄原有程序的基础上,经我继续开发的.主要完成的功能是使用QR码定位,将位姿信息通过ROS中的tf变换 ...

  8. mysql 安装 大_MYSQL安装问题amp;使用大收集 - 包子 - ITeye博客

    MYSQL安装问题&使用大收集 博客分类: win7 mysql could not start the service mysql error:0的解决方法 我是win7的系统,重新安装My ...

  9. 汽车制造厂商使用大数据的5个思路

    随着如今迅速发展的技术,现代汽车已经成为带有轮子.安全气囊与乘客空间的计算机.运用在汽车上的创新可以为司机规划安全路线.播放卫星广播.连接手机免提功能.使汽车保持在车道内行驶.并通过距离感应器和自动驾 ...

最新文章

  1. 自动驾驶中实时车道检测和警报
  2. 多线程之线程池的应用
  3. java正则 找出数字_Java使用正则表达式实现找出数字功能示例
  4. 【C语言】两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单,a说他不和x比,c说他不和x,z比,编写程序找出三对赛手名单。...
  5. STM32 - 定时器高级应用说明 - 01 - Filtering stage - 波形输入的过滤
  6. SUSE梁胜:程序员涨薪飞快,做开源贡献者没有意义
  7. [转]关于jQuery性能优化
  8. 计算机电子表格相关简答题,2017年计算机一级excel操作试题及答案
  9. Pdman数据库建模工具——使用教程
  10. Shell日常巡检脚本大全
  11. [功能改进]Ctrl+Enter直接提交评论
  12. Fiddler - 使用 Fiddler 监控本地 HTTP 请求,谷歌浏览器提示“隐私设置错误”
  13. System Development Life Cycle(SDLC)系统生命周期
  14. win10系统小米妙享中心,在手机可搜索到电脑,与之跨屏协作
  15. python学习——电子邮件
  16. 总结Criteria的简要使用概述(Hibernate5.2+)
  17. JavaScript children和childNodes
  18. 关于面试党的那些刁问题
  19. Python简单实现PageRank计算
  20. 知网、维普、万方文献一网打尽免费下载,亲测好用哦!

热门文章

  1. 20181214第一周周训
  2. 2014百度之星资格赛第一道Energy Conversion
  3. 汕头GLP实验室建设知识概述
  4. 图片使用css3滤镜改变图片颜色
  5. 蓝牙运动耳机哪个好,推荐目前为止最热门的六款运动耳机
  6. linux防火墙能关吗,linux防火墙怎么样关闭
  7. android 7.1 屏蔽按压两次电源键(KEYCODE_POWER)打开相机
  8. Linux文件权限修改
  9. 5000配置一台游戏型计算机,开学装机:2020年如何配一台5000元主流配置的游戏主机?...
  10. Android一款简单的天气APP