收到许多组数据,每组数据都是八个16进制的数在一起,比如其中某组是 99 66 1A 10 22 33 21 00 这样的数据。我现在需要提取出每组数据的排在第四、五、六 的三个数,并将这三个数加成一个新的十进制的数并输出,应该怎么整。

解决方案 »

  1.   

    理解透传输协议,先确保接收到的数据能正确分组
    然后定义一个结构体,
    typedef struct _tagGpData_t
    {
      uchar uByte[8]; 
    }GPDATA;
    剩下的差不多就类似与
    GPDATA *pGp = (GPDATA*)pRecv; //指向数据组缓冲区
    int newData = (pGp->uByte[4]<<16) + (pGp->uByte[5]<<8) + (pGp->uByte[6]);
      

  2.   

    不太懂诶,能讲详细一下吗大神的意思是,在串口通信上,你应该有自己的应用层协议吧,比如另外一方是将数据按怎样的格式发送给你的,这样你自己就能知道想要的数据在哪个位置。
    就算没有应用协议,你从串口读数据的时候,总会调用ReadFile()吧,该函数的参数中不是需要你自己指定一个接受缓存区吗,而你接收到的数据都是8个一组这样的形式,那么可以在缓存区对象的地址位置上直接提取数据即可啊,如buffer[3+i*8]+buffer[4+i*8]+buffer[5+i*8]
      

  3.   

    事实上很简单, 
    BYTE buf[]={99 66 1A 10 22 33 21 00};//将收到的数放到buf
    int a;
    char *pa=(char*) &a;// 将a的地址转换为字节指针
    pa[1]=buf[4]; //你自己确定好接收字节顺序对应关系 a的顺序是0字节,是最低位,字节3是最高位,如果你的编码不是16进制形式,需要将buf[i]转换为16进制形式
    pa[2]=buf[5];
    pa[3]=buf[6];
    pa[4]=0;//到此,a的值就是4~6字节的值
      

  4.   

    临时用一下的话,用串口助手接收,保存成txt,在Excel里面弄吧,还可以画图
      

  5.   

    char pszRev[1024] = { 0 };
    DWORD dwRead(0), dwSend(0);
    while (1)
    {
    if (p->ReadData(pszRev, 1000, dwRead)) //接收数据
    {
    int Data3 = atoi(pszRev + 3);//取第三个数据
    int Data4= atoi(pszRev + 4);//取第四个数据
    int Data5 = atoi(pszRev + 5);//取第五个数据
    //自己处理
                    }
    }