2016-10-06 3 views
0

저는 Arduino IDE를 사용하여 progmem에 저장된 데이터를 함수로 전달하는 스케치를 작성한 후 progmem 데이터를 로컬 배열에 씁니다. 코드는 다음과 같습니다 :포인터가 함수로 전달되었습니다.

const uint8_t Data_3 [256] PROGMEM = {0x11, 0x39.....} 
void setup() { 
Serial.begin(57600); 
Data(Data_3, 0x00, 256); 
} 

void loop() { 
} 

void Data(const uint8_t *data, uint8_t bank, uint16_t bytes) { 
uint8_t buff1 [256]; 
buff1[0] = data[0]; 
Serial.println(buff1[0],HEX); // <--Works fine prints the correct value 
for (uint16_t x = 0; x < bytes + 1; x++) { 
    buff1[x] = data[x]; 
    Serial.println(buff1[x],HEX); // <--Just prints garbage 
    } 
} 

내가 buff1[0] = data[0]를 할당하고 대답은 올바른 결과를 인쇄 할 때. buff1[x] = data[x]으로 인쇄 기능을 반복 할 때 나는 쓰레기 만 가져옵니다. 누구든지이 이유를 알고 있습니까?

+0

하여 버퍼에 복사 루프하지 바이트 +1 – pm100

+1

에 대한 data'는 동일한 유형이없는''buff1'을하고 왜? 이것은 다른 여유를 나타내는 지표입니까? –

+0

왜 바이트일까요? 네, 느슨한, 실수. – hoboBob

답변

1

#include <avr/pgmspace.h>Serial.print(pgm_read_byte(data+x));을 사용해야합니다. 그렇지 않으면 플래시 메모리가 아닌 RAM에서 같은 주소에서 데이터를 가져 오려고 시도합니다.

또는 바이트해야 memcpy_P(buff, data, bytes);

+0

고마워, 이미 avr/prgspace lib를 가지고있다. + x는 왜 필요합니까? 배열 요소가 어떻게 식별됩니까? 나는 이것을 시도 할 것이다 :) agian – hoboBob

+1

@ user1232141234213 변수'data'는 첫 번째 요소에 주소를 포함하고'x' (offset이라고도 함)를 추가하면 올바른 주소를 계산합니다. 그것은 기본적으로 다음과 같이합니다 :'& data [x]' – KIIV

관련 문제