20.10.2015, 23:34 | #61 |
Старший Пользователь
Регистрация: 03.07.2015
Регион: 77, 97, 99, 177
Сообщений: 372
|
Помогите ещё чутка.
есть бит в котором 01022222 0 - не используются 1 - активно меню или нет 2 - данные меню. Пишу вот так (переменная равна int) AM = buf[6] << 3; Serial.println(AM); По моему мнению это должно заставить сообщение принять вид 22222000 но в реале почему-то получаю число типо 696. Этого числа вообще тут быть не может! При этом видно что значения меняются и данные ячеек меню тоже. Что я не так делаю? Вот кусок кода if(canId == 485) //1E5 { if (bitRead(buf[0],7) == 1){AP = 1; APV = (buf[0] << 1 / 2) - 191; AM = 0;} if (bitRead(buf[1],7) == 1){AP = 2; APV = (buf[1] << 1 / 2) - 191; AM = 0;} if (bitRead(buf[2],7) == 1){AP = 3; APV = (buf[2] << 1 / 2) - 191; AM = 0;} if (bitRead(buf[4],7) == 1){AP = 4; APV = (buf[4] << 1 / 2) - 191; AM = 0;} if (bitRead(buf[5],7) == 1){AP = 5; APV = bitRead(buf[5],6); AM = 0;} if (bitRead(buf[5],4) == 1){AP = 6; APV = bitRead(buf[5],2); AM = 0;} if (bitRead(buf[6],6) == 1){AP = 7; APV = 0; AM = buf[6] << 3;} } Serial.println(AM); значение в этом байте такие. 00011 None 00111 Classical 01011 Jazz-Blues 01111 Pop-Rock 10011 Vocal 10111 Techno полностью сообщение с активным меню и предустановкой Classic выглядит как 01000111 |
20.10.2015, 23:53 | #62 |
Пользователь
Регистрация: 13.12.2012
Возраст: 41
Город: Москва
Регион: 77, 97, 99, 177
Машина: Peugeot 407 Coupe
Сообщений: 82
|
Ты путаешь биты и байты.
Бит может быть 0 или 1. 2 быть не может. Сдвиг осуществляется побитно, а не побайтно. Хотя код выглядит логично, о каких 22222 речь совершенно не понятно |
21.10.2015, 01:36 | #63 |
Старший Пользователь
Регистрация: 17.01.2010
Возраст: 48
Город: Самара
Регион: 63, 163
Машина: Skoda Octavia A5 FL && Skoda Octavia Tour && ̶F̶F̶3̶
Сообщений: 457
|
T_r_D, попробуйте так:
if (bitRead(buf[6],6) == 1){AP = 7; APV = 0; AM = buf[6]^=1<<6;} В итоге в переменной AM получите: 3 или 00000011 None 7 или 00000111 Classical 11 или 00001011 Jazz-Blues 15 или 00001111 Pop-Rock 19 или 00010011 Vocal 23 или 00010111 Techno |
21.10.2015, 09:59 | #64 |
Старший Пользователь
Регистрация: 01.04.2010
Регион: 35
Сообщений: 697
|
Я бы побитно сложил ваш байт и маску 00111111
Res := 01000111 AND 00111111, а результат Res = 00000111 проверял на нужные вам цифры 3, 7... И учитывая что последние два бита не несут нужной вам информации или вы не знаете что они означают, я бы их убрал сложением с маской 00111100 с соответствующим перерасчетом цифр 3, 7... |
21.10.2015, 12:12 | #65 | |
Старший Пользователь
Регистрация: 03.07.2015
Регион: 77, 97, 99, 177
Сообщений: 372
|
Цитата:
Где x не используемые биты y бит состояния меню И z содержание меню. |
|
21.10.2015, 12:27 | #66 | |
Старший Пользователь
Регистрация: 03.07.2015
Регион: 77, 97, 99, 177
Сообщений: 372
|
Цитата:
И почему моё смещение не приводит к такому результату? По сути я хочу первые 5 бит переместить в начало обнулив последним 3 Мне кажется что при смещении какой-то мусор прилетает. Может сначала спаять с байтом забитым нулями, а потом сместить? Только хочется это по компактнее расписать, а не с кучей строк и условий. |
|
21.10.2015, 13:15 | #67 | |
Пользователь
Регистрация: 29.07.2015
Регион: 64
Машина: VW Tiguan
Сообщений: 89
|
Цитата:
if (bitRead(buf[6],6) == 1){AP = 7; APV = 0; AM = (unsigned char)(buf[6] << 3);} 1 смещается на 6 бит влево и логически (XOR) побитово складывается с buf[6]. То есть, если биты одинаковые, то результирующий бит будет 0, если разные то 1. Но похоже это не то, что нужно, так как, если в 7 бите buf[6] будет 0, то после этой операции там станет 1 и результат будет опять не тот. |
|
21.10.2015, 14:38 | #68 |
Пользователь
Регистрация: 29.07.2015
Регион: 64
Машина: VW Tiguan
Сообщений: 89
|
Извиняюсь, ввел в заблуждение. В данном случае buf[6]^=1<<6 будет отрабатывать как надо, так как стоит проверка if (bitRead(buf[6],6) == 1).
|
21.10.2015, 16:26 | #69 | |
Старший Пользователь
Регистрация: 03.07.2015
Регион: 77, 97, 99, 177
Сообщений: 372
|
Цитата:
Вечером попробую сделать вот так AX = buf[6],0 | buf[6],1 | buf[6],2 | buf[6],3 | buf[6],4; Ну и способ со смещением if (bitRead(buf[6],6) == 1){AP = 7; APV = 0; AM = (unsigned char)(buf[6] << 3);} |
|
21.10.2015, 16:59 | #70 |
Пользователь
Регистрация: 29.07.2015
Регион: 64
Машина: VW Tiguan
Сообщений: 89
|
|
Здесь присутствуют: 3 (пользователей: 0 , гостей: 3) | |
|
|