Помогите сократить число из 9-ти символов в 4
- Войдите на сайт для отправки комментариев
Пт, 03/04/2015 - 09:55
С помощью Аrduino и can шилда сканирую шину авто, нашел программу, которая очень бы мне помогла в расшифровке сообщений шины, но есть проблема:
Программа работает с 11бит сообщениями, а у меня 29бит, те мои сообщения имеют вид:
270663744,0,0,0,0,79,249,0,0
а программа воспринимает только
1569,0,82,0,0,0,0,0,0
Вся проблема в этой первой цифре (CAN Id сообщения)
И вот возник вопрос, как в скетче перевести или закодировать 9 символов в 4
Я вижу следующие варианты, которые пока не знаю как реализовать:
1. Тк этих сообщений не больше 100, то можно было бы их ка ни будь пронумеровать и посылать в порт только их номер.
2. Если перевести это число в HEX то у полученного 8-ми значного числа, первые две цифры будут у всех сообщений 10 (иногда 13 - но можно принебреч) , последние 3 цифры будут иметь всего 10 комбинаций и изменятся будут только средние 3. Возможно как-то, зная это, можно создать алгоритм кодирования этих сообщений в 4-х значное число!?
Возможно есть другие идеи, как преобразовать этот id
Вот на всякий случай варианты этих ID в dec и HEX:
| 270581824 | 1020C040 |
| 270598208 | 10210040 |
| 270663744 | 10220040 |
| 270704704 | 1022A040 |
| 270712896 | 1022C040 |
| 270721088 | 1022E040 |
| 270729280 | 10230040 |
| 270794816 | 10240040 |
| 270803008 | 10242040 |
| 270827584 | 10248040 |
| 270860352 | 10250040 |
| 270925888 | 10260040 |
| 270942272 | 10264040 |
| 271319104 | 102C0040 |
| 271360064 | 102CA040 |
| 271368256 | 102CC040 |
| 271376448 | 102CE040 |
| 271384640 | 102D0040 |
| 271450176 | 102E0040 |
| 271482944 | 102E8040 |
| 272187456 | 10394040 |
| 272449600 | 103D4040 |
| 272482368 | 103DC040 |
| 272711744 | 10414040 |
| 272793664 | 10428040 |
| 272859200 | 10438040 |
| 274907200 | 1062C040 |
| 275005504 | 10644040 |
| 275030080 | 1064A040 |
| 275480640 | 106B8040 |
| 275513408 | 106C0040 |
| 275857472 | 10714040 |
| 276119616 | 10754040 |
| 276136000 | 10758040 |
| 276283456 | 1077C040 |
| 276299840 | 10780040 |
| 276332608 | 10788040 |
| 276824128 | 10800040 |
| 276848704 | 10806040 |
| 277184576 | 10858040 |
| 279887936 | 10AEC040 |
| 283918400 | 10EC4040 |
| 283934784 | 10EC8040 |
| 335536192 | 13FFE040 |
| 271597656 | 10304058 |
| 271728728 | 10324058 |
| 271777880 | 10330058 |
| 335536216 | 13FFE058 |
| 270811232 | 10244060 |
| 271614048 | 10308060 |
| 272351328 | 103BC060 |
| 272629856 | 10400060 |
| 272777312 | 10424060 |
| 272908384 | 10444060 |
| 279765088 | 10ACE060 |
| 335536224 | 13FFE060 |
| 335536243 | 13FFE073 |
| 335536245 | 13FFE075 |
| 272670848 | 1040A080 |
| 275579008 | 106D0080 |
| 275972224 | 10730080 |
| 277741696 | 108E0080 |
| 279797888 | 10AD6080 |
| 335536256 | 13FFE080 |
| 271605913 | 10306099 |
| 272105625 | 10380099 |
| 274874521 | 10624099 |
| 275906713 | 10720099 |
| 275923097 | 10724099 |
| 275988633 | 10734099 |
| 276906137 | 10814099 |
| 279707801 | 10AC0099 |
| 279748761 | 10ACA099 |
| 279888025 | 10AEC099 |
| 279978137 | 10B02099 |
| 335536281 | 13FFE099 |
| 272875684 | 1043C0A4 |
| 274333860 | 105A00A4 |
| 275423396 | 106AA0A4 |
| 335536292 | 13FFE0A4 |
| 275914921 | 107220A9 |
| 335536297 | 13FFE0A9 |
| 272236731 | 103A00BB |
| 272253115 | 103A40BB |
| 272269499 | 103A80BB |
| 272629947 | 104000BB |
| 279888059 | 10AEC0BB |
| 335536315 | 13FFE0BB |
Или посоветуйте, как значения в HEX разбить на 3 части: первые 2 символа, следуючие 3 и следующие 3
А в программе которую нашли нет переключения между базовым и расширенным форматом кадра can протокола? 11бит это базовый формат, 29бит расширенный.
К сожалению нет. У того кто ее делал, не было такой необходимости.
Ну тогда я не понимаю что Вам даст сокращение идентификатора. Вы будите сигнал от подушек безопасности видеть как сигнал от бочка омывателя и Вас это устроит чтоли? Или Я вообще не понял затеи...
В том то и дело, что мне нужно определить, назначения этих идентификаторов, программа поможет в этом.
Посмотрел как вариант, что средние 3 цифры в идентификаторах практически везде различны за исключением 2-3 случаев, которые можно отфильтровать. Те можно использовать только эти 3 цифры.
Как их вырезать из середины числа? Переводом в текст, обрезкой и обратно, или как то иначе можно?
Упростил задачу. вот код:
unsigned long heady = 270581824; void setup() { } void loop() { // //Тут нужно значение heady перевести в HEX, затем обрезать первые 2 и последние 3 символа // Serial.print(heady, DEC); delay(1000); Serial.println(); }Попробуй так. Компелится, но железа под рукой нет
unsigned long heady = 270581824; void setup() { } void loop() { String heady_string = String(heady, HEX); Serial.print (heady_string.substring(2, 6)); Serial.print("\t"); Serial.println(heady, DEC); delay(1000); }