2016-10-28 3 views
1

Cypress의 SDCard 라이브러리를 사용하여 SD 카드에 쓸 때 몇 가지 문제점이 있습니다. 왜냐하면 나는 모든 것을 가속화해야하기 때문에, sprintf()과 비슷한 것을 사용하는 것은 불가능하다.시프트시 이상한 동작

라이브러리를 사용하면 uchars 또는 문자열로만 SD 카드에 쓸 수 있습니다. 불행히도 내 값은 모두 int16_t입니다. 여기에 문제가 발생하는 곳이 있습니다 :

int16_t ax = -15000; 
     ay = -10000; 
     az = -32760; 
     gx = 32760;  
     gy = 25000; 
     gz = 10;  
     mx = -10; 
     my = 20; 
     mz = 0; 

// Then I put it into an array 

char suma[] = { 
    ((uint16_t) ax) & 0xff, 
    ((uint16_t) ax) >> 8, 
    ((uint16_t) ay) & 0xff, 
    ((uint16_t) ay) >> 8, 
    ((uint16_t) az) & 0xff, 
    ((uint16_t) az) >> 8, 

    ((uint16_t) gx) & 0xff, 
    ((uint16_t) gx) >> 8, 
    ((uint16_t) gy) & 0xff, 
    ((uint16_t) gy) >> 8, 
    ((uint16_t) gz) & 0xff, 
    ((uint16_t) gz) >> 8, 

    ((uint16_t) mx) & 0xff, 
    ((uint16_t) mx) >> 8, 
    ((uint16_t) my) & 0xff, 
    ((uint16_t) my) >> 8, 
    ((uint16_t) mz) & 0xff, 
    ((uint16_t) mz) >> 8, 
    0 
}; 

데이터를 검색 할 때 잘못된 것이 있습니다. 데이터는 gz까지 유효합니다. 그것은 10을 보여 주지만 나머지는 방금 사라졌습니다.

10을 257로 변경하면 문제가 해결되고 -10은 정상입니다. 즉, 음수가 아닌 값을 오른쪽으로 이동할 때 오류가 발생합니다.

무슨 일 이니? 나는 char에 다음 UINT16에 int16_t을 변환하고 당신은 통찰력 :

+0

C 또는 C++로 가정? – Enfyve

+0

예, 죄송합니다, 그 C++ –

+0

gz는 그것을 조정 한 후에 무엇을 출력합니까? – Enfyve

답변

1

을 가지고 희망, 당신은 가능성이 null char (\ 0)로 라이브러리를 전송 결말 있습니다.

char[] 또는 만 허용하는 라이브러리는 아마도 앞의 문자열을 null char으로 끝나는 C 문자열로 변환합니다. 가장 중요한 바이트 (0x00)가 문자열을 일찍 종료한다는 것을 의미합니다. 257 이하의 uint16은 가장 중요한 자리에 널 (null) 문자가됩니다.

예컨대 :

0000 0000 = [0, 0] = [0x00, 0x00] // 2 null chars, only the first will get across 
0001 0000 = [1, 0] = [0x01, 0x00] // null char 
            // ... 
1111 0000 = [256, 0] = [0xff, 0x00] // null char 
1111 0001 = [256, 1] = [0xff, 0x01] // not null char 

시도 명시 적으로 표준 : : 문자열에 문자 []를 캐스팅하고 그것의 크기를 지정. 예 :

std::string s("ab\0c", 4); 
+0

나는 당신이 옳다고 믿습니다. 내가 관찰 한 것은 당신이 묘사 한 것과 일치합니다. 이 문제를 어떻게 관리 할 것을 제안합니까? 아마도 ** for ** loop와 같은 비교 함수를 추가 할 수 있습니다. "값이 257보다 작고 -1보다 큰 경우."33 추가 "그러면 후 처리에서 모든 상위 2 진 부분에 대해 검사를 수행합니다. 33 인치있다. Ofcourse는 위 부분에 00100001이있는 모든 값이 적용된다는 것을 의미합니다./ –

+0

음, 위에서 언급했듯이 먼저 문자열의 크기로 std :: string으로 명시 적으로 변환 해보십시오. 그래도 작동하지 않으면 라이브러리가 문자열에 대한 포인터를 허용하는지 확인하십시오. 그 이상의 경우 널 (null) 문자를 지원하도록 라이브러리를 직접 수정해야 할 수도 있습니다. – Enfyve

+0

@AndreasHD 음, uint16_t로 캐스팅 한 후에는 숫자가 <0 인 것에 대해 걱정할 필요가 없지만 SD 카드의 파일에 실제 이진을 쓰려고하면 0x00 바이트를 유지해야합니다. , 값을 변경하면 원하는 것이 아닐 수도 있습니다. – Enfyve