Помощь с кодом. BMW IBUS.

MaxuBo
Offline
Зарегистрирован: 14.02.2018
Всем привет. 
Нужно научиться считывать обороты двигателя.
Сообщения приходит в виде массива байтов.
Для обнаружения сообщений известен адрес отправителя, длина пакета и контрольная сумма. XX YY ZZ ** CK, где 
XX -отправитель, 
YY - длина,
ZZ - получатель,
** - тело сообщения,
CK - контрольная сумма xor8.
Со статическими сообщением все более-менее ясно. 
 
А тут обороты меняются, соответственно меняется тело и контрольная сумма.
 
Для отслеживания нужного сообщения надо указать, как я понимаю, 
Отправителя, длину, получателя и алгоритм подсчёта контрольной суммы. 
Вот это и не могу осилить, в программировании я пока полный ноль. 
Помогите освоить, и очень бы хотелось с пояснениями.
Так же есть вопросы по преобразованию типов данных.
 
 
DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

MaxuBo пишет:

Нужно научиться считывать обороты двигателя.
 
 
Да. Нужно. 
MaxuBo
Offline
Зарегистрирован: 14.02.2018

DetSimen пишет:

Да. Нужно. 

Крайне содержательно, спасибо.

b707
Offline
Зарегистрирован: 26.05.2017

MaxuBo пишет:
DetSimen пишет:

Да. Нужно. 

Крайне содержательно, спасибо.

А что вы хотели? Вот вы пишете:

>>Для отслеживания нужного сообщения надо указать, как я понимаю, 
>>Отправителя, длину, получателя и алгоритм подсчёта контрольной суммы. 
 
И откуда вы предлагаете нам взять "Отправителя, длину, получателя..." - ? Для этого нужно подробное описание протокола обмена. Вы не на форуме мотористов БМВ...
 
Кроме того, вы не указали также - чем и откуда вы вообще собираетесь это читать.
MaksVV
Offline
Зарегистрирован: 06.08.2015
 //хрустальный шар подсказывает, что вы используете К-лайн адаптер для получения сообщений от автомобиля
 //подключаем его к софтсериал соединению  (пин 10-Rx и 11-Tx)
 #include <SoftwareSerial.h>
 SoftwareSerial mySerial   (10, 11); //RХ,TХ

 
byte MessageRx[60];    // массив, куда будет записываться принятое сообщение 
unsigned int rpm = 0;  // переменная, куда будут записываться обороты 

void setup() {

 mySerial.begin(9600);  // инит сериал соединения К-лайн
  Serial.begin(9600);   // инит сериал соединения для вывода в сериал-монитор компа 

}

void loop() {

if (mySerial.available()) { //если в приёмном буфере есть непрочитанные байты 
   delay(150);              // подождем, пока придёт всё сообщение
   int k=0;                 // счетчик байтов сообщения
   
   while( mySerial.available() && k < 60) {
   MessageRx[k] = mySerial.read(); //если прилетают байты, пишем в массив
   k++;                            // каждый раз прибавляя счетчик номера байта на +1
   }

// ниже распречатаем в терминал принятое сообщение от авто и обороты за одно:
   Serial.print ("Receive:   ");
   for (int i = 0; i < k; i++) {Serial.print(MessageRx[i],HEX); Serial.print (" ");} 
   Serial.println ("");


//ниже проверяем сообщение по байтам 
if (MessageRx[0]==тут байт адреса отправителя && MessageRx[2]==тут байт адреса получателя){//если это наше сообщение 

   rpm = MessageRx[тут номер байта, где лежат обороты, хотя должны в двух байтах лежать по идее]; //запишем обороты в переменную
   
   Serial.print ("RPM = "); Serial.println (rpm);  // распечатаем в терминал

                                                                                          }// конец парсинга сообешения 


 for (int i = 0; i < 60; i++) MessageRx[i]=0; // очистим массив


                          }//конец чтения из буфера


}

 

MaxuBo
Offline
Зарегистрирован: 14.02.2018

MaksVV пишет:

Огромное спасибо!!!! Это именно так, как я хотел. Вопросы глупые можно вам задавать?

MaksVV
Offline
Зарегистрирован: 06.08.2015

пжалста, только почитайте сначала тему про бортовой комп опель зафира, там многое уже разжёвано, сделано