我正在使用atmega16做一个简单的例子
void uartrecieve(unsigned char * data1)
{
data1="on";
}
int main(void)
{
unsigned char *z;
DDRC=0xFF;
uartinit();
while(1)
{
uartrecieve(z);
if(strcmp(z,"on")==0)
{
PORTC =0xff;
_delay_ms(6000);
}
else
{
PORTC=0x03;
_delay_ms(6000);
}
}
}
我的问题是这个...为什么它总是打印0x03 ...不是2个值应该相等,因此它应该在PORTC上打印0xFF!
答案 0 :(得分:3)
您没有更新实际的字符串指针。
以下代码将执行您想要的操作:
void uartrecieve(unsigned char ** data1)
{
*data1 = "on";
}
int main(void)
{
unsigned char *z;
DDRC=0xFF;
uartinit();
while(1)
{
uartrecieve(&z);
if(strcmp(z,"on")==0)
{
PORTC =0xff;
_delay_ms(6000);
}
else
{
PORTC=0x03;
_delay_ms(6000);
}
}
}
答案 1 :(得分:2)
您不能只为char *
分配值来复制字符串,您必须使用strcpy
或memcpy
。但是你的问题是你没有为复制的字符串分配内存,所以你也需要这样做。
在示例中我分配了256个字节,如果你想通过uart接收一些真实的东西,我认为应该足够吗?否则你需要动态或静态地放大它。或者你可以把它读成块。
#define UARTBUFFERSIZE 256
void uartrecieve(unsigned char * data1)
{
/* Copy a maximum of 255 byte + 1 zero byte*/
strncpy(data1, "on", UARTBUFFERSIZE -1);
/* Make sure it's zero terminated */
data1[UARTBUFFERSIZE -1] = 0;
}
int main(void)
{
unsigned char z[UARTBUFFERSIZE];
DDRC=0xFF;
uartinit();
while(1)
{
uartrecieve(z);
if(strcmp(z,"on")==0)
...
}
}
答案 2 :(得分:0)
您可能需要将指针传递给指针:
void uartrecieve(unsigned char **data1)
{
*data1="on";
}
并称之为:
uartrecieve(&z);
答案 3 :(得分:0)
让uartrecieve()
填充已经分配空间的数组。
void uartrecieve(unsigned char *data1, size_t n) {
strncpy(data1, "on", n);
}
int main(void) {
unsigned char z[80];
...
{
uartrecieve(z, sizeof z);
if(strcmp(z,"on")==0)
...