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 Любые идеи приветствуются.
@BrainTrance, 👍2
Обсуждение2 ответа
Вы получаете небольшой пакет, состоящий примерно из 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
Вы отправляете только 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);
}
}
- Как получить HTTPS на Arduino?
- Последовательная связь между ESP8266 и Arduino Uno
- Клиент MQTT на Arduino + SIM900
- Как связаться с датчиком через порты RX/TX Arduino?
- Программирование Arduino Micro через RX/TX
- Serial Comm. проблема синхронизации между Arduino и Pyserial
- Двоичный в десятичный с использованием побитовых операторов
- Arduino считывает состояние подключения устройства hc-05
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