Arduino Yun получает UDP-пакеты, но печатает их с помощью тарабарщины

Arduino Yun настроен на прием UDP-пакетов. Он получает эти данные с какой-то тарабарщиной.

Как все настроено: Arduino Yun (действует как сервер) подключен через Ethernet к ПК, который (через Wi-Fi) подключен к маршрутизатору. Другой компьютер (выступает в качестве клиента), также подключен к маршрутизатору (через Wi-Fi).

Клиент использует netcat для подключения к Arduino Yun. Я что-то пишу и нажимаю enter. Пакеты принимаются Arduino Yun с какой-то тарабарщиной. Например, я пишу "test" и нажимаю enter, но это то, что я получаю на Arduino Yun:

Иногда символы тарабарщины разные, но всегда существуют. Это то, что отслеживает Wireshark, когда я отправляю "тестовый" пакет (с помощью netcat) на мой Arduino Yun:

Это показывает, что на самом деле я отправляю только "тест", так что тарабарщина создается на стороне Arduino, я полагаю.

Это мой набросок (не весь код, но важная часть):

void loop() {
  int udp_received = Udp.parsePacket();
  if (udp_received) {
    char udp_buffer[16];
    udp_buffer[15] = '\0';
    Udp.read(udp_buffer, 15);
    Serial.println(udp_buffer);
  }
}

Я использую BridgeUdp.h Любые идеи приветствуются.

, 👍2

Обсуждение

udp_received - количество полученных символов. (и хороший прогресс со времени предыдущего вопроса), @Juraj

udp_buffer[udp_received ] = '\0'; вы отправляете только 5 или 6 символов "test \r \ n". остальное - это случайное содержимое памяти, @Juraj

Если я не ошибаюсь, UDP-пакеты при печати в виде строк могут выглядеть как тарабарщина, потому что они имеют формат не ASCII, а двоичный. Вам нужно будет проверить документацию и выяснить, каков формат пакета, или, при отсутствии документации, вам нужно будет попытаться получить некоторое представление о том, что на самом деле представляют данные., @S. Imp

Спасибо, Юрай, я медленно продвигаюсь вперед. но неуклонно. Итак, вы говорите, что я читаю больше байтов, чем получаю на самом деле?, @BrainTrance

@S.Imp, если вы отправляете "тест", вы получаете "тест", @Juraj

ты больше ничего не читаешь. функция заполняет только столько байтов, сколько получено. остальная часть буфера - это неинициализированная память., @Juraj

@Juraj, если вы посмотрите на его [скриншот wireshark] (https://i.stack.imgur.com/vEc3Y.jpg ), вы увидите, что полученный UDP-пакет составляет 47 байт. "тест", вероятно, составляет всего четыре байта. Так что ему нужно вычислить еще 43 байта., @S. Imp

@S.Чертенок, это конверт, @Juraj


2 ответа


1

Вы получаете небольшой пакет, состоящий примерно из 5 или 6 символов (в зависимости от окончания вашей строки). Это принимается в 16-байтовый буфер, содержимое которого неизвестно. Таким образом, первые 5 или 6 байт массива содержат в себе действительные данные. Остальное - это то, что уже было там.

Вам нужно использовать возвращаемое значение Udp.parsePacket(), чтобы сообщить вам, сколько байтов в вашем буфере на самом деле являются действительными полученными байтами, и печатать только их.

Самый простой способ:

Serial.write(udp_buffer, udp_received);
,

int udp_received = Udp.parsePacket(); if (udp_received) { символ udp_buffer[udp_received]; Udp.read(udp_buffer, udp_received); Serial.write(udp_buffer, udp_received); Это то, что вы имеете в виду?, @BrainTrance

Звучит примерно так, @Majenko

Это работает не так, как ожидалось. Он печатает только первый символ каждой строки. Например, если я отправлю "тест", ВВЕДИТЕ, "тест", ВВЕДИТЕ", "привет", ВВЕДИТЕ, последовательный монитор напечатает "tth"., @BrainTrance

Возможно, на самом деле это возвращаемое значение из Udp.read(). Я раньше не использовал Yun для UDP..., @Majenko

И размер пакета всегда печатается как 1, это странно, @BrainTrance


1

Вы отправляете только 5 или 6 символов "test \r \ n". остальное - это случайное содержимое памяти.

Возвращаемым значением parsePacket должно быть количество полученных символов, но реализация в BridgeUdp неверна и всегда возвращает 1 при успешном завершении.

Вы можете использовать BridgeUdp.available(), чтобы получить количество.

void loop() {
  if (Udp.parsePacket()) {
    int udp_received = Udp.available();
    char udp_buffer[16];
    Udp.read(udp_buffer, udp_received);
    udp_buffer[udp_received] = '\0';
    Serial.println(udp_buffer);
  }
}
,