Неадекватные значения переменной unsigned long

Dagra
Offline
Зарегистрирован: 10.11.2020

Здравствуйте!

Имею проблему - неадекватные значения переменной unsigned long. Возможно она состоит в моем недостаточном понимании преобразования типов.

Есть дальномер. Присылает дальность и качество измерения (силу - Strength).

Получаю серию из 10 измерений. Из них определяю осредненную дальность. Сила - вес измерения, определяет вклад отдельного измерения в осредненное измерение.

Сила сигнала не может превышать 65535 (определяется двумя байтами). Если сила эта меньше 100 или равна 65535, то измерение некачественное (так написано в руководстве дальномера) и оно отбрасывается.

Ниже привожу место в коде где происходят проблемы. Дальномер присылает по последовательному порту значения. Массив uart имеет тип int. Менял на unsigned long - без изменений.


//Приём отдельного измерения
        unsigned long Dist = (unsigned long)(uart[2] + uart[3] * 256); //Дальность
        unsigned long Strength = (unsigned long)(uart[4] + uart[5] * 256); //Сила измерения
        if (Dist == 0 || Strength < 100 || Strength >= 65535) continue; //Если некачественное - отбрасываем
        
        Lidar->O[Lidar->i] = Dist; //Присваиваем значение дальности в массив
        Lidar->S[Lidar->i] = (unsigned long)Strength/100UL; //Присваиваем значение силы в массив. Делю на 100 чтобы в дальнейшем переполнения не было 
        Lidar->i += 1;//К следующему измерению

Измерения смотрю в сериале:

Дальность    Сила сигнала после деления на 100
(Dist)             (Strength)

368                24117248 - не может быть больше 655 (?)
368                24117248 - не может быть больше 655 (?)
368                24117248 - не может быть больше 655 (?)
368                24051712 - не может быть больше 655 (?)
368                24051712 - не может быть больше 655 (?)
368                24051712 - не может быть больше 655 (?)
368                0 - почему не отбрасывается условием if выше
367                15 - Норма
367                15 - Норма
367                15 - Норма

То есть первые несколько измерений имеют силу почему то очень большую, потом равную 0, а потом уже нормальные значения.

В итоге 2 проблемы:

1. Неадекватные значения силы

2. Не происходит отброс измерений условием if.

В чем может быть причина и как её устранить? Подскажите пожалуйста!

Такое происходит иногда, но это недопустимо!

Контроллер - Arduino Mega 2560 PRO MINI

 

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

По этому кусочку, что вы привели, понять проблему трудно. Например не ясно что такое Lidar и где вывод в сериал происходит. 

Приведите минимальный, но компилируемый скетч который демонстрирует вашу проблему

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

По уму, нужно сделать то, написал коллега в #1.

Можете попробовать с наскоку просто исправить очевидную ошибку в этих строках, но если (и вполне вероятно) не поможет, то см. #1

А с наскоку вот так. Попробуйте поменять

Dagra пишет:

unsigned long Dist = (unsigned long)(uart[2] + uart[3] * 256); //Дальность
unsigned long Strength = (unsigned long)(uart[4] + uart[5] * 256); //Сила измерения

на 

unsigned long Dist = uart[2] + uart[3] * 256ul; //Дальность
unsigned long Strength = uart[4] + uart[5] * 256ul; //Сила измерения

Если ещё где-то подобная ошибка есть, то и там тоже.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

изменить массив на uint16_t не пробовали?

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

ua6em пишет:

изменить массив на uint16_t не пробовали?

А зачем его уменьшать после unsigned long ?

 

MaksVV
Offline
Зарегистрирован: 06.08.2015

А какой смысл в unsigned long преобразовывать если изначально переменная сидит в двух байтах? И да , почему она не в uint16_t а в int?