搜索
bottom↓
回复: 3

最近在玩广彩的串口屏,改了接收协议,好像还可以。

[复制链接]

出0入0汤圆

发表于 2014-8-28 09:25:42 | 显示全部楼层 |阅读模式
本帖最后由 jianplx 于 2014-8-28 09:34 编辑



    栈尾que._tail永远指向帧头EE,指令取走后会自动指向下一条指令的帧头,找指令时可以直接用que._tail做基指
    #define QUEUE_MAX_SIZE 32

    typedef struct _QUEUE
    {
        unsigned char _head;                                        //数据栈头指针
        unsigned char _tail;                                        //数据栈尾指针
        unsigned char _data[QUEUE_MAX_SIZE];       
    } QUEUE;//串口数据接收队列结构体

    static QUEUE que = {0,0,};                                        // 串口数据接收列队

    /**********************************************
    串口接收队列(FIFO)复位
    **********************************************/
    void QueueReset(void)
    {
            que._head = 0;
            que._tail = 0;
    }
    /**********************************************
    存入一个数据到串口接收队列(FIFO)中
    **********************************************/
    void QueuePush(unsigned char _data)
    {
        unsigned char pos;
            pos = (que._head+1) %QUEUE_MAX_SIZE;
           
        if(pos != que._tail)                                //非满状态
        {
            que._data[que._head] = _data;        //数据压栈
            que._head = pos;                                //移动栈头
        }
    }
    /**********************************************
    搜寻帧头
    **********************************************/
    static void FindFrameHead(void)
    {
            while(que._data[que._tail] != 0xEE && que._head != que._tail)
                    que._tail = (que._tail+1) %QUEUE_MAX_SIZE;        //栈尾指向下一个指令头部       
    }
    /******************************************************************
    获取串口接收队列(FIFO)中一个完整的帧
    一个完整的帧是以EE开头,FF FC FF FF 结尾的一个数据帧
    EE xx xx xx xx ee xx xx ff fc FF FC FF FF
    ********************************************************************/
    unsigned char QueueFindCMD(void)
    {       
            unsigned char cmd_tail;        //影子栈尾
            unsigned char cmd_state;       
           
            if(que._head == que._tail)        //是空栈
            {
                    return 2;                                // 空栈       
            }
                   
            if(que._data[que._tail] != 0xEE)        //栈尾不是指令的头部        
            {
                    FindFrameHead();        //搜寻下一个指令头部
                    return 3;                        //指令头部错误       
            }
           
            cmd_tail = que._tail;        //映射栈尾
            cmd_state = 0;                       
               while(que._head != cmd_tail && cmd_state != 4)        //查找帧尾 从栈尾查到栈头
               {       
                    cmd_tail = (cmd_tail+1) %QUEUE_MAX_SIZE;

                    switch(que._data[cmd_tail])                //查找帧尾
                    {
                            case 0xFF:  
                            switch (cmd_state)
                            {
                                    case 2: cmd_state = 3;break;  //FF FC FF ?? (找到第三个FF)
                                    case 3: cmd_state = 4;break;  //FF FC FF FF 正确的帧尾
                                    default:cmd_state = 1;break;  //FF ?? ?? ??(找到第一个FF)
                            }break;

                            case 0xFC:
                            switch (cmd_state)
                            {
                                    case 1: cmd_state = 2;break;  //FF FC ?? ??(找到第二个FC)
                                    case 3: cmd_state = 2;break;  //ff fc FF FC ?? ??(找到第二个FC)
                                    default:cmd_state = 0;break;  //?? ?? ?? ??(全部字节不对)
                            }break;

                            default: cmd_state = 0;
                            break;
                    }
            }

           
            if(cmd_state == 4)        // 没有找到指令帧尾         
            {
                    FindCMD();//取走指令
                    que._tail = (cmd_tail+1)%QUEUE_MAX_SIZE;//指向下一条指令
                    //que._tail = que._head;
                    return 0;                       
            }
           
            return 1;        //没有接收完成               
    }

出0入0汤圆

发表于 2014-8-29 16:14:20 | 显示全部楼层
牛人啊,学习了

出0入0汤圆

发表于 2014-8-29 16:31:10 | 显示全部楼层
喜欢看程序,

出0入0汤圆

发表于 2014-12-18 09:47:34 | 显示全部楼层
正要弄串口屏,浏览下资料
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-29 07:11

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表