串口持续结束数据帧解析(C++)

public:
    std::string     input;
    //0x11, 0x22, 0x33
    const std::string packet_start = "\x11\x22\x33"; //帧头
    int data_packet_start;


#define BASE_CALLBACK_PACKAGE_LENGTH 28

    std::string readMsg;
    if (serialPort.available())
    {
        unsigned char recvDispose[BASE_CALLBACK_PACKAGE_LENGTH];
        readMsg = serialPort.read(serialPort.available());
        printf("read %i new characters from serial port, adding to %i characters of old input.\n", (int)readMsg.size(), (int)input.size());
        input += readMsg;
        while (input.length() >= BASE_CALLBACK_PACKAGE_LENGTH) // while there might be a complete package in input
        {
            // parse for data packets
            data_packet_start = input.find(packet_start);
            if (data_packet_start != std::string::npos)
            {
                printf("found possible start of data packet at position %d\n", data_packet_start);
                if ((input.length() >= data_packet_start + BASE_CALLBACK_PACKAGE_LENGTH) && /*校验位算式*/CheckDigit((unsigned char*)input.c_str() + data_packet_start, BASE_CALLBACK_PACKAGE_LENGTH))
                {
                    memcpy(recvDispose, input.c_str() + data_packet_start, BASE_CALLBACK_PACKAGE_LENGTH);
                    printf("...right data is : ");
                    for (int m = 0;m < 28;m++)
                    {
                        printf("0x%02x, ", recvDispose[m]);
                    }
                    printf("\n");
                    /*帧数据处理函数写在此处*/


                    input.erase(0, data_packet_start + BASE_CALLBACK_PACKAGE_LENGTH); // delete everything up to and including the processed packet
                }
                else
                {
                    if (input.length() >= data_packet_start + BASE_CALLBACK_PACKAGE_LENGTH)
                    {
                        input.erase(0, data_packet_start + 1); // delete up to false data_packet_start character so it is not found again
                    }
                    else
                    {
                        // do not delete start character, maybe complete package has
                        // not arrived yet
                        input.erase(0, data_packet_start);
                    }
                }
            }
            else
            {
                // no start character found in input, so delete everything
                printf("No start character found in input \n");
                input.clear();
            }
        }
    }
    else
        printf("Serial not available\n");

串口持续接收协议数据,接收到数据放到一个缓存区中,比较帧头,若有帧则处理,若无,则删掉。应该不会丢数据

猜你喜欢

转载自blog.csdn.net/yuchunhai321/article/details/83986486