我正在为无线电模块编写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类型。此外,我从来没有真正强大的指针等。任何建议都将不胜感激,无线电代码的另一部分完全按照我的方式使用此功能,只有缓冲区是全局声明的。
答案 0 :(得分:4)
根据功能签名
radio_receive_packet(uint8_t *length, __xdata uint8_t * __pdata buf)
第一个参数应该是一个指针。在你的情况下,
if (radio_receive_packet(MAX_PACKET_LENGTH, mbuf))
它几乎看起来像一个MACRO值,可能是int
或const-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))
{
[...]
}
所以你的问题似乎是第一个参数,而不是第二个参数。