我是靠谱客的博主 安详紫菜,最近开发中收集的这篇文章主要介绍高效的串口循环Buffer接收处理思路及代码,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

因为这篇文章自定义的协议没有贴出来,且后面测试发现这个效率有BUG,我目前将这篇文章仅仅作为一个参考,后面再写一篇文章"高效的串口循环Buffer接收处理思路及代码2",请具体参考后面这篇文章经过了MCU和MFC对接确认的代码

//串口
#define UART0_RX_BUFF_LEN           (56 * 16)
#define UART0_FRAME_MAX_LEN         (56)          //单帧最长长度

/******************************************    全局变量    *********************************************/
/*串口缓存全局变量初始化*/
volatile unsigned char  g_u8Uart0RxDataMem[UART0_RX_BUFF_LEN] = {0};    //串口0缓存
volatile unsigned short gUart0RxByteNum = 0;                            //已经接收到的字节数量
volatile unsigned short gUart0RxIndex = 0;                              //接收循环写入
volatile unsigned short gUart0RxStartIndex = 0;                         //处理起始位


//串口一个字节一个字节的收
LONG CAudioProcessorDlg::OnCommunication(WPARAM ch, LPARAM port)
{

    unsigned char *pUart0RxDataMem = (unsigned char * )g_u8Uart0RxDataMem;
    unsigned char u8DataLen = 0;                //解析桢字节长度
    CString str;
    str.Format(L"%02X", ch);
    unsigned char u8Temp[4] = { 0 };

    int nRet = 0;
    int i = 0;
    int nRealLen = 0;
    int nRealBeginIndex = 0;
    unsigned char u8UartParaBuf[UART0_FRAME_MAX_LEN] = {0};     //临时变量,每次处理一帧数据

    Unicode_Cstring2char(str, (char*)u8Temp);

    //转换一下
    for (i = 0; i < 4; i++ )
    {
        if (u8Temp[i] >= 'A')
        {
            u8Temp[i] = u8Temp[i] - 55;
        }
        else
        {
            u8Temp[i] = u8Temp[i] - 0x30;
        }
    }

    //按字节接收数据,保证此buf是循环buf
    g_u8Uart0RxDataMem[gUart0RxIndex % UART0_RX_BUFF_LEN] = (u8Temp[0] << 4) | u8Temp[1];
    gUart0RxIndex = (gUart0RxIndex + 1) % UART0_RX_BUFF_LEN;
    gUart0RxByteNum++;

    //开始解析数据
    while(gUart0RxByteNum) //接收的长度如果大于0
    {
        if(pUart0RxDataMem[gUart0RxStartIndex] == 0x55)//第一个帧头字节正确
        {
            break;
        }

        pUart0RxDataMem[gUart0RxStartIndex % UART0_RX_BUFF_LEN] = 0;
        gUart0RxStartIndex = (gUart0RxStartIndex + 1) % UART0_RX_BUFF_LEN;
        gUart0RxByteNum--;
    }

    if(gUart0RxByteNum >= UART_RX_PROTOCOL_SIZE)        //接收到字节数大于14字节
    {
        if (0xAA == pUart0RxDataMem[((gUart0RxStartIndex + 1) % UART0_RX_BUFF_LEN)])
        {
            //取桢长度
            u8DataLen = pUart0RxDataMem[((gUart0RxStartIndex + 2) % UART0_RX_BUFF_LEN)];

            if((UART_RX_PROTOCOL_SIZE == u8DataLen) || (UART_RX_ExPROTOCOL_SIZE == u8DataLen))
            {
                if(CheckReciveDataCRC(pUart0RxDataMem, u8DataLen))
                {
                    //拷贝一帧数据出来
                    for(i = 0; i < u8DataLen; i++)
                    {
                        //校验通过将数据取出存放到u8UartParaBuf
                        u8UartParaBuf[i] = pUart0RxDataMem[gUart0RxStartIndex];
                        pUart0RxDataMem[gUart0RxStartIndex] = 0;
                        gUart0RxStartIndex = (gUart0RxStartIndex + 1) % UART0_RX_BUFF_LEN;
                        gUart0RxByteNum--;
                    }

                    u8DataLen = ProcessingProtocolData(u8UartParaBuf, u8DataLen);
                    CommunicationSend((char *)u8UartParaBuf, u8DataLen);

                }
                else
                {
                    pUart0RxDataMem[gUart0RxStartIndex % UART0_RX_BUFF_LEN] = 0;
                    gUart0RxStartIndex = (gUart0RxStartIndex + 1) % UART0_RX_BUFF_LEN;
                    gUart0RxByteNum--;
                }
            }
            else
            {
                pUart0RxDataMem[gUart0RxStartIndex % UART0_RX_BUFF_LEN] = 0;
                gUart0RxStartIndex = (gUart0RxStartIndex + 1) % UART0_RX_BUFF_LEN;
                gUart0RxByteNum--;
            }

        }
        else
        {
            //桢头异常,清除此桢
            pUart0RxDataMem[gUart0RxStartIndex % UART0_RX_BUFF_LEN] = 0;
            gUart0RxStartIndex = (gUart0RxStartIndex + 1) % UART0_RX_BUFF_LEN;
            gUart0RxByteNum--;
        }
    }


    return 0;
}

最后

以上就是安详紫菜为你收集整理的高效的串口循环Buffer接收处理思路及代码的全部内容,希望文章能够帮你解决高效的串口循环Buffer接收处理思路及代码所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(75)

评论列表共有 0 条评论

立即
投稿
返回
顶部