![]() |
Помогите ещё чутка.
есть бит в котором 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 |
Ты путаешь биты и байты.
Бит может быть 0 или 1. 2 быть не может. Сдвиг осуществляется побитно, а не побайтно. Хотя код выглядит логично, о каких 22222 речь совершенно не понятно |
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 |
Цитата:
Res := 01000111 AND 00111111, а результат Res = 00000111 проверял на нужные вам цифры 3, 7... И учитывая что последние два бита не несут нужной вам информации или вы не знаете что они означают, я бы их убрал сложением с маской 00111100 с соответствующим перерасчетом цифр 3, 7... |
Цитата:
Где x не используемые биты y бит состояния меню И z содержание меню. |
Цитата:
И почему моё смещение не приводит к такому результату? По сути я хочу первые 5 бит переместить в начало обнулив последним 3 Мне кажется что при смещении какой-то мусор прилетает. Может сначала спаять с байтом забитым нулями, а потом сместить? Только хочется это по компактнее расписать, а не с кучей строк и условий. |
Цитата:
if (bitRead(buf[6],6) == 1){AP = 7; APV = 0; AM = (unsigned char)(buf[6] << 3);} Цитата:
|
Извиняюсь, ввел в заблуждение.:huh2: В данном случае buf[6]^=1<<6 будет отрабатывать как надо, так как стоит проверка if (bitRead(buf[6],6) == 1).
|
Цитата:
Вечером попробую сделать вот так 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);} |
Цитата:
|
Часовой пояс GMT +4, время: 09:36. |
Работает на vBulletin® версия 3.8.4.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot