PCCar.ru - Ваш автомобильный компьютер

Вернуться   PCCar.ru - Ваш автомобильный компьютер > MP3Car ТехИнфа > Общение с машиной

Ответ
 
Опции темы Поиск в этой теме
Старый 20.10.2015, 23:34   #61
T_r_D
Старший Пользователь
 
Регистрация: 03.07.2015
Регион: 77, 97, 99, 177
Сообщений: 372
T_r_D is a jewel in the roughT_r_D is a jewel in the roughT_r_D is a jewel in the rough
По умолчанию

Помогите ещё чутка.
есть бит в котором
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
T_r_D вне форума   Ответить с цитированием
Старый 20.10.2015, 23:53   #62
autowp
Пользователь
 
Аватар для autowp
 
Регистрация: 13.12.2012
Возраст: 40
Город: Москва
Регион: 77, 97, 99, 177
Машина: Peugeot 407 Coupe
Сообщений: 82
autowp is on a distinguished road
По умолчанию

Ты путаешь биты и байты.
Бит может быть 0 или 1. 2 быть не может.

Сдвиг осуществляется побитно, а не побайтно.

Хотя код выглядит логично, о каких 22222 речь совершенно не понятно
autowp вне форума   Ответить с цитированием
Старый 21.10.2015, 01:36   #63
lti1
Старший Пользователь
 
Аватар для lti1
 
Регистрация: 17.01.2010
Возраст: 48
Город: Самара
Регион: 63, 163
Машина: Skoda Octavia A5 FL && Skoda Octavia Tour && ̶F̶F̶3̶
Сообщений: 457
lti1 has a reputation beyond reputelti1 has a reputation beyond reputelti1 has a reputation beyond reputelti1 has a reputation beyond reputelti1 has a reputation beyond reputelti1 has a reputation beyond reputelti1 has a reputation beyond reputelti1 has a reputation beyond reputelti1 has a reputation beyond repute
По умолчанию

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
lti1 вне форума   Ответить с цитированием
Старый 21.10.2015, 09:59   #64
GASCHE
Старший Пользователь
 
Аватар для GASCHE
 
Регистрация: 01.04.2010
Регион: 35
Сообщений: 697
GASCHE is on a distinguished road
По умолчанию

Цитата:
Сообщение от T_r_D Посмотреть сообщение
Помогите ещё чутка... 01000111
Я бы побитно сложил ваш байт и маску 00111111
Res := 01000111 AND 00111111, а результат Res = 00000111 проверял на нужные вам цифры 3, 7... И учитывая что последние два бита не несут нужной вам информации или вы не знаете что они означают, я бы их убрал сложением с маской 00111100 с соответствующим перерасчетом цифр 3, 7...
GASCHE вне форума   Ответить с цитированием
Старый 21.10.2015, 12:12   #65
T_r_D
Старший Пользователь
 
Регистрация: 03.07.2015
Регион: 77, 97, 99, 177
Сообщений: 372
T_r_D is a jewel in the roughT_r_D is a jewel in the roughT_r_D is a jewel in the rough
По умолчанию

Цитата:
Сообщение от autowp Посмотреть сообщение
Ты путаешь биты и байты.
Бит может быть 0 или 1. 2 быть не может.

Сдвиг осуществляется побитно, а не побайтно.

Хотя код выглядит логично, о каких 22222 речь совершенно не понятно
А запись вида xyxzzzzz тебя больше устраивает?
Где x не используемые биты
y бит состояния меню
И z содержание меню.
T_r_D вне форума   Ответить с цитированием
Старый 21.10.2015, 12:27   #66
T_r_D
Старший Пользователь
 
Регистрация: 03.07.2015
Регион: 77, 97, 99, 177
Сообщений: 372
T_r_D is a jewel in the roughT_r_D is a jewel in the roughT_r_D is a jewel in the rough
По умолчанию

Цитата:
Сообщение от lti1 Посмотреть сообщение
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
А что означает buf[6]^=1<<6 ?

И почему моё смещение не приводит к такому результату?
По сути я хочу первые 5 бит переместить в начало обнулив последним 3
Мне кажется что при смещении какой-то мусор прилетает.
Может сначала спаять с байтом забитым нулями, а потом сместить?
Только хочется это по компактнее расписать, а не с кучей строк и условий.
T_r_D вне форума   Ответить с цитированием
Старый 21.10.2015, 13:15   #67
xmetal
Пользователь
 
Регистрация: 29.07.2015
Регион: 64
Машина: VW Tiguan
Сообщений: 89
xmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant future
По умолчанию

Цитата:
Сообщение от T_r_D Посмотреть сообщение
И почему моё смещение не приводит к такому результату?
По сути я хочу первые 5 бит переместить в начало обнулив последним 3
.
Похоже, что при вычислениях все типы по умолчанию приводятся к результирующему типу, а он у тебя int. Поправьте меня, если я не прав. Тогда нужно делать так, если AM нужен int:
if (bitRead(buf[6],6) == 1){AP = 7; APV = 0; AM = (unsigned char)(buf[6] << 3);}
Цитата:
Сообщение от T_r_D Посмотреть сообщение
А что означает buf[6]^=1<<6 ?
1 смещается на 6 бит влево и логически (XOR) побитово складывается с buf[6]. То есть, если биты одинаковые, то результирующий бит будет 0, если разные то 1. Но похоже это не то, что нужно, так как, если в 7 бите buf[6] будет 0, то после этой операции там станет 1 и результат будет опять не тот.
xmetal вне форума   Ответить с цитированием
Старый 21.10.2015, 14:38   #68
xmetal
Пользователь
 
Регистрация: 29.07.2015
Регион: 64
Машина: VW Tiguan
Сообщений: 89
xmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant future
По умолчанию

Извиняюсь, ввел в заблуждение. В данном случае buf[6]^=1<<6 будет отрабатывать как надо, так как стоит проверка if (bitRead(buf[6],6) == 1).
xmetal вне форума   Ответить с цитированием
Старый 21.10.2015, 16:26   #69
T_r_D
Старший Пользователь
 
Регистрация: 03.07.2015
Регион: 77, 97, 99, 177
Сообщений: 372
T_r_D is a jewel in the roughT_r_D is a jewel in the roughT_r_D is a jewel in the rough
По умолчанию

Цитата:
Сообщение от xmetal Посмотреть сообщение
Извиняюсь, ввел в заблуждение. В данном случае 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);}
T_r_D вне форума   Ответить с цитированием
Старый 21.10.2015, 16:59   #70
xmetal
Пользователь
 
Регистрация: 29.07.2015
Регион: 64
Машина: VW Tiguan
Сообщений: 89
xmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant futurexmetal has a brilliant future
По умолчанию

Цитата:
Сообщение от T_r_D Посмотреть сообщение
Вечером попробую сделать вот так
AX = buf[6],0 | buf[6],1 | buf[6],2 | buf[6],3 | buf[6],4;
Что это дает?
xmetal вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.



Часовой пояс GMT +4, время: 03:20.


Работает на vBulletin® версия 3.8.4.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot