XBee слишком много сыпет

Тема в разделе "Arduino & Shields", создана пользователем Vir, 22 дек 2012.

  1. Vir

    Vir Гик

    Привет.

    До этого подключал XBee, к своей Arduino Mega, так всё было нормально. Подключал XBee напрямую, без всяких шилдов, с помощью четырех контактов (3.3V, GND, RX1, TX1).

    Теперь же, купил Mega Shield, и подключаю через него. Однако столкнулся с тем, что при попытке отослать один ответ на запрос, получаю неограниченное число ответов. Сыпет без перерыва.

    Код основного файла:
    Код (Text):
    #include <dht.h>
     
    unsigned long workTime; // Время работы Arduino с начала старта
    int DHTSensorSelector = 1; // Флаг обозначающий, с какого сенсора DHT будут сниматься данные
     
    void setup()
    {
      Serial.begin(9600);
     
      XBeeModuleInit();
      DHTSensorFirstInit();
      DHTSensorSecondInit();
    }
     
    void loop()
    {
      workTime = millis();
     
      XBeeCommandListener();
     
      if ((workTime % 1000) == 0)
      {
        if (DHTSensorSelector == 1)
        {
          DHTSensorFirstHandler();
          DHTSensorSelector = 2;
        }
        else if (DHTSensorSelector == 2)
        {
          DHTSensorSecondHandler();
          DHTSensorSelector = 1;
        }
      }
    }
    Файл с методами для XBee:

    Код (Text):
    #define TEMPERATURE_FIRST_READ '1'  // Считать температуру с первого датчика
    #define TEMPERATURE_SECOND_READ '2' // Считать температуру со второго датчика
    #define HUMIDITY_FIRST_READ '3' // Считать влажность с первого датчика
    #define HUMIDITY_SECOND_READ '4'    // Считать влажность со второго датчика
     
    char XBeeResponseMsg[128];
     
    void XBeeModuleInit()
    {
      Serial1.begin(9600);
    }
     
    void XBeeCommandListener()
    {
      if (Serial1.available() > 0)
      {
        Serial1.println("Command");
      }
     
      Serial1.flush();
    }
    Фотография с подключнием: [​IMG]

    И видео поведения:

     
  2. nailxx

    nailxx Официальный Нерд Администратор

    Полагаю вы проверять, что что-то есть — проверяете, а считывать — не считываете. И то, что пришло — находится в буфере вечно.

    Если вы думаете, что буфер очищается через метод `flush`, то это не совсем так. `flush` очищал буфер в версиях 0.x, теперь это метод гарантирующию сиюмоментную отправку накопившегося. Вам нужно делать:

    Код (Text):

    while (Serial1.available())
        Serial1.read();
     
     
  3. Vir

    Vir Гик

    Изменил метод на:
    Код (Text):
    void XBeeCommandListener()
    {
      while (Serial1.available())
      {
        int incoming = Serial1.read() - 0;
        Serial1.println(incoming);
      }
    }
    Всё равно сыпет. Правда не понятно что... я отправляю единицу, и обратно возвращаю то, что прислал. Но в итоге, в ответ получаю следующее:
    Код (Text):
    vir@laptop:~/Work/WWW/chehome.local$ app/console arduino:sensor:data:load temperature_first
    49
     
    52
     
    57
     
    13
     
    10
     
    13
     
    10
     
    53
     
    50
     
    13
     
     
    13
     
    10
     
    49
     
    51
     
    13
     
    10
     
    13
     
    10
     
    49
     
    48
     
    13
     
    10
     
    13
     
    10
     
    53
     
    51
     
    13
     
    10
     
    13
     
    10
     
    53
     
    48
     
    Первое число "49", понятно откуда... а вот дальше. Такое впечатление, то что он мне возвращает, то снова он принимает в виде команды =(
     
  4. Vir

    Vir Гик

    Проблема решена перепрошивкой Xbee. Странные вещи творятся...
     
  5. Vir

    Vir Гик

    Наврал. Ничего не прошло =(
     
  6. nailxx

    nailxx Официальный Нерд Администратор

    Что-то не то у вас на стороне PHP. Видно, что из-вне в Serial идут данные. Причём не беспорядочные. Они явно осмысленного происхождения. Из того, что вы привели, я увидел, что на Arduino приходит:

    159
    52
    13
    10
    53


    Узнаёте? А так: 1;4;5…?