2015-12-22 3 views
0

У меня проблема с моим Atmega16, я использую USART для получения массива char, затем я пытаюсь разобрать команду и отправить вывод.Сравнивая два массива char, замораживает мой Atmega на некоторых персонажах

У меня есть следующие методы:

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 обугленного массива входных данных, я использую этот метод, чтобы скопировать data_in в command_in массива символов. Я использую атом, потому что мое программное обеспечение использует прерывания.

void copy_command() 
{ 
    ATOMIC_BLOCK(ATOMIC_FORCEON) { 

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

Проблема очень странно, когда я пытаюсь сравнить полукокс из command_in [N], где п индекс к «O» или «M» моего AVR замерзает. Есть некоторые символы, которые не работают (особенно «O», «o» или «M», «m»). Множество символов отлично работает, я нашел эту проблему, когда пытался разбор команды «ОК». Я даже разобрал команду как «ALLRIGHT», и мой UC мог справиться с этим.

+0

Можете ли вы дать более подробную информацию о что происходит, когда ваш AVR «зависает»? Кроме того, можете ли вы добавить определения 'data_in' и' command_in' вашего кода? –

+0

Btw, для более длинных команд вы можете использовать 'strncmp()' вместо того, чтобы проверять все символы один за другим с логическим и inbetween. –

+3

Ваш вызов 'memset' является подозрительным. Первым параметром должен быть указатель, например 'data_in'. Вместо этого вы передаете значение 'data_in [0]' в качестве адреса. Вы можете очистить важную память с помощью этого вызова. – UncleO

ответ

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]) как размер аргумента)