Встрял на ровном месте! Обьясните почему так!

sanekru
Offline
Зарегистрирован: 05.12.2017

Доброгодня!

Народ ткните пальцем почему так происходит?

Есть тривиальная функция, в ней вывод в порт значения, она стоит в loop и вызывается каждые 5 сек.

Но при этом показания в сериале плюсуются, хотя static нигде не стоит и функция соответственно после каждого вызова завершается! Весь мозг сломал, вижу что решение банально но я видимо думаю не в том направлении!

void getCheckSum();

void setup() {
    Serial.begin(9600);
}

void loop() {
    getCheckSum();
    delay(5000);
}

void getCheckSum(){
    uint8_t i, checksum;
    uint8_t readC_cmd[9] = {0xFF, 0x01, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49};
    for(i=1; i<8; i++){
        checksum += readC_cmd[i];
    }
    Serial.println(checksum);
}

вывод в сериал:

10
33
56
79
102
125
148
171
194
217
240
7
30
53
76

хотя значение должно оставаться постоянным : 23

-NMi-
Offline
Зарегистрирован: 20.08.2018

13 строка  uint8_t checksum=0;

sanekru
Offline
Зарегистрирован: 05.12.2017

Так, а в чём проблема, не пойму ?

 uint8_t checksum;
    uint8_t readC_cmd[9] = {0xFF, 0x01, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49};
    for(int i=1; i<8; i++)

если имели ввиду i, то не дело не в этом.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

sanekru пишет:

Так, а в чём проблема, не пойму ?

 uint8_t checksum;
 

Начальное значение checksum не определено

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

sanekru пишет:

Так, а в чём проблема, не пойму ?

А Вас не смущает, что самый первый результат у Вас 10? Посчитайте-ка вручную, сколько должно быть?

А что касается Вашей ошибки, то сначала Вам о ней сказал компилятор (если у Вас предупреждения включены). Причём он подробно объяснил суть проблемы. Потом коллега подсказал Вам на что обратить внимание. Вы уверены, что Вам нужны ещё подсказки?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

mykaida пишет:

Начальное значение checksum не определено

Ну, вот, блин! Обломали человеку шанс таки самому разобраться :-(

sanekru, а Вы привыкайте читать сообщения компилятора - читали бы, этой проблемы бы не было!

kalapanga
Offline
Зарегистрирован: 23.10.2016

sanekru пишет:

если имели ввиду i, то не дело не в этом.

NMi имел ввиду, что при входе в Вашу функцию нужно самому обнулять переменную checksum, что он Вам и написал.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

ЕвгенийП пишет:

Ну, вот, блин! Обломали человеку шанс таки самому разобраться :-(

Евгений, прошу извинения. Поторопился. Вы правы - один раз самому понять - дорогого стоит.

sanekru
Offline
Зарегистрирован: 05.12.2017

Парни спасибо большое, что то даже об этом не подумал, получается к мусору чтоли плюсовалось, а по поводу сообщений компилятора, так он ваапще без ошибок всё компилит, только у меня не arduino IDE а VScode & PlatformIO

Вобщем думал нулём по умолчанию инициализируется!


char getCheckSum(char *packet){
   char i, checksum;
   for( i = 1; i < 8; i++){
      checksum += packet[i];
   }
   checksum = 0xff –checksum;
   checksum += 1;
   return checksum;
}

Собственно из официального data sheet mhz19b, пришлось разобрать функцию до безобразия, crc не сходился

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

sanekru пишет:
он ваапще без ошибок всё компилит

А я говорю не про ошибки, а про предупреждения. Не может их не быть. Но, например, в ардуино IDE разработчики по умолчанию поставили опцию их не выводить, чтобы блондинок не смущать. А дальше каждый сам решает - блондинка он или всё же их надо включить.

sanekru пишет:
только у меня не arduino IDE а VScode & PlatformIO

Уверен, что и там их можно включить. А если таки нельзя - выбросьте в топку такую систему. Если бы Вы прочитали предупреждение, вопроса бы не было - там ясно написано, что "warning: 'checksum' may be used uninitialized in this function"

sanekru
Offline
Зарегистрирован: 05.12.2017

Спасибо за наводку, обязательно посмотрю где включаются данные предупреждения, сэкономил бы пару часов жизни!