Arduino отправляет значения HEX через XBee

Я пытаюсь отправить значения HEX через XBee с Arduino на программу XCTU от Digi Xbee. Но у меня проблемы с некоторыми байтами, которые я не могу отправить

Список байтов, которые я не могу отправить: 0x11 0x13 0x7D 0x7E 0x81 0xEC 0xEE

Если я использую любые другие байты, я увижу их в окне консоли XCTU и получу ответ на Arduino.

Я включил режим API (AP=1) на обоих Xbee. Я использую библиотеку XBee, связанную с веб-сайтом Arduino (https://www.arduino.cc/en/Reference/Libraries) Мой код выглядит так:

#define XBEE_RX_PIN 8
#define XBEE_TX_PIN 9
SoftwareSerial xbeeSerial(XBEE_RX_PIN, XBEE_TX_PIN);

void setup()
{
    Serial.begin(9600);
    xbeeSerial.begin(9600);
    xbee.begin(xbeeSerial);

}

void loop()
{
    Serial.println("Send next 255 msg:");
    uint8_t testMsg[1] = { 0x0 };
    for (uint8_t i = 0; i <= 0xFF; i++)
    {
        test2[0] = i;
        Tx16Request testTx = Tx16Request(0xFFFF, testMsg, sizeof(testMsg));

        xbee.send(testTx);
        Serial.print("Message send: ");
        Serial.println(test2[0], HEX);

        if (xbee.readPacket(5000)) {      
            Serial.println("SUCCESS");
        }
        else if (xbee.getResponse().isError()) {
            Serial.println("isError");
        }
        else {
            Serial.println("No Response");
        }
    }
    Serial.println("");
    delay(3000);
}

person Rene Nielsen    schedule 28.08.2016    source источник


Ответы (1)



При AP=1 вы не можете отправлять некоторые специальные байты, например:

  • 0x7E (начало кадра)
  • 0x11/0x13 (XВкл. XВыкл.)
  • ...

Как указано в документации XBee (XBee®XBee-PRO® ZB RF Modules manual 90000976_W.pdf, начальная страница 112), вы должны использовать режим AP=2, который позволяет вам передавать эти специальные байты, экранируя их:

Escape-символы.
При отправке или получении фрейма данных UART определенные значения данных должны быть экранированы (помечены), чтобы они не мешали последовательности фрейма данных.
Чтобы экранировать мешающий байт данных, вставьте 0x7D и следуйте за ним с байтом, который должен быть экранирован XOR с 0x20.
Обратите внимание, что если не экранированы, 0x11 и 0x13 отправляются как есть.

Байты данных, которые необходимо экранировать:
- 0x7E – разделитель кадров
- 0x7D – Escape
- 0x11 – XON
- 0x13 – XOFF

Пример – необработанный фрейм данных UART (до экранирования мешающих байтов):
 – 0x7E 0x00 0x02 0x23 0x11 0xCB
0x11 необходимо escaped, что приводит к следующему кадру:
- 0x7E 0x00 0x02 0x23 0x7D 0x31 0xCB
Примечание. В приведенном выше примере длина необработанных данных (исключая контрольную сумму) равна 0x0002. а контрольная сумма неэкранированных данных (исключая разделитель кадров и длину) равна рассчитывается как:
0xFF - (0x23 + 0x11) = (0xFF - 0x34) = 0xCB.

Надеюсь это поможет

person Olivier.OV 'Witekio'    schedule 29.08.2016