У меня возникли проблемы с установлением связи между двумя Arduinos Uno для работы.
Arduino1<> ZigBee> ———- < ZigBee < > Arduino2
Я сейчас пытаюсь заставить их понять друг друга. Сообщение в настоящее время идет хорошо от 1-го Arduino к его Zigbee, а затем ко второму Zigbee.
Arduino1<> ZigBee> ———-< ZigBee — X— Arduino2
Проблема: Когда я пытаюсь проанализировать на Arduino2 полезную нагрузку входящего пакета от Arduino1, сообщения отличаются.
Поскольку я использую ZigBee API2, во время путешествия между ZigBees имеется сообщение CRC, поэтому (после некоторых исследований) я уверен, что пакет верен в том месте, где он поступает на 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);
}
но результат был примерно таким же.
Итак, мой вопрос: я делаю разбор неправильно? Есть ли проблема с получить данные() функционировать?
Спасибо 🙂
РЕДАКТИРОВАТЬ:
после некоторых исследований я обнаружил, что если я делаю
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
Итак, я думаю, что в то время как я читаю, данные меняются, и, возможно, поэтому они набирают данные. Так есть ли способ «заморозить» данные, прежде чем я их прочитаю?
Я наконец нашел то, что продолжалось:
Я использую NewSoftSerial (потому что одного Serial явно недостаточно), и кажется, что f ** ck up timers (long timeout) и я фактически использовал либо библиотеку TimerOne, либо библиотеку «Thread.h», чтобы разрешить мне использовать прерывание.
Ну, все это было явно испорчено тайм-аутом на NSS, так что будьте осторожны, если вы будете использовать их вместе в будущем. Мне пришлось переключиться с TimerOne на Thread.h (который, конечно, не был реальным потоком), что позволило мне избежать проблем.
Я также обнаружил, что обычный Serial, тот, что в комплекте с Arduino, неплохо играет с вещами с таймером.
Так что спасибо за попытку помочь мне, но на самом деле я не думал, в чем проблема.
Venix