Помогите сократить число из 9-ти символов в 4

alexnf
Offline
Зарегистрирован: 13.03.2015
С помощью А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

 

alexnf
Offline
Зарегистрирован: 13.03.2015

Или посоветуйте, как значения в HEX разбить на 3 части: первые 2 символа, следуючие 3 и следующие 3

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

А в программе которую нашли нет переключения между базовым и расширенным форматом кадра can протокола? 11бит это базовый формат, 29бит расширенный.

alexnf
Offline
Зарегистрирован: 13.03.2015

К сожалению нет. У того кто ее делал, не было такой необходимости.

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Ну тогда я не понимаю что Вам даст сокращение идентификатора. Вы будите сигнал от подушек безопасности видеть как сигнал от бочка омывателя и Вас это устроит чтоли? Или Я вообще не понял затеи...

alexnf
Offline
Зарегистрирован: 13.03.2015

В том то и дело, что мне нужно определить, назначения этих  идентификаторов, программа поможет в этом.

Посмотрел как вариант, что средние 3 цифры в идентификаторах практически везде различны за исключением 2-3 случаев, которые можно отфильтровать. Те можно использовать только эти 3 цифры.

Как их вырезать из середины числа? Переводом в текст, обрезкой и обратно, или как то иначе можно?

 

alexnf
Offline
Зарегистрирован: 13.03.2015

Упростил задачу. вот код:

unsigned long heady = 270581824;


void setup() {
}

void loop() {

//
//Тут нужно значение heady перевести в HEX, затем обрезать первые 2 и последние 3 символа
//

  Serial.print(heady, DEC);  


  delay(1000);        
  Serial.println();

}

 

X-Dron
Offline
Зарегистрирован: 24.01.2015

Попробуй так. Компелится, но железа под рукой нет

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);       
}