2013-06-09 5 views
0

리눅스의 포트에서 데이터를 읽으 려하고 다음 데이터를 사용할 때 각 바이트가 하나씩 저장 될 것이라고 생각했습니다. 배열에있는 셀을 테스트하지만 인쇄하려고하면 항상 첫 번째 바이트가 전체 데이터를 인쇄하고 다른 모든 바이트는 비어 있습니다. 아무도 어떻게 하나의 셀에 읽은 각 바이트를 저장할 수 있는지 안다. 코드가 적어서 무엇이 실종 됐는지 알려주시겠습니까?읽기 바이트가 배열에 올바르게 저장되지 않았습니다.

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); 
} 
+0

아마도 데이터를 인쇄하는 방법에 버그가있을 수 있습니다. – Mat

+1

컴파일 가능한 코드를 포함하십시오. 귀하의 정수가 불에 타지 않아서 다행입니다 ('unsinged'). 정수로 1 바이트를 읽는 것은'CHAR_BIT> 8 '을 의미하는'sizeof (int) == sizeof (char)'가 아니라면 구현에 의해 정의 된 행동으로 이어진다. 실제로'& UBX_buffer'를'read (fd, & UBX_buffer, 1)'에 넘겨서는 안됩니다. 실제로는 빠져 나갈 것입니다. –

답변

0

어떤 read() 함수가 사용되는지는 분명하지 않습니다. 전체 데이터를 UXB_buffer로 읽어야합니까?

다시 나는 당신이 무슨 뜻인지 이해하지

"그러나 나는 테스트하고 항상 1 바이트 인쇄 전체 데이터 다른 모든 바이트가 비어 있습니다 그것을 밖으로 인쇄 할 때" 데이터가 1 ​​바이트 이상인 경우 첫 번째 바이트가 전체 데이터를 어떻게 인쇄 할 수 있습니까?

+0

음 나는 방금 cout을 썼다. << UBX_buffer [0] << endl; if 조건 다음에 터미널에서 실행합니다. 약간의 지연이 발생하면 전체 데이터가 출력됩니다. 하지만 인쇄 할 때 // cout << UBX_buffer [1] << endl; 데이터가 전혀 없습니다. 내가 왜 혼란스러워하는지. –

+0

이 읽기 ​​기능을 사용합니다. http://linux.die.net/man/3/read –

1

이 줄 :

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

1 바이트를 읽습니다. 특정 라인을 가지고 UBX_buffer[0]이 아닌 다른 데이터로 절대 데이터를 가져올 수 없습니다. 한편

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

을, 당신은 그래서 그냥 unsigned char UBX_buffer;int UBX_buffer[40]을 변경, 한 번에 하나의 바이트를 처리 한 후해야 할 UBX_buffer[x] 대신 UBX_buffer을 사용하고 있습니다 : 당신이 사용하는 것이라면

확실하지 않음 트릭, 제 생각에는.

관련 문제