Официальный сайт компании Arduino по адресу arduino.cc
Неадекватные значения переменной unsigned long
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Здравствуйте!
Имею проблему - неадекватные значения переменной 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
По этому кусочку, что вы привели, понять проблему трудно. Например не ясно что такое Lidar и где вывод в сериал происходит.
Приведите минимальный, но компилируемый скетч который демонстрирует вашу проблему
По уму, нужно сделать то, написал коллега в #1.
Можете попробовать с наскоку просто исправить очевидную ошибку в этих строках, но если (и вполне вероятно) не поможет, то см. #1
А с наскоку вот так. Попробуйте поменять
на
Если ещё где-то подобная ошибка есть, то и там тоже.
изменить массив на uint16_t не пробовали?
изменить массив на uint16_t не пробовали?
А зачем его уменьшать после unsigned long ?
А какой смысл в unsigned long преобразовывать если изначально переменная сидит в двух байтах? И да , почему она не в uint16_t а в int?