Доброго времени суток! Давно мучаюсь с Xbee S2 передатчиками. Решил тут поменять прошивки и заодно, может быть, как-то более тонко настроить. Решил поискать примеры в интернете. Нашел вот этот: https://www.loveelectronics.co.uk/Tutorials/7/xbee-tutorial-how-to-set-up-your-xbees Тут прошивают через X-CTU, но используют не ZNET протокол, как на Вики, а родной ZEGBEE. Можно ли такие, как в этом магазине (не PRO-шки, а обычные), прошивать на ZEGBEE прошивки? И будет ли какой-нибудь от этого выигрыш? Вообще, проблема такая: Есть машинка, на ней XBee. Второй XBee к компу, на компе програмка на C#. При медленном управлении, то есть команды посылаются редко, машинка более менее слушается, но стоит чуть ускориться в отправке команд, то машинка зависает на последней команде и последующая команда доходит с заметным опозданием. Думал, что косяк в коде какой-нибудь, и даже написал второй, который тупо считывает и тут же выполняет команду. Ничего не изменилось. Может быть нужно что-то специально указывать в настройках COM порта в проекте C#? Вот код упрощенной программы: Код (Text): #include <AFMotor.h> AF_DCMotor lbort(1); AF_DCMotor rbort(3); int dir = 0; int mode = 1; int spd = 170; void move(int direct) { switch(direct) { case 0: //Стоп lbort.run(RELEASE); rbort.run(RELEASE); break; case 1: //Вперед lbort.run(FORWARD); rbort.run(FORWARD); break; case 2: //Назад lbort.run(BACKWARD); rbort.run(BACKWARD); break; case 3: //Влево lbort.run(BACKWARD); rbort.run(FORWARD); break; case 4: //Вправо lbort.run(FORWARD); rbort.run(BACKWARD); break; } } void setspeed(int spd) { if (spd > -1) { lbort.setSpeed(spd); rbort.setSpeed(spd); } } void beep(char signal){ analogWrite(10, signal); delay(50); analogWrite(10, 0); delay(50); } void receivedata() { char uid[0]; char value[10]; char addr[0]; if (Serial.available()) { uid[0] = Serial.read(); int i = 0; delay(50); int a = 0; while (Serial.available() && i < 5) { if ((a == 0) && (uid[0] == 'e')) { addr[0] = Serial.read(); a = 1; } value[i++] = Serial.read(); } switch (uid[0]) { case 'd': //направление движения if ((mode == 1) || (mode == 2)) { switch (value[0]) { case '0': move(0); break; case '1': move(1); break; case '2': move(2); break; case '3': move(3); break; case '4': move(4); break; } } break; case 'v': if (mode == 1) { spd = atoi(value); setspeed(spd); } break; default: beep(220); break; } uid[0] =*""; for(int i=0;i<11;i++) value[0] =*""; Serial.flush(); } } void setup() { setspeed(spd); move(0); Serial.begin(19200); delay(50); //ready } void loop() { receivedata(); delay(100); }
После неродной прошивки, очень радуешься, если закорачивание ресета помогло и модуль снова откликается и даёт себя прошить нормальной прошивкой.
У меня и с родной ZNET прошивкой такое бывает, причем часто. Приходится колдовать с восстановлением прошивки. Зависает все обычно на этапе перезагрузки модуля
Функция receivedata() имеет право быть? Или чушь? Есть еще XBee.h какая-то. Не будет ли через нее лучше?