Помощь с кодом. BMW IBUS.
- Войдите на сайт для отправки комментариев
Пнд, 05/03/2018 - 15:54
Всем привет.
Нужно научиться считывать обороты двигателя.
Сообщения приходит в виде массива байтов.
Для обнаружения сообщений известен адрес отправителя, длина пакета и контрольная сумма. XX YY ZZ ** CK, где
XX -отправитель,
YY - длина,
ZZ - получатель,
** - тело сообщения,
CK - контрольная сумма xor8.
Со статическими сообщением все более-менее ясно.
А тут обороты меняются, соответственно меняется тело и контрольная сумма.
Для отслеживания нужного сообщения надо указать, как я понимаю,
Отправителя, длину, получателя и алгоритм подсчёта контрольной суммы.
Вот это и не могу осилить, в программировании я пока полный ноль.
Помогите освоить, и очень бы хотелось с пояснениями.
Так же есть вопросы по преобразованию типов данных.
Крайне содержательно, спасибо.
А что вы хотели? Вот вы пишете:
//хрустальный шар подсказывает, что вы используете К-лайн адаптер для получения сообщений от автомобиля //подключаем его к софтсериал соединению (пин 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; // очистим массив }//конец чтения из буфера }Огромное спасибо!!!! Это именно так, как я хотел. Вопросы глупые можно вам задавать?
пжалста, только почитайте сначала тему про бортовой комп опель зафира, там многое уже разжёвано, сделано