比较两个char数组会在某些字符上冻结我的Atmega

时间:2015-12-22 08:29:42

标签: avr atmega

我的Atmega16有问题,我使用USART来获取char数组,然后我尝试解析命令并发送输出。

我有这些方法:

void process_command()
{
    if(command_in[0]=='D'  && command_in[1]=='X') {
        // do something or do nothing
    }
    else if(command_in[0]=='S' && command_in[1]=='X'){
        // do something or do nothing
    }
    else{
        // do something or do nothing
    }
}

command_in是coppied char数组的输入,我用这个方法将data_in复制到command_in char数组。我使用atomic是因为我的软件使用了中断。

void copy_command ()
{
    ATOMIC_BLOCK(ATOMIC_FORCEON) {

        memcpy(command_in, data_in, 8);
        memset(data_in[0], 0, 8);
    }
}

当我尝试比较来自command_in [n]的char(其中n是索引)到'O'或'M'我的AVR冻结时,问题非常奇怪。有些字符不起作用(特别是'O','o'或'M','m')。很多字符工作正常,当我试图解析“OK”命令时,我发现了这个问题。 我甚至解析了像“ALLRIGHT”这样的命令,我的uC可以解决这个问题。

1 个答案:

答案 0 :(得分:0)

假设data_in类似于uint8_t data_in[DATA_MAXLEN] ;,则memset(data_in[0], 0, 8);读取data_in的第一个元素,并将其用作地址,并将此地址的后8个字节设置为零。

你可能想要像

这样的东西
memset(data_in, 0, sizeof(data_in));

(假设data_in是一个数组而不是一个指针。如果它是一个指针,你应该使用DATA_MAXLEN*sizeof(data_in[0])作为大小参数)