2017-10-31 1 views
0

필자는 코드를 잘 모르고 개선하기를 원합니다.시프트 및 또는 조작을 사용한 버퍼 조작

SPI (8 비트 통신)에서 일부 데이터를 수신하여이를 8 비트 버퍼에 저장합니다. 그것을 사용하려면 32 비트 단어를 사용하고 싶습니다. 첫 번째 코드는 작동하지만 두 번째 코드에 대해서는 확실하지 않습니다. 누구나 확인할 수 있습니까?

uint8_t *regData[5]; 

spi_xfer(fd, "\x24\xFF\xFF\xFF\xCC", 5, regData, 5); 
uint32_t regVal; 
regVal = (regData[0]); 
regVal += (uint32_t)(regData[1]) << 8; 
regVal += (uint32_t)(regData[2]) << 16; 
regVal += (uint32_t)(regData[3]) << 24; 

두 번째 :

uint8_t *regData[5]; 

spi_xfer(fd, "\x24\xFF\xFF\xFF\xCC", 5, regData, 5); 
uint32_t regVal; 
regVal = (regData[0]) | (uint32_t)(regData[1]) << 8 | (uint32_t)(regData[2]) << 16 | (uint32_t)(regData[3]) << 24; 

도와 주셔서 감사합니다 많이! Brieuc 지역

+0

이미 작동하는 코드의 경우 https://codereview.stackexchange.com/에서 대신 문의하십시오. 그 외에도 코드가 작동하는지 테스트를 작성해야합니다. – user694733

+0

사이드 노트 :'uint8_t * regData [5];'는 두 버전에서 모두 틀린 것으로 보입니다. 포인터의 배열을 직렬화하는 것 같습니다. 그러나 'spi_xfer'가 무엇인지 모르기 때문에 명확하지 않습니다. – user694733

답변

1
uint8_t *regData[5]; 

regData[]

포인터 배열이다. 이것이 의도 된 경우 배열의 포인터에 저장된 값을 검색하려면 dereference the pointer이 필요합니다.

regVal = *(regData[0]); 

그렇지 않으면 작업이 아니라 주소에 저장된 값보다 regValregData[0]에 저장된 주소를 할당합니다.

+0

이렇게 코드를 사용하는 것이 쉽지 않은가요? \t (regData [5] uint8_t; regVal uint32_t \t; \t regVal = (regData [0 \t spi_xfer (FD, 5 regData 5) "\ X24 \ XFF XFF \ XFF XCC \ \" ]) | (uint32_t) (regData [1]) << 8 | (uint32_t) (regData [2]) << 16 | (uint32_t) (regData [3]) << 24;) 답변 ! –

+0

'or' 연산이 유효합니다. 각 조건을 대괄호로 묶는 것이 좋습니다. '((uint32_t) (regData [x]) << 8)'. –