打印
[MM32软件]

环形缓冲区的使用

[复制链接]
55|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tpgf|  楼主 | 2025-2-6 13:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

uint8_t parse_uart_cmd(uint8_t lastcmdCnt)
{
       

        uint8_t buf[RxBufLen] = {0} ,*p;
        uint8_t j=0, datalen = 0,yu=0;
        uint8_t cmdtype = 0,cmdCnt = lastcmdCnt; //0 此处应当是实际的数据
        int out=0;

#if UART_RX_MODE == 1
        uint8_t start_index = cmd_start;
        uint8_t end_index = cmd_end;       
        memcpy(buf, cmdbuf, end_index);
        cmd_start = 0;
        cmd_end = 0;
        datalen = end_index;
        for(j=0; j<=datalen-7; ){
                cmdtype = parse_single_cmd(&buf[j], cmdCnt);
                if(cmdtype){
                        cmdlist[cmdCnt][0] = cmdtype;
                        cmdCnt++;
                        j+=8;
                }
                else{
                        j++;
                }
        }
#elif UART_RX_MODE ==2
    //DMA_UART_MODE
        uint8_t start_index = cmd_start;
        uint8_t end_index = RxBufLen - DMA1_Channel5->CNDTR; //待传输的数据-->等待传输的数据 处理的次数增多而减少
       
    //-->no more new data
        if(end_index == start_index)                                //just a line
                return cmdCnt;                                          // 0
        //conclulate the lenth of buffer recived
        else if(end_index > start_index){                           //normal consituation
                datalen = end_index - start_index;
                memcpy(buf, &sRxBuffer[start_index], datalen);                    //copy the  RX to buffer
//                yu = datalen % 8;
//                end_index -= yu;
        }
        //the wrong consituation that the buffer is outoff
        //先将 start_index 到缓冲区末尾的数据复制到 buf 中,然后将从缓冲区开头到 end_index 的数据复制到 buf 的剩余部分。最后计算 datalen。
        else{  //end_index = RxBufLen - DMA1_Channel5->CNDTR;
                memcpy(buf, &sRxBuffer[start_index], RxBufLen-start_index);  //exceed a line and return loop
                memcpy(&buf[RxBufLen-start_index], sRxBuffer, end_index); //复制剩下的全部
                datalen = (RxBufLen - start_index) + end_index ;
//                yu = datalen % 8;
//                if(end_index>=yu)
//                        end_index -= yu;
//                else
//                        end_index = RxBufLen + end_index-yu;
        }
        #if 1
        if(datalen>COMMAND_LEN){  //判断出datalen的长度,再根据该长度进行下一步操作
                //ljz add
       #if UART_DEBUG==1
                p=buf;
                printf("LJZ RX buf: ");
                while(*p!=NULL)
                {
                        printf("%02X ",*p);
                        p++;
                }
                printf("\r\n");
                #endif

                cmd_start = (end_index>(COMMAND_LEN-1)) ? (end_index-COMMAND_LEN):(RxBufLen + end_index)-COMMAND_LEN ;  //判断下一个指令的长度
               
                for(j=0; j<datalen-COMMAND_LEN; ){
                        cmdtype = parse_single_cmd(&buf[j], cmdCnt);//检查是否是功能选择指令
                        if(cmdtype){
                                cmdlist[cmdCnt][0] = cmdtype;
                                cmdCnt++;
                                #if UART_DEBUG ==1
                                printf("LJZ Command item: %d\r\n",cmdCnt);
                                #endif
                                j+=(COMMAND_LEN+1);    //处理下一串指令
                        }
                        else{
                                j++;    //处理下一个指令
                        }
       
                }
        }
    #endif       
        #if 0
        if(datalen>7){
            #if UART_DEBUG==1
                p=buf;
                printf("LJZ RX buf: ");
                while(*p!=NULL)
                {
                        printf("%02X ",*p);
                        p++;
                }
                printf("\r\n");
                #endif
                ///
                cmd_start = (end_index>6) ? (end_index-7):(RxBufLen + end_index)-7 ;        // 计算 cmd_start: 根据 end_index 和 RxBufLen 计算出一个 cmd_start 值。这个值取决于 end_index 是否大于6,如果是,则从当前位置往前数7个字节作为起始位置;如果不是,则跨越缓冲区边界(即加上 RxBufLen 再减去7)
                for(j=0; j<datalen-7; ){                                                //有循环的功能
                        cmdtype = parse_single_cmd(&buf[j], cmdCnt); //the singel command alanysis
                        if(cmdtype){
                                cmdlist[cmdCnt][0] = cmdtype;
                                cmdCnt++;
                                #if UART_DEBUG ==1
                                printf("LJZ Command item: %d\r\n",cmdCnt);
                                #endif
                                j+=8;
                        }
                        else{
                                j++;
                        }
                }
        }               
    #endif       
       
       
#endif       
        return cmdCnt;              
}


————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/qq_43519774/article/details/144298531

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2099

主题

16204

帖子

16

粉丝