Memcpy_p问题,如何解决?

时间:2013-09-28 10:34:07

标签: c++ arrays avr

我对自己的代码感到困惑:-)我正在尝试从PROGMEM中读取数据。当我在PROGMEM中只有这个数组时,这可以正常工作。在PROGMEM中添加额外的单独数组时会出错。也就是说,当它在不同的代码片段和#included中定义时。当把它放在一个代码中时就可以了。但我希望这些数组能够以不同的代码分开。

我相信我在这里包含的最后一个函数中有一个错误(callMenuItemParaName)。 这与我读出PROGMEM的方式有关。我认为最好使用memcpy_P,但无法找到有关如何使用它的任何在线解释。

我现在使用的代码,但只要我不在PROGMEM中放入另一个数组。 (这个例程正常,使用memcpy_P函数。但是如何在函数callMenuItemParaName中实现memcpy_P?

感谢您提供任何建议! (当然包括pgmspace.h)

使用AVR GCC,IDE是Eclipse,mcu = atmega644 @ 20MHz

unsigned char (*adresParaName);

const uint8_t TEXT0[] PROGMEM = "TEXT0";
const uint8_t paraNameAtk[] PROGMEM = "Atk  ";
const uint8_t paraNameDcy[] PROGMEM = "Dcy  ";
...
const uint8_t paraNameTru[] PROGMEM = "Tru  ";
const uint8_t paraNameLight[] PROGMEM = "Light";

typedef void (*pMenu)(void);

typedef struct
{
    void (*pointer2MenuNumber)(void);
    char  VALUE;
    const unsigned char *adresParaName;
} sel_item;

const sel_item menuNumber2ItemDbase[] PROGMEM=
{
    { itemA , 0x00 , TEXT0 },
    { itemB , 0x01 , paraNameAtk },
    { itemC , 0x02 , paraNameDcy },
        ...
    { itemM , 0x05 , paraNameTru },
    { itemN , 0x05 , paraNameLight }
};

//prototypes
void callMenuItem(const sel_item *item); 
void callMenuItemValue(const sel_item *item);
void callMenuItemParaName(const sel_item *item);

// *************************************************
// callMenu
// Description:
//
// *************************************************

void callMenuItem(const sel_item *item)
{
    pMenu function = (pMenu)pgm_read_word(&item->pointer2MenuNumber);
    function();
}

void callMenuItemValue(const sel_item *item)
{
    setCursor(1,4);
    char VAL = (char)pgm_read_byte(&item->VALUE);
    char2LCD('0'+VAL);
}

void callMenuItemParaName(const sel_item *item)
{
    char tempText[5];
    char *data = (char*)pgm_read_word(&item->adresParaName);

    strcpy_P (tempText, data);
    for (uint8_t x=0;x<5;x++)
        {
        char2LCD(tempText[x]);
        }
}

我尝试添加此内容:

char* pstr = 0;
memcpy_P (&pstr, data, sizeof(char*));

但没有运气。 (无法在memcpy_P上找到一个很好的教程,顺便说一下)

1 个答案:

答案 0 :(得分:1)

您的字符串长度为6个字节(请记住终止0),这意味着当tempText进入strcpy_P时,您会溢出memcpy_P。请改用memcpy_P(tempText, data, sizeof tempText);

pgm_read_word

您使用{{1}}的方式很好。