ZigBee Arduino, неправильный анализ данных

У меня возникли проблемы с налаживанием связи между двумя Arduino Uno.

Arduino1‹>ZigBee >---------- ‹ ZigBee ‹ > Arduino2

Сейчас я пытаюсь заставить их понять друг друга. В настоящее время сообщение хорошо передается между 1-м Arduino и его Zigbee, а затем и вторым Zigbee.

Arduino1‹>ZigBee>----------‹ ZigBee--X-- Arduino2

Проблема в том, что когда я пытаюсь разобрать на Arduino2 полезную нагрузку входящего пакета от Arduino1, сообщения отличаются.

Поскольку я использую ZigBee API2, в сообщении есть CRC при перемещении между ZigBee, поэтому (после некоторых расследований) я уверен, что пакет правильный, когда он прибыл на ZigBee2 (если нет, пакет отбрасывается).

Итак, главное событие сейчас:

memmove(received,xbee_Rx.getData(),24);

Когда я получаю пакет

xbee.readPacket();
if (xbee.getResponse().isAvailable())
{
  if (xbee.getResponse().getApiId() == ZB_RX_RESPONSE)
    {
        xbee.getResponse().getZBRxResponse(xbee_Rx);
        memmove(received,xbee_Rx.getData(),24);
        for (int i = 0; i < 24; i++) {       
          Serial.print(received[i],HEX);
        }
    }
}

Пока я отправляю это «4144000000000000446B3AB4083E8484258» в HEX на Arduino1

Я получил это «414400000000000008C201862419B5» в HEX на Arduino2

Это пример, данные всегда неверны (кроме, может быть, двух первых байтов). Результат какой-то случайный и непригодный для меня.

Я также пытался разобрать с

for (int i = 0; i < 24; i++) {
    received[i] = xbee_Rx.getData()[i];
    Serial.print(received[i],HEX);
  }

но результат был примерно таким же.

Итак, мой вопрос: я делаю синтаксический анализ неправильно? Есть ли проблема с функцией getData()?

Спасибо :-)

РЕДАКТИРОВАТЬ: после некоторых исследований я обнаружил, что если я это сделаю

   for (int i = 0; i < sizeof(xbee_Rx.getData()); i++) {  
    Serial.print(xbee_Rx.getData()[i],HEX);
  }
        Serial.println();
  for (int i = 0; i < sizeof(received); i++) {     
    Serial.print(received[i],HEX);
  }

данные не совпадают.

414400000000000008C201885358C80
414400000000000008C201862419E6

вместо 4144000000000000441A6E9B407DDD494258

Итак, я думаю, пока я читаю, данные меняются, и, возможно, поэтому они испортились. Итак, есть ли способ «заморозить» данные, прежде чем я их прочитаю?


person Venix    schedule 01.04.2015    source источник
comment
как вы отправляете данные?   -  person eventHandler    schedule 01.04.2015
comment
С xbee.send(TXRequest); на Arduino1 (использует ту же библиотеку, что и Xbee-Arduino); Когда я регистрирую пакеты с помощью XCTU, данные верны, поэтому проблема явно заключается в анализе на Arduino2.   -  person Venix    schedule 02.04.2015
comment
Вы делаете это неправильно, должен быть только один вызов getResponse(). У вас сейчас несколько звонков, так что да, данные будут меняться. Вам нужно написать XBeeResponse response = xbee.getResponse();, а затем использовать response в коде синтаксического анализа.   -  person Hans Passant    schedule 02.04.2015
comment
@HansPassant, похоже, он правильно использует xbee.getResponse(), судя по документации.   -  person tomlogic    schedule 02.04.2015
comment
@HansPassant Я пытался, но технически я не должен использовать XBeeResponse в соответствии с документацией библиотеки. И xbee.getResponse() должен изменяться только после выполнения другого xbee.readPacket(). Таким образом, это не должно меняться, и, поскольку Arduino является однопоточным, ничего не должно его менять. Вот почему я немного потерялся здесь   -  person Venix    schedule 02.04.2015


Ответы (1)


Наконец-то я понял, что происходит: я использую NewSoftSerial (потому что одного Serial явно недостаточно), и он, кажется, испортит таймеры (длительный тайм-аут), и на самом деле я использовал либо библиотеку TimerOne, либо «Thread.h». "библиотека, которая позволяет мне использовать прерывание.

Ну, все это явно испортил тайм-аут на NSS, так что будьте осторожны, если вы будете использовать их вместе в будущем. Мне пришлось переключиться с TimerOne на Thread.h (который, конечно, не был настоящими потоками), что позволило мне избежать проблем.

Я также обнаружил, что обычный Serial, который идет в комплекте с Arduino, также плохо работает с таймером.

Так что спасибо за попытку помочь мне, но я думал, что проблема была не в этом.

Веникс

person Venix    schedule 02.04.2015