SDDC将文字值转换为“通用”指针

时间:2015-08-13 15:02:28

标签: c

我正在为无线电模块编写at命令,我正在尝试使用以下函数,但是我似乎无法为编译器(SDDC)喜欢的第二个参数传递任何内容。

功能:

radio_receive_packet(uint8_t *length, __xdata uint8_t * __pdata buf)

我的代码:

static void
at_find(void)
{
    __xdata uint8_t mbuf[MAX_PACKET_LENGTH];
    // Cycle netID's 1-1000
    int i;
    for(i=1; i<=1000; i++)
    {   
        param_set(3, i);
        param_save();
        if (radio_receive_packet(MAX_PACKET_LENGTH, mbuf))
        {
            printf("Traffic found at %d\n", i);
        }
    }
    at_ok();

}

运行此代码会产生以下错误:

  

radio / at.c:403:错误88:将LITERAL值转换为'generic'   指针
从类型'const-unsigned-char literal'到类型   'unsigned-char generic * fixed'

我一直把头撞在墙上,我之前使用的是C,而不是SDDC或xdata和pdata类型。此外,我从来没有真正强大的指针等。任何建议都将不胜感激,无线电代码的另一部分完全按照我的方式使用此功能,只有缓冲区是全局声明的。

2 个答案:

答案 0 :(得分:4)

根据功能签名

radio_receive_packet(uint8_t *length, __xdata uint8_t * __pdata buf)

第一个参数应该是一个指针。在你的情况下,

 if (radio_receive_packet(MAX_PACKET_LENGTH, mbuf))

它几乎看起来像一个MACRO值,可能是intconst-unsigned-char literal类型,但不一定是uint8_t *

提示:__xdata uint8_t mbuf[MAX_PACKET_LENGTH];注意数组大小。

答案 1 :(得分:1)

我想通过解决方案扩展@ SouravGhosh的答案:您应该在at_find()函数的开头定义一个保持缓冲区长度的变量:

uint8_t buffer_length = MAX_PACKET_LENGTH;

然后将指向该变量的指针作为第一个参数传递给radio_receive_packet()函数:

if (radio_receive_packet(&buffer_length, mbuf))
{
    [...]
}

所以你的问题似乎是第一个参数,而不是第二个参数。