Показано с 1 по 10 из 200

Тема: BMW I-Bus K-Bus

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #11
    Пользователь
    Регистрация
    25.10.2010
    Сообщений
    33
    Вес репутации
    173

    По умолчанию Re: BMW I-Bus K-Bus

    Цитата Сообщение от delach Посмотреть сообщение
    Можешь код выложить?
    Код:
    #include <SoftwareSerial.h>
    //#include <NewSoftSerial.h>
    #include <MsTimer2.h>
    
    
    #define DELAY_ON 1000 //delay before switch-on event
    #define DELAY_OFF 10000 //delay before switch-off event
    #define DELAY_SWITCH 0 //delay before switch event
    #define RELAY_PORT 9
    #define POWER_5V_PIN 5
    #define IGN_LED 13
    
    #define RX_PIN 4
    #define TX_PIN 3
    //NewSoftSerial IBUS(RX_PIN, TX_PIN);
    SoftwareSerial IBUS(RX_PIN, TX_PIN, true);
    
    struct pktTemplate {
      unsigned char src;
      unsigned char dst;
      unsigned char msglen;
      unsigned char msg[256];
    };
    
    #define RAD 	0x68 	//Radio
    #define IKE 	0x80 	//Instrument cluster electronics
    #define GLO 	0xBF 	//Global, broadcast address
    #define BMBT 	0xF0 	//On-board monitor operating part
    
    
    static struct pktTemplate buttonMODETempl = {BMBT, RAD, 2, {0x48, 0x23}}; // BUTTON_MODE_PRESS
    
    int recvPacket(unsigned char *msg, int size) 
    {
      static unsigned char buf[256];
      static int cnt = 0;
      int avail = 0;
      while ((avail = IBUS.available()) > 0) {
      // get the new byte: 
        buf[cnt++] = (unsigned char)IBUS.read();
        Serial.println(buf[cnt-1],HEX); 
    
        // parsing code here
        // return cnt;
          if (cnt > 256) { // VERY BIG PACKAGE. NEED ERASE DATA.
            memmove((void*)&buf[0], (void*)&buf[127], 128);
            cnt = 128;
          }
      }
      
      return 0;
    }
    
    void setup() {
      pinMode(POWER_5V_PIN, OUTPUT); // initialize +5V power pin for adapter
      pinMode(RELAY_PORT, OUTPUT); // initialize +5V power pin for relay
      digitalWrite(POWER_5V_PIN, HIGH); // Enable +5V power for adapter
      
      Serial.begin(9600);
      IBUS.begin(9600);
    }
    
    void loop() {
    
      unsigned char msg[256];
      int read;
      if ((read = recvPacket(msg, 256)) > 0) {
    //......  some code
      }  
    }

    Я заметил только во время сборки монитора что некоторые пакеты читаются неправильно. Незнаю как бороться с этим вот вывод от MID
    C0 0D 0E BC E0 42
    C0 0D 8E BE E0 0F
    C0 0D 8E BB E0 FF
    C0 0D 0E BC E0 42
    C0 0D 8E BE E0 0F
    C0 0D 8E BB E0 FF

    Это конечно же полная лажа, должны быть приблизительно такие пакеты:
    C0 03 68 01 AA
    C0 03 80 01 42
    C0 03 C8 01 0A

    Можно конечно парсить заведомо неправильную интерпритацию пакетов, но хотелось бы иначе. Если честно, я даже не знаю что делать с этим. Интересно то, что до этого я тестировал с монитором и его пакеты почти все читаются правильно, а вот любой другой девайс - такая вот шняга.
    Последний раз редактировалось darkduke; 03.04.2012 в 13:30.

Информация о теме

Пользователи, просматривающие эту тему

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

Ваши права

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