Последовательный монитор Arduino IDE — как отправлять ЦИФРЫ, а не символы чисел
Последовательная ссылка отправляет и получает байты. Серийный монитор в Arduino IDE считывает ввод как символ.
Поэтому, если я наберу '0' в последовательном мониторе, то FW прочитает байт 48 - я не хочу реализовывать какой-то глупый перевод из символьного значения в целое - я хочу ввести ЧИСЛО как байт в последовательный монитор - как это сделать? Я делаю это?
byte inByte = Serial.read(); // читаем входящий байт
if(inByte == 1) // делаем что-то
2 ответа
Лучший ответ:
Судя по комментариям к вопросу, похоже, никто не знает ответа.
Итак, краткий ответ: ЭТО НЕВОЗМОЖНО — использовать последовательный монитор Arduino IDE для отправки необработанных данных.
@Edgar_Bonet представил подсказку для пользователей Linux
@jsotola предложил использовать PuTTY, но не дал дополнительной информации о том, как это сделать. Беглый взгляд на настройки, и я не смог найти способ добиться необработанного ввода.
Погуглив немного, я нашел чтение, где нашел программу под названием RealTerm, который выполняет свою работу.
Просто настройте порт на карте Порт и нажмите кнопку Изменить.
На карточке Отображать измените Отображать как с ASCII на предпочтительный формат, например Hex (пробел)
Затем включите карточку "Отправить" - введите свой номер в поле ввода слева от кнопки Отправить номера и нажмите эту кнопку
Это все
Поле ввода принимает десятичное значение от 0 до 255 или шестнадцатеричное значение с префиксом "0x" или "$". Каждое значение отделяется пробелом.
Следующая строка принимается правильно: "255 0xff 0xFF $ff $FF"
Еще одним полезным инструментом является монитор последовательного порта. Благодаря этому вы можете наблюдать за тем, что на самом деле передается в режиме онлайн, не полагаясь на интерпретацию вашего приложения.
Использование очень простое: щелкните значок белого файла или Сеанс > Новый сеанс или нажмите Ctrl+Н
Выберите порт и визуализатор и нажмите Начать мониторинг... вот и все.
Я нашел наиболее полезным режим "Просмотр дампа"
Я думаю, что комментарии к вашему вопросу вполне ясны. Важный момент: любой асинхронный протокол должен включать информацию либо о том, сколько передано байтов, либо о том, какой байт является последним. В «необработанных данных», где каждое значение (0-255) может быть действительным значением данных, нет возможности использовать байты для метаданных. Вот почему обычно передаются только закодированные данные: у вас есть небольшой диапазон байтовых значений, которые могут содержать фактическую информацию (алфавит и цифры), и у вас есть набор значений, которые можно использовать в качестве метаданных. Например, обычно используемый \n
в качестве конечного байта имеет значение int 10. Как бы вы передали значение int 10 в этом случае?
"Я не хочу реализовывать какой-то глупый перевод символьного значения в целое число" - это не глупо, это правильный путь! Как насчет чисел с плавающей запятой, логических или отрицательных значений (8-битных, 16-битных и т. д.)? Вы даже можете захотеть передавать структурированные данные, такие как словари Python. Единственный способ добиться этого — использовать парсер, который знает протокол.
Еще один странный, но распространенный «протокол» — это тайм-аут, например, используемый в Arduino Stream::readString()
., @DataFiddler
Я думаю, вы полностью упускаете мою мысль - меня не волнует передача персонажей. Я создаю свой протокол связи с командами, передачей данных, ответами и т.д. И если по какой-либо причине я хочу в каком-то месте интерпретировать значение байта как символ, нет проблем реализовать это в моем протоколе. Я просто хочу отладить часть своего протокола и ввести необработанную команду. Я храню свои команды как Enumeration, я только начал, и их уже больше 10, поэтому обращаться с ними как с символами, безусловно, не стоит., @Tomáš Viks Pilný
- "Автономный" последовательный монитор
- Окно Последовательного монитора открывается зависшим
- Как разделить входящую строку?
- Как вывести несколько переменных в строке?
- В чем разница между Serial.write и Serial.print? И когда они используются?
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Программы построения последовательных данных
- Как узнать частоту дискретизации?
используйте программу последовательного терминала, такую как 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