2017-02-23 48 views
-1

Я преобразовываю массив uint8_t в массив char &, затем передаем его с использованием модуля gsm, но проблема при преобразовании uint8_t для изменения его значений (например, шестнадцатеричное значение 0455 становится 0400 даже когда-то 00)Keil IDE автоматически меняет значение orrignal char char

Я также пытаюсь изменить уровень оптимизации keil3 на уровень2, но сталкиваюсь с такой же проблемой.

Вот мой код

uint8_t b_id[2]={11, 12}; 
    char bike_id[2]={0}; 
    ... 
    ... 
    { 
     ... 
     ... 
     //send id data 
     for(i=0; i<2; i++) 
     { 
      sprintf(bike_id, "%02x", b_id[i]); 
      sim808_send_tcp_tx(bike_id, 2); 
     } 

    } 
+0

Есть ли какой-нибудь символ 'char b_id [2]' в этих '...' в верхней части блока? – StoryTeller

+0

Пожалуйста, предоставьте [mcve]. – kaylum

+0

Хотя я действительно задаюсь вопросом, что в этих '...' частях (вы уверены, что не изменяете 'id' каким-либо образом? Нет переполнения буфера?), Мне больше любопытно, что происходит * после * кода ты показываешь. Вы должны * действительно * попытаться создать [Минимальный, Полный и Подтверждаемый пример] (http://stackoverflow.com/help/mcve). И, конечно же, попробуйте найти способ использования отладчика, чтобы вы могли перешагнуть код, чтобы увидеть, что он на самом деле делает. –

ответ

1

Проблемы эти две линии:

char bike_id[2]={0}; 
... 
sprintf(bike_id, "%02x", b_id[i]); 

Вы забыли, что строки в C действительно называется нулевым символом-байтовые строки. То, что null-terminated часть важна, а это означает, что строка из двух символов действительно нужна три символа: два символа строки, а также терминатор.

В вашем случае, поскольку у вас есть только два символа в массиве bike_idsprintf вызов запишет терминатор из границ, что приводит к непредсказуемому поведению .

Простое решение? Сделать bike_idтри символов.

+0

Я ничего не изменил. –