【问题标题】:read bytes not stored correctly in an array读取的字节未正确存储在数组中
【发布时间】:2013-06-09 15:46:46
【问题描述】:

我正在尝试从 linux 上的端口读取数据,然后我想使用这些数据尝试测试并打印出来它总是第一个字节打印整个数据,所有其他字节都是空的。有谁知道我如何将读取的每个字节存储在一个单元格中。代码写下来了,请告诉我我错过了什么?

int decode_gps() {
 while(1){
 unsinged int UBX_buffer[40];
if (read(fd,&UBX_buffer,1)>0) {
//  cout<<UBX_buffer[0]<<endl;

 switch(UBX_step)     //we start from zero and increment as we go through the cases
  {
 case 0:  
if(UBX_buffer[0]==0xB5)  UBX_step++;  break; // UBX sync char 1 //check for the first data packet and go to next byte

case 1:  if(UBX_buffer[1]==0x62) UBX_step++;// UBX sync char 2 //check for the second data packet and go to the next byte

else    UBX_step=0; break;  //if first and second packets are not correct then go back and check again     

case 2:   UBX_class=UBX_buffer[2]; checksum(UBX_class); UBX_step++;  break;

case 3:   UBX_id=UBX_buffer[3];  checksum(UBX_id);  UBX_step++; break;

case 4:   UBX_payload_length_hi=UBX_buffer[4]; checksum(UBX_payload_length_hi);  UBX_step++;  break;

case 5:   UBX_payload_length_lo=UBX_buffer[5]; checksum(UBX_payload_length_lo);  UBX_step++; break;

case 6:         // Payload data read...
if (UBX_payload_counter < UBX_payload_length_hi)  // We stay in this state until we reach the payload_length
{
  UBX_buffer[UBX_payload_counter] = data;
  checksum(data);
  UBX_payload_counter++;
}
else
  UBX_step++; 
break;
case 7:   ck_a=data;  UBX_step++; break;      // First checksum byte
case 8:   ck_b=data;                           // Second checksum byte

// We end the GPS read...

if((ck_a= ck_a)&&(ck_b= ck_a))   // Verify the received checksum with the generated checksum.. 
     parse_ubx_gps();               // Parse new GPS packet...




UBX_step=0;
UBX_payload_counter=0;
ck_a=0;
ck_b=0;
GPS_timer=0; //Restarting timer...
break;

  } // End Switch 
} //end if    
} //end while loop

 close(fd);
 return(0);
}

【问题讨论】:

  • 这可能是您打印数据的方式的一个错误。
  • 请包含可编译的代码。我很高兴你的整数没有被烧毁 (unsinged)。请注意,将 1 个字节读入整数会导致实现定义的行为,除非 sizeof(int) == sizeof(char) 暗示 CHAR_BIT &gt; 8。你不应该将&amp;UBX_buffer 传递给read(fd, &amp;UBX_buffer, 1),尽管在实践中你会侥幸成功。

标签: c++ arrays port


【解决方案1】:

这一行:

if (read(fd,&UBX_buffer,1)>0)

读取一个字节。除了UBX_buffer[0] 之外,您永远不会使用该特定行获取数据。

不确定您是否打算使用:

if (read(fd,&UBX_buffer[UBX_step],1)>0)

另一方面,您一次只处理一个字节,因此只需将int UBX_buffer[40] 更改为unsigned char UBX_buffer;,然后使用UBX_buffer 而不是UBX_buffer[x] 就可以了,我认为。

【讨论】:

    【解决方案2】:

    不清楚使用了哪个 read() 函数。是否应该将整个数据读入 UXB_buffer?

    我还是不明白你的意思 “但是当我尝试测试并打印出来时,它总是 第一个字节打印整个数据,而所有其他字节都是空的”

    如果数据长度超过一个字节,第一个字节如何打印整个数据?

    【讨论】:

    • 好吧,我刚刚写了 cout
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-18
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    相关资源
    最近更新 更多