Получение странных символов из Arduino

Мой Arduino подключен к ультразвуковому датчику, и я пытаюсь считать с него значение. Когда я попытался запустить «tail -f > /dev/ttyACM0», мой Arduino отправляет какие-то странные символы, которые я не могу расшифровать

, 👍0

Обсуждение

Ты ссти?, @Edgar Bonet

Что это значит? Вы можете объяснить?, @Santhoshkumar Sundararaj

В дополнение к ответам обязательно укажите «Serial.println(sensorValue, DEC)», чтобы убедиться, что он напечатан в десятичном формате, а не в виде отдельных неправильных символов ASCII., @Paul

Вы смотрели, какие данные возвращаются в шестнадцатеричном или двоичном формате? Это может облегчить проверку того, использует ли источник другую страницу набора символов в Юникоде. Графические символы не являются стандартными ASCII. Я видел упоминание об источнике Audi, так что, возможно, набор символов европейский., @Kelly S. French

Другой пост выглядит похоже: (https://arduinoprosto.ru/q/12617/arduino-serial-monitor-shows-strange-ascii-characters?rq=1), и я должен спросить, есть ли у вас какая-либо документация или ссылка на датчик. С такой же вероятностью данные будут отправляться в двоичном формате. Есть ли у вас основания подозревать, что это должны быть значения ASCII?, @Kelly S. French


2 ответа


3

Похоже, вам не удалось настроить порт на стороне Linux. К по умолчанию он настроен на неизвестно какую скорость передачи данных и на «приготовленный» режим, в котором данные предварительно обрабатываются драйвером ядра. Вы хотите вместо этого установите правильную скорость передачи данных и режим «raw». stty (что означает «установить терминал») делает следующее:

stty -F /dev/ttyACM0 raw 9600

Замените 9600 на любую скорость передачи данных, которую использует ваш Arduino.

Если ваша программа Arduino попытается прочитать последовательный порт, она увидит эхо отправляемых символов. В этом случае вы, вероятно, захотите отключите также это эхо:

stty -F /dev/ttyACM0 raw -echo 9600
,

Я сделал это с правильной скоростью передачи данных, но никаких изменений в выводе не произошло., @Santhoshkumar Sundararaj

@SanthoshkumarSundararaj: Возможно, что-то не так с кодом отправки. Попробуйте заменить его чем-нибудь тривиальным, например void setup(){Serial.begin(9600);} voidloop(){Serial.println("Hello!");}., @Edgar Bonet

К сожалению, я не могу изменить код. Я работаю с автономным автомобилем AUDI. Итак, он имеет четыре микроконтроллера Arduino, соединенных с пятью ультразвуковыми датчиками. Моя задача — установить соединение и получить значения от arduino., @Santhoshkumar Sundararaj


0

Скорее всего, это неверная скорость передачи данных. Вы можете попробовать использовать программу, предназначенную для последовательных портов, мой личный выбор - picocom, но можно использовать minicom или любую другую:

$ picocom -b 9600 /dev/ttyACM0

Параметр -b используется для указания скорости передачи данных, в зависимости от скетча это может быть другое значение, кроме 9600, наиболее распространенные: 9600, 14400, 19200, 28800, 38400, 57600

Другое решение — настроить /dev/ttyACM0 на правильную скорость передачи данных с помощью stty:

stty -F /dev/ttyACM0 9600 cs8 -cstopb -parenb

Это настроит последовательный порт на скорость 9600 бит/с, 8 бит, 1 стоповый бит, без четности и позволит команде tail правильно прочитать его, если параметры связи соответствуют тому, что отправляет Arduino.

,

Я пробовал оба, но все равно выдает одни и те же странные символы., @Santhoshkumar Sundararaj