![]() |
Цитата:
А если не смещать на 4, то нужно битовую маску? buf[0] & 0xF0 ? |
Цитата:
|
Короче я со смещениями опять всё перепутал...
Куда чего надо смещать или с какой маской плюсовать чтоб узнать длину пакета? Помогите плиз- чайник я в этом. |
Цитата:
Цитата:
buf[0] & 0x0F * 256 + buf[1] |
Вот что получилось.
Кстати почему не работает вот такой способ узнать длину массива int i = DataBuf.length? PHP код:
|
Цитата:
|
Цитата:
Вот только не пойму Length = (buf[0] & 0x0F * 256 + buf[1]) - (len -2); постоянно возвращает -6. тоесть (buf[0] & 0x0F * 256 + buf[1]) равно нулю! Length это int |
вот полный код
PHP код:
|
Цитата:
Цитата:
buf[0] & 0x0F * 256 = 0 buf[1] = 0D Length = (buf[0] & 0x0F * 256 + buf[1]) = 0D общая длина сообщения. Теперь First frame количество значащих байт 6 j = 0; for (int i=2; 6;i++){ DataBuf[j] = buf[i]; j++; } Теперь судя по логу надо искать 21 и со следующего байта копировать 7 или (Length - 6) байт если (Length - 6) < 7 потом искать 22 если надо и так далее пока не скопируете Length байт. В этом случае в DataBuf будет посылка без обрамления и DataBufSize = Length. К сожалению я не знаю язык на котором вы пишите. |
модифицировал чтоб видить пакеты
PHP код:
PKG: 10 D 10 1D 13 10 4E 52 FIRST Length=-6 PKG: 21 4A 31 30 34 2E 32 B0 PKG: 10 D 10 1D 12 10 4D 41 FIRST Length=-6 PKG: 21 58 49 4D 55 4D 20 80 PKG: 10 D 10 1D 11 10 20 4D FIRST Length=-6 PKG: 21 2D 43 41 52 4C 4F 90 PKG: 10 D 10 1D 10 10 20 20 FIRST Length=-6 PKG: 21 4A 61 7A 7A 20 20 90 PKG: 10 D 10 1D F 10 46 4D FIRST Length=-6 PKG: 21 20 38 39 2E 39 20 90 PKG: 10 D 10 1D E 10 45 75 FIRST Length=-6 PKG: 21 72 6F 70 61 20 20 90 PKG: 10 D 10 1D D 10 44 4F FIRST Length=-6 PKG: 21 50 4F 2A 48 4F 45 80 PKG: 10 D 10 1D C 10 44 46 FIRST Length=-6 PKG: 21 4D 44 41 4E 43 45 90 PKG: 10 D 10 1D B 10 20 44 FIRST Length=-6 PKG: 21 41 43 48 41 20 20 90 PKG: 10 D 10 1D A 10 20 43 FIRST Length=-6 PKG: 21 4F 4D 45 44 59 20 90 PKG: 10 D 10 1D 9 10 42 45 FIRST Length=-6 PKG: 21 53 54 20 46 4D 20 90 PKG: 10 D 10 1D 8 10 42 45 FIRST Length=-6 PKG: 21 43 48 41 20 46 4D 90 PKG: 10 D 10 1D 7 10 61 6E FIRST Length=-6 PKG: 21 73 6F 6E 2E 66 6D 80 PKG: 10 D 10 1D 6 10 39 38 FIRST Length=-6 PKG: 21 2E 38 20 46 4D 20 90 PKG: 10 D 10 1D 5 10 20 39 FIRST Length=-6 PKG: 21 38 2E 34 20 46 4D 90 PKG: 10 D 10 1D 4 10 20 39 FIRST Length=-6 PKG: 21 36 2C 38 20 46 4D 90 PKG: 10 D 10 1D 3 10 39 30 FIRST Length=-6 PKG: 21 2E 33 20 46 4D 20 B0 PKG: 10 D 10 1D 2 10 38 38 FIRST Length=-6 PKG: 21 2E 37 20 46 4D 20 B0 PKG: 10 D 10 1D 1 10 20 20 FIRST Length=-6 PKG: 21 38 38 2E 33 20 20 90 PKG: 10 D 10 1D 0 10 31 30 FIRST Length=-6 PKG: 21 37 2E 38 20 46 4D 80 Грабли точно в строке LengthP = (buf[0] & 0x0F * 256 + buf[1]) - (len - 2); Может её нужно как-то по другому записать или скобок где наставить? Короче сам разобрался скобок не хватало LengthP = ((buf[0] & 0x0F) * 256 + buf[1]) - (len - 2); вот так всё красиво! От тестировал - пакет собирается. Но у меня почему-то по одному пакету данных всегда... Возможно из за дисплея. И по сути в этом пакете ни чего важного больше и нет. Можно просто строку эту вытащить и всё. |
Вот окончательный скетч который точно работает с одной строчкой, тоесть First Frame + Consecutive Frame. У меня больше 1 Consecutive Frame не идёт с моим дисплеем.
PHP код:
10 D 10 1D 12 10 4D 41 21 58 49 4D 55 4D 20 MA!XIMUM 10 D 10 1D 11 10 20 48 21 49 54 20 46 4D 20 H!IT FM 10 D 10 1D 10 10 46 4D 21 20 38 39 2E 39 20 FM! 89.9 10 D 10 1D F 10 45 75 21 72 6F 70 61 20 20 Eu!ropa 10 D 10 1D E 10 44 4F 21 50 4F 2A 48 4F 45 DO!PO*HOE 10 D 10 1D D 10 20 44 21 41 43 48 41 20 20 D!ACHA 10 D 10 1D C 10 20 43 21 4F 4D 45 44 59 20 C!OMEDY 10 D 10 1D B 10 20 42 21 4F 43 54 4F 4B 20 B!OCTOK 10 D 10 1D A 10 42 45 21 53 54 20 46 4D 20 BE!ST FM 10 D 10 1D 9 10 42 45 21 43 48 41 20 46 4D BE!CHA FM 10 D 10 1D 8 10 61 6E 21 73 6F 6E 2E 66 6D an!son.fm 10 D 10 1D 7 10 20 39 21 38 2E 34 20 46 4D 9!8.4 FM 10 D 10 1D 6 10 39 36 21 2C 34 20 46 4D 20 96!,4 FM 10 D 10 1D 5 10 20 39 21 35 2E 36 20 46 4D 9!5.6 FM 10 D 10 1D 4 10 39 30 21 2E 33 20 46 4D 20 90!.3 FM 10 D 10 1D 3 10 38 38 21 2E 37 20 46 4D 20 88!.7 FM 10 D 10 1D 2 10 20 20 21 38 38 2E 33 20 20 !88.3 10 D 10 1D 1 10 31 30 21 37 2E 38 20 46 4D 10!7.8 FM 10 D 10 1D 0 10 31 30 21 36 2C 36 20 46 4D То что нечитабельными символами в ascii сюда не копируется, но между хексом и нормальным текстом то, что не перевелось в ascii. Восклицательный знак это 0 байт Consecutive Frame. При нажатии кнопки LIST при проигрование диска на дисплее отображаются номер трека и звёздочки за место текста (ну его и нет), но в этот ID это почему-то не попадает.... |
Итак, у меня классные новости!
Я купил магнитолу и дисплей, кинул их на стол, отсканировал и нашёл то, что мне не хватало. Нашёл где прячится иконка LOUD, а так же подошёл к событию которое позволит выкинуть дисплей штатный нафиг. Вот что я накопал: ID от дисплея 0 <0,0,80,1> через секунд 30 после включения 4 <0,F,F0,0,0,80,1> через секунд 30 после включения 6 5E0 Один раз при подключении питания магнитолы. 1ED неизменен 167 неизменен 15B неизменен 525 неизменен 5E5 неизменен DF Отвечае открыто меню или нет: 10,0,50 открыто, 90,0,70 не открыто. Если не отреагировать на нажатие кнопки MENU изменением битов, то магнитола не отреагирует и будет кнопками также переключать станции или треки. Всего 10 ID. Скорее всего какие-то отвечают за набор функций в дисплее. Это будет просто проверить отсканировав мой строчный дисплей (этот графический). |
Так ребят, извиняюсь.
Вчера не было времени на детальный анализ ID. Исправляюсь 0xDF Отвечае открыто меню или нет и состояние его элементов. За открытие меню отвечает второй байт. 50HEX 0101 0000 закрыто 70HEX 0111 0000 открыто Первый байт отвечает за выбор элемента. Отображает выбраный элемент в реальном времени если меню вызвано через OK или последний элемент с которым производились действия если меню вызвано через MENU. При повторном входе в меню любой кнопкой сбрасывается на первый элемент. 1HEX 00000001 Alternative frequencies 3HEX 00000011 Regional mode (00000010, но не включается без RDS) 24HEX 00100100 Radio-text information 42HEX 01000010 Track random play Нулевой байт отвечает сразу за 2 функции. при неактивном меню 10HEX 00010000 Выход из меню по таймауту или ESC 11HEX 00010001 элемен был деактивирован 12HEX 00010010 элемент был активирован при активном 90HEX 10010000 нахождение в меню в предидущий вход действий с элементами не выполнялось 91HEX 10010001 элемент был активирован - передаётся во время нажатия OK 92HEX 10010010 элемент был деактивирован - передаётся во время нажатия OK Тоесть если вы попали в меню через OK, то положение в нём можно отследить, если через кнопку MENU, то нет. |
И ещё раз прошу помощи с мультифреймом.
Собрал пакет и не пойму как теперь его разбить на части. Вот пример: PHP код:
На экране БК выглядит так: -ENERGY- PTY TA 103.0 FM 88.3 90.3 FM PTY TA И не понятно ещё где хранятся данные о PTY, но оно отображается. B0 ° это признак TA на станции с РДС, а вот пакет для станций без РДС, но с ТА. там 0. И как его выуживать тоже не понятно. Единственное он всегда в плотную к следующей надписи идёт PHP код:
|
10 28 в собранном сообщение быть не должно.
>> Присутствует паразитный(а может и нет, а информационный) символ 80(Ђ). Конечно он не паразитный. Что-то он в себе несёт, но покуда вам нет в нем нужды, игнорируйте этот байт. Вторая посылка на первый взгляд выглядит так же, как первая. не понятен вопрос. У всех данных фиксированные позиции в посылках. Иначе и быть не может. Если в одно сообщение информация идет 5ым байтом, то и в другом она будет 5ым байтом |
Цитата:
Выглядят-то они идентично. Вопрос как разбить на строки? Специально дал то, что отражается на дисплее. Ведь сообщения которые в разных посылках в одной строчке на дисплеее. Как искать разделение? А, всё! ДОГНАЛ! Получается что мои сообщения всегда занимают 9 байт! Счёт идёт с 6 байта первого пакета! Это утверждение не верно! Цитата:
|
так ребят, не наступите на грабли! Я час потратил чтоб разобраться! Символы переведённые способом char(), переводятся все и получается что даже не видимые символы могут потом складываться с видимыми давая чудесные результаты!
вот окончательный код сборки строки. через | выводится что поддерживает данная станция. PHP код:
|
T_r_D, а как вы собираетесь инсталлировать планшет в машину? Есть уже какой-то план? Пилить пластик будете? Заглушки штатные будут?
|
Цитата:
А пластина в кавычках потому что это площадка из оргстекла которая одновременно будет и прижимать планшет к рамке и на неё же крепиться моя плата. А сама рамка вот http://www.ebay.com/itm/Car-Radio-Fr...ZUAE-B&vxp=mtr Только отверстие под SD уберу и затяну в плёнку под карбон. |
Я думал у вас Ситроен С4 b7, как у меня. Ищу решение чтобы ничего не пилить, планшет под нужный размер пока найти не удалось.
|
Кстати в мультифрейме идёт ещё и выбор запрограммированных станций. При нажатии кнопок 1-6 тоже отображается мультифрейм и при нажатии кнопки BAND.
Надо записать диск с CD-Text и посмотреть как там организован мультифрейм. Для этих случаев он организован одинакого- пакет состоит из 8 байт текстовой информации + 1 байт служебной. Для листа станций радио этот девятый байт это PTY, TA, RDS. Скоро совмещу мультифрейм скетч и основной и покажу что получилось. По идеи остаётся два меню- одно для кнопки OK на радио, второе на ЦД. Это собственные меню магнитолы. Они идут с выбором позиции. В них те же пункты что и по кнопке MENU, но отрабатываемые магнитолой, а не дисплеем. Тоесть там включение RDS, REG, RDTXT, Intro mode, Random play. А и ещё меню с выбором трека если нет CD-Text. Оно выдаётся по кнопке LIST PS. Пытался записать болванку с ЦД-текстом разными программами и ни одной не получилось! Есть у кого такой компакт? Снимите образ с него, а то проверить не могу. |
Короче забил я на CD-Text. Как не старался его записать на болванку ни чего не вышло. Если попадётся, то допишу потом его расшифровку...
Для полного завершения не хватает отработки трёх меню. Первое при нажатии кнопки OK в режиме радио Второе при нажитии кнопки OK в режиме CD Третье при нажатии собственно кнопки MENU. Если дисплей подключен, то по ID DF он передаёт в магнитолу выбраный элемент меню, но вопрос откуда он берёт эти меню. Оказалось что при загрузке у него для радио 3 стандартных пункта меню, а для CD один. Я так понимаю что это минимальный набор и он присутствует всегда. Далее похоже на то, что дисплею посылается установка, но какая-то она маленькая... ID 365 при запуске FF,FF,FF,0,0 при работе 45,31,1B,0,0 В процессе работы меняется иногда на пустое, но на долю секунды Возможно что такой пакет это и есть опции меню? Просто больше других не вижу. Итак- раскопал я этот ID. Отношение к меню он имеет только тем, что если вставлен диск, то появляется дополнительный элемент меню. при запуске и если нет диска FF,FF,FF,0,0 при работе: Нулевой байт это количество треков на диске. Первый байт общее время на диске минуты Второй байт общее время на диске секунды Третий и четвёртый ноли всегда. В процессе работы меняется иногда на пустое, но на долю секунды Если диск вставлен, то в меню появляется пункт Activate Track Intro Тоесть меня это не особо приблизило к цели, но из задачь убралось первые два пункта. Кстати в 1E0 ещё и источник передаётся! нулевой байт это источник! 0101 0000 ^^ ||радио |CD Дальше надо в машине смотреть, на столе нету ни аукса ни ченджера. |
Найден ещё один ID с мультифреймом!
Radio Text 0xA4 5 10 0 0 0 0 10 44 10 0 0 0 20 20 21 20 20 20 20 20 20 20 22 20 20 20 2E 63 6F 6D 23 2F 72 61 64 20 20 20 24 20 20 20 20 20 72 75 25 20 20 20 20 20 20 20 26 20 20 20 20 20 20 20 27 20 20 20 20 20 20 20 28 20 20 20 20 20 20 20 29 20 20 20 20 20 20 23 2F 72 61 64 69 6F 73 24 70 20 20 20 20 72 75 10 44 10 0 0 0 49 4E 21 20 40 20 77 77 77 2E 22 69 6E 73 20 20 20 20 23 20 20 20 20 20 20 20 24 20 20 20 20 20 5F 66 25 6D 20 20 20 20 20 20 22 69 6E 73 74 61 67 72 23 61 6D 2E 63 6F 6D 2F 24 73 70 6F 72 74 5F 66 22 20 20 20 20 20 20 20 24 20 20 20 20 20 20 20 23 52 53 54 20 20 20 20 21 20 20 20 77 77 77 20 10 44 10 0 0 0 46 42 22 66 61 63 20 20 20 20 23 20 20 20 20 6D 2F 73 24 70 6F 72 74 66 6D 2E 25 72 75 20 20 20 20 20 21 20 20 20 74 77 69 20 23 61 6D 2E 63 20 20 20 24 20 70 6F 72 74 20 20 24 73 70 6F 72 74 20 20 21 20 40 20 77 77 77 20 10 44 10 0 0 0 40 20 |
Цитата:
http://autowp.github.io/#0A4 |
autowp
Source: Radio Dest: Display Current track name ISO 15765-2 0A4 00100000 00000000 010 A 1 - message contains track author data 1000 NNNNNNNN track nubmer [ TEXT_DATA author & track name ] И? Тут понятно что это? Что у тебя написано? Какой блин автор и трек нейм? Это Радиотекст! Я тебя просил поправить свои таблицы с моими дополнениями- ты сказал чтоб я сам их правил. Так что буду тут разъяснять что нахожу. |
Я и не говорю, что там все понятно. Я просто заметил, что "найден!" звучит странно.
>Какой блин автор и трек нейм? >Это Радиотекст! Логично предположить, что это и то, и другое : текущий трек/станция |
Вложений: 1
Так. Потестил всё и пошёл в машину.
Оказалось что в машине List of station который передаётся мультифреймом не такой как дома. Он всегда состоит из одной строки отображающийся на дисплее. Короче стало очевидно что магнитола определяет тип дисплея который подключён или может он прописывается диагностической программой при установке? Есть у кого какие мысли? На всякий приложу картинку с ID которые у меня есть на столе в связке магнитола и нормальный дисплей. Там нескольких нет, но они возникают после некоторого время работы, так что не относятся точно к иниту дисплея если он есть. |
Народ, а кто нить делал что нить на исходниках для дройда которые я использую? Всплыла плохая бяка. С увеличением длины строки некоторые цифры начинают переводится в ASCII как я подозреваю. Тоесть при каком-то наборе символов в передаваемой строке всё замирает, а дальнейшие пакеты валятся в буфер. Какое-то время это продолжается, а потом вываливается всё что накопилось. Ща не дома, но если интересно, то могу дать строку которая при передачи с ардуины в дройд не будет отображаться совсем, но как только в ней поменяется первое число, то выпадет на экран всё что напередавалось
|
Цитата:
|
Мой дисплей после включения постоянно отправляет какие-то данные. Вполне вероятно что в них указан тип дисплея.
|
У меня на столе собрана магнитола и дисплей. При включении они выплёвывают по одному Id. На картинке такой id для дисплея указан. При этом есть циклический id который очень похож на тот который единожды проходит.
Короче я понял- Ща с глюком перекодировки разбирусь, доделаю менюшки не требующие эмуляции дисплея и с машины сниму свой строчечный дисплей чтоб на столе запустить и посмотреть отличия. |
Так у вас в машине другой тип дисплея?
Скорее всего при телекодировании в магнитоле прописывается тип дисплея и от этого зависит как она передаёт данные на дисплей. |
Народ- дурацкий вопрос. Передаю из ардуины дройду два байта
DATA[9] = 0x09; DATA[10] = 0xA0; принимаю на стороне дройда нормально, а теперь пытаюсь их склеить и получаю чушь! (Arbyte[9] << 8) + Arbyte[10]) Arbyte[9] равно -91 и поэтому заполняется еденицами, а нужно чтоб нолями. Как это сделать? |
А так (Arbyte[9] * 256 ) + Arbyte[10] не пробовали?
|
Пробовал- тоже самое.
Помогла маска 0хff. Там дело в том, что он про арбайт 10 думает что оно-90, а оно на самом деле 160. Тоесть 160 это 16 бит и старшим забиты нулями. Если обрезать до 8 бит, то получится как раз -90 |
Цитата:
|
Цитата:
T_r_D описался, не -90, а -96. |
Цитата:
00001001(09)*00000001 00000000(256)=00001001 00000000(09 00) 00001001 00000000(09 00) + 10100000(А0) = 00001001 10100000(09 A0) 01011010(90) это еще можно объяснить, но это 01100000(96) откуда вы взяли, даже понять не могу. |
Вложений: 1
Цитата:
8 бит и 16 бит дают разный результат. |
Я так понимаю вся беда в том, что ява не поддерживает беззнаковый тип данных, отсюда и косяки. Либо надо работать с более вместительными типами, либо как сделал T_r_D, обрезать маской.
|
Часовой пояс GMT +4, время: 08:37. |
Работает на vBulletin® версия 3.8.4.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot