Отправка шестнадцатеричных данных последовательно и получение их обратно

Ниже приведен мой код. Я хочу отправить шестнадцатеричные данные последовательно на какое-нибудь устройство и также ожидать ответа. Я хочу видеть ответ в шестнадцатеричной форме на последовательном мониторе. Любой комментарий будет оценен по достоинству. Спасибо.

const byte numChars = 88;
word receivedChars[numChars]; // массив для хранения полученных данных
boolean newData = false;

void setup() {
  Serial.begin(9600);
  Serial.println("<Arduino is ready>");
}

void loop() {
  uint8_t message[] = {0xA5, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x0d };
  Serial.write(message, sizeof(message));
  delay(500);
}

void recvWithEndMarker() {
  static byte ndx = 0;
  char endMarker = '\n';
  word rc;
  while (Serial.available() > 0 && newData == false) {
    rc = Serial.read();
    if (rc != endMarker) {
      receivedChars[ndx] = rc;
      ndx++;
      if (ndx >= numChars) {
        ndx = numChars - 1;
      }
    } else {
      receivedChars[ndx] = '\0'; // завершает строку
      ndx = 0;
      newData = true;
    }
  }
}

void showNewData() {
  if (newData == true) {
    Serial.print("data ");
    Serial.println(receivedChars);
    newData = false;
  }
}

Ошибка, которую я получаю, заключается в том, что вызов перегруженного println(word [88]) неоднозначен. Спасибо вам за помощь.

, 👍0

Обсуждение

Класс print не знает, как напечатать массив из 88 байт. Вам нужно напечатать каждый байт по отдельности по очереди в форме, которую вы можете понять (является ли ответ ASCII? Если нет, то вам нужно будет отобразить его в виде чисел в той или иной форме)., @Majenko

данные передаются не в шестнадцатеричном формате, а в байтах. ... hex предназначен только для человеческой читабельности байтов. .... 0xA5 и 165 - это совершенно одно и то же, @jsotola

Замените "слово" → "символ"., @Edgar Bonet

while (Serial.available() > 0 && newData == false) и Serial.begin(9600); вы всегда получали один байт (восьмибитная временная задержка обязательна)!, @dsgdfg


1 ответ


0

Вот ваш исправленный код: если вы хотите отправлять числа, закодированные в виде шестнадцатеричных строк, это именно то, что вам нужно сделать с обоих концов. Стандартная функция itoa() преобразует числа в их строковое представление, но, работая таким образом, вы тратите много ресурсов, потому что для отправки числа 1 (что может быть выполнено путем отправки ровно одного байта) вы отправляете строку 0x01 (для передачи которой теперь требуется 4 байта).

const byte numChars = 88;
word receivedChars[numChars];   // массив для хранения полученных данных

boolean newData = false;

void setup() {
    Serial.begin(9600);
    Serial.println("<Arduino is ready>");
}

void loop() {   
    uint8_t message[] = {0xA5, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x0d };

    char buf[4];
    for (uint8_t i = 0; i < sizeof(message); i++) {
        itoa(message[i], buf, 16));
        Serial.write(buf, sizeof(buf));
    }
    delay(500);

    recvWithEndMarker();
    showNewData();
}

#define END_MARKER '\n'
void recvWithEndMarker() {
    static byte ndx = 0;
    char rc;

    while (Serial.available() > 0 && !newData) {
        rc = Serial.read();

        if (rc != END_MARKER) {
            receivedChars[ndx++] = rc;
            if (ndx >= numChars) {
                ndx = numChars - 1;
            }
        } else {
            receivedChars[ndx] = '\0'; // завершение строки
            ndx = 0;
            newData = true;
        }
    }
}

void showNewData() {
    if (newData) {
        Serial.print("data ");
            for (unsigned int i = 0; i < numChars; i++) {
            Serial.print(receivedChars[i], HEX);
        }
        Serial.println();
        newData = false;
    }
}
,

Спасибо всем вам, ребята, Роберто, код, который вы исправили, показывает ? вместо 0x... каждого байта есть какое-либо решение для этого., @Ali khan

Это только часть " 0x`? Все ли остальные части обмена данными верны?, @Roberto Lo Giacco

только часть 0x, и у меня также есть еще одна проблема: когда я перемещаю регулятор громкости, я не получаю никаких данных последовательно, пока они не достигнут примерно 95 процентов после дальнейшего перемещения, я получаю данные. Я хочу получать данные при каждом движении позиции, @Ali khan

О каком _волюмном узле_ вы говорите?!?, @Roberto Lo Giacco