判断一帧完整的数据

  1. modbus协议帧的完整性判断并解析,其中无线传感节点自动上报的数据结构为:

    struct STR_JDWDSEND
    {

    unsigned char nStart1;                //0x09    1字节
    unsigned char nStart2;                //0xaf     1字节
    unsigned char nOrder=2;                //第二版温度  1字节
    unsigned long int  nID;                //传感器编号  4字节
    signed   int  nT;                    //读取的温度  2字节
    signed   int  ntemp;                //预留数据(序列号) 2字节
    int         nCrc;                    //CRC校验码  2字节
    unsigned char nEnd;                //0x16     1字节

    };

下面是我自己写的相关的接收帧的代码:

//接收完整的帧
char get_complete_frame(int fd) {
    char read_data[MAXSIZE]; //用来存放每一次读到的数据
    char read_buf[32]; //用来存放一个完整的帧
    char read_tmp[MAXSIZE] = { 0 };
    int return_flag = 0;
    int i;
    while (1) {
        memset(read_tmp, 0, sizeof(read_tmp));
        if (read(fd, read_tmp, sizeof(read_tmp)) > 0) {
            for (i = 0; i < strlen(read_tmp); i++) {
                if (read_tmp[i] == 0x09 && read_tmp[i+1]==0xaf) { //判断帧头
                    memset(read_data, 0, sizeof(read_data));
                    char tmp[14] = { 0 };
                    tmp[0] = read_tmp[i];
                    tmp[1] = read_tmp[i + 1];
                    strcat(read_data, tmp);
                }
                else if (read_tmp[i] == 0x16)
                {
                    char tmp[14] = { 0 };
                    tmp[0] = read_tmp[i];
                    strcat(read_data, tmp);
                    return_flag = 1;
                    memset(read_buf, 0, sizeof(read_buf));
                    //遇到帧尾,将read_data帧拷贝到read_buf中,以便处理
                    memcpy(read_buf, read_data, sizeof(read_data));
                }
                else {
                    char tmp[14] = { 0 };
                    tmp[0] = read_tmp[i];
                    strcat(read_data, tmp);
                }
            }
            if (return_flag == 1) return read_buf;
            else return 0;
            sleep(5);
        }
    }

}

主要想问一下我怎样做到把接收到的一帧数据传输到read_buf中进行数据分析后,然后把得到的数据进行清除。
另外怎样根据主动上报的报文格式,根据长度和帧头,帧尾进行帧完整性的查询。

阅读 3.5k
1 个回答

你的代码存在很多问题:
1.没有处理网络异常和读中断的问题
2.没有考虑网络字节序和本地字节的问题
3.没有考虑结构体内存对齐问题

解决方案:
1.处理好网络读写,实现一个健壮的网络读写函数
2.做好反序列化(网络字节->c结构体)
3.你这个协议是比较好解析的,因为协议数据的定长的

PS:协议解析什么的可以参考文章:https://segmentfault.com/a/11...

推荐问题
宣传栏