А не прощще было сделать так: Код (C++): unsigned char ScalesData [20]; Serial.readBytesUntil(char(13), ScalesData , 20 ); Или я чегото не догоняю? И да: можете пожалуйста описать функцию Serial.readBytesUntil ? Я чета немного в затуплении
Дефайн чтобы не вспоминать, что за число 20 Функция Serial.readBytesUntil входит в стандартные библиотеки Arduino. Описание https://www.arduino.cc/en/Serial/ReadBytesUntil, исходник https://github.com/arduino/Arduino/blob/master/hardware/arduino/avr/cores/arduino/Stream.cpp
Получается все данные находяться в массиве ScalesData? И теперь мне нужно значения этого массива из аски расшифровать - верно? Или т.к. мы использовали char - то у нас и так символ? Переводить ничего не нужно?
Всем привет! Недавно стал разбираться с ардуино нано (сн340). Не знаю где спросить, решил, для начала тут, т.к. название темы похоже... Через USB получается всё. А вот через 232 на материнке - нет (подключаю выходы rx tx прямо к материнке). Как мог читал всякие форумы темы и т.д.. Ничего не нашёл. Через USB заливаю скетч с выводом данных в 232, через тот же USB в мониторе порта всё есть. А через 232 какая то краказябра идёт( Что не так делаю?
Конечно чего! Но т.к. я не суперпро в этом вопросе, потому сюда и пишу.. Она то жива, пока что.. Вы уж помогите ей, а заодно и мне, если не сложно) Как правильно подключаться к COM порту компа? Или это не предусмотрено? А ещё что значит "разный логический уровень"? Я то думал RS232 он и в африке, а оказалось у них ещё и некие разные логические уровни... Думал 232 отличается от 485... (предполагаю, что RX-TX-GND это всего лишь одинаковые названия в 232 и УАРТе). Понимаю, что в ваших глазах это всё выглядит примерно как "ну и дибил", но хотелось бы услышать минимальные пояснения - всё легко понимаю) И сразу же дополнительный вопрос: если я возьму некий конвертор УАРТ-485 (уже понял, что не 232-485), то смогу видеть, что происходит в шине 485 охранно-пожарной сигнализации? Заранее спасибо)
А вот цитатка из вики: Видите, какие уровни? При том что у ардуиновского UART логический 0 - это всё, что ниже 2В примерно (надо в даташите точнее смотреть), логическая единица - всё что выше 2,5В (опять же, примерно, но суть понятна). Для сопряжения устройств с разными логическими уровнями есть специальные микросхемы-преобразователи уровней, например, MAX232 - https://ru.wikipedia.org/wiki/MAX232
Тока я чето недогнал немного... От куда будут приходить байты? Вот что написал... Код (C++): #define MaxScalesPacket 20 unsigned char ScalesData [MaxScalesPacket ]; #include <LiquidCrystal.h> // Лобавляем необходимую библиотеку LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // (RS, E, DB4, DB5, DB6, DB7) void setup() { Serial.begin(4800); } void loop() { Serial.readBytesUntil(char(13), ScalesData , MaxScalesPacket ); for (int i=0; i<8; i++) { Serial.print(ScalesData[i]); lcd.begin(16, 2); // Задаем размерность экрана lcd.setCursor(0, 0); // Устанавливаем курсор в начало 1 строки lcd.print(ScalesData[i]); // Выводим текст } }
По-моему, отправлять информацию обратно в весы бессмысленно (- строка Serial.print(ScalesData). Если надо передавать информацию дальше или SoftwareSerial или микроконтроллер с несколькими UART. Код (C++): #define MaxScalesPacket 20 #include <LiquidCrystal.h> // Лобавляем необходимую библиотеку unsigned char ScalesData [MaxScalesPacket ]; LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // (RS, E, DB4, DB5, DB6, DB7) void setup() { Serial.begin(4800); //Задаем скорость обмена данными с весами lcd.begin(16, 2); // Задаем размерность экрана } void loop() { if (Serial.available()) { Serial.readBytesUntil(char(13), ScalesData , MaxScalesPacket ); for (int i=7; i<19; i++) { lcd.setCursor(0, 0); // Устанавливаем курсор в начало 1 строки lcd.print(ScalesData[i]); // Выводим вес и единицу измерения } } else { lcd.setCursor(0, 0); // Устанавливаем курсор в начало 1 строки lcd.print("Waiting..."); // Выводим текст } }
В инициализации UART добавить настройку Код (C++): Serial.begin(4800, SERIAL_7E1); //Задаем скорость обмена данными с весами На ПК в терминальной программе смотрели, что отдают весы?