Последовательный монитор Arduino IDE — как отправлять ЦИФРЫ, а не символы чисел

Последовательная ссылка отправляет и получает байты. Серийный монитор в Arduino IDE считывает ввод как символ.

Поэтому, если я наберу '0' в последовательном мониторе, то FW прочитает байт 48 - я не хочу реализовывать какой-то глупый перевод из символьного значения в целое - я хочу ввести ЧИСЛО как байт в последовательный монитор - как это сделать? Я делаю это?

byte inByte = Serial.read(); // читаем входящий байт
if(inByte == 1) // делаем что-то

, 👍0

Обсуждение

используйте программу последовательного терминала, такую как PuTTY... или напишите скетч терминала в Processing, который делает то, что вы хотите, @jsotola

Последовательный монитор Arduino IDE обрабатывает только символы, нет возможности отправить *любой* байт, который вам нравится., @the busybee

На самом деле не имеет значения, чего вы хотите. У вас ошибочное впечатление, что когда вы отправляете строку (например: 3.14159265358), вы отправляете число. Но ты ошибаешься. Следовательно, вам придется «реализовать какой-нибудь глупый перевод символьного значения в int» или научиться использовать доступные вам инструменты, чтобы сделать это за вас., @Seamus

В Linux вы можете xxd -r -p > /dev/ttyACM0, а затем просто введите hex в терминале., @Edgar Bonet

вместо того, чтобы узнавать код ascii 49, вы можете просто написать if(inByte == '1') // сделать что-то, @DataFiddler

все они строки, у вас нет сильных типов по сравнению с серийными., @dandavis

@DataFiddler, что если я хочу отправить код со значением 10 или 17 - вместо отправки одного байта я должен отправить два байта., @Tomáš Viks Pilný

Я предлагал поставить под сомнение задачу, которую вы хотите выполнить. Вам не нужны «глупые переводы», если вы хотите распознавать отдельные байты. Я признаю, что это сложно (хорошо. НЕВОЗМОЖНО) со всеми 256 потенциальными значениями байтов. Но легко распознать все байты, которые SerialMonitor может отправить, без «глупых переводов»., @DataFiddler

@DataFiddler хм, даже в этом случае вы ограничиваете **все** общение только одним байтом. Без поплавков, без строк и т.д., @Sim Son


2 ответа


Лучший ответ:

1

Судя по комментариям к вопросу, похоже, никто не знает ответа.

Итак, краткий ответ: ЭТО НЕВОЗМОЖНО — использовать последовательный монитор Arduino IDE для отправки необработанных данных.

@Edgar_Bonet представил подсказку для пользователей Linux

@jsotola предложил использовать PuTTY, но не дал дополнительной информации о том, как это сделать. Беглый взгляд на настройки, и я не смог найти способ добиться необработанного ввода.

Погуглив немного, я нашел чтение, где нашел программу под названием RealTerm, который выполняет свою работу.

Просто настройте порт на карте Порт и нажмите кнопку Изменить.

На карточке Отображать измените Отображать как с ASCII на предпочтительный формат, например Hex (пробел)

Затем включите карточку "Отправить" - введите свой номер в поле ввода слева от кнопки Отправить номера и нажмите эту кнопку

Это все

Поле ввода принимает десятичное значение от 0 до 255 или шестнадцатеричное значение с префиксом "0x" или "$". Каждое значение отделяется пробелом.

Следующая строка принимается правильно: "255 0xff 0xFF $ff $FF"

Еще одним полезным инструментом является монитор последовательного порта. Благодаря этому вы можете наблюдать за тем, что на самом деле передается в режиме онлайн, не полагаясь на интерпретацию вашего приложения.

Использование очень простое: щелкните значок белого файла или Сеанс > Новый сеанс или нажмите Ctrl+Н

Выберите порт и визуализатор и нажмите Начать мониторинг... вот и все.

Я нашел наиболее полезным режим "Просмотр дампа"

,

2

Я думаю, что комментарии к вашему вопросу вполне ясны. Важный момент: любой асинхронный протокол должен включать информацию либо о том, сколько передано байтов, либо о том, какой байт является последним. В «необработанных данных», где каждое значение (0-255) может быть действительным значением данных, нет возможности использовать байты для метаданных. Вот почему обычно передаются только закодированные данные: у вас есть небольшой диапазон байтовых значений, которые могут содержать фактическую информацию (алфавит и цифры), и у вас есть набор значений, которые можно использовать в качестве метаданных. Например, обычно используемый \n в качестве конечного байта имеет значение int 10. Как бы вы передали значение int 10 в этом случае?

"Я не хочу реализовывать какой-то глупый перевод символьного значения в целое число" - это не глупо, это правильный путь! Как насчет чисел с плавающей запятой, логических или отрицательных значений (8-битных, 16-битных и т. д.)? Вы даже можете захотеть передавать структурированные данные, такие как словари Python. Единственный способ добиться этого — использовать парсер, который знает протокол.

,

Еще один странный, но распространенный «протокол» — это тайм-аут, например, используемый в Arduino Stream::readString()., @DataFiddler

Я думаю, вы полностью упускаете мою мысль - меня не волнует передача персонажей. Я создаю свой протокол связи с командами, передачей данных, ответами и т.д. И если по какой-либо причине я хочу в каком-то месте интерпретировать значение байта как символ, нет проблем реализовать это в моем протоколе. Я просто хочу отладить часть своего протокола и ввести необработанную команду. Я храню свои команды как Enumeration, я только начал, и их уже больше 10, поэтому обращаться с ними как с символами, безусловно, не стоит., @Tomáš Viks Pilný