Доброго времени суток. Решил научиться управлять Arduino с помощью ПК, и насколько мне стало понятно язык Processing лучше всего для этого подходит. Помогите, пожалуйста, осуществить проект. Теперь немного о сути проекта. Допустим, у меня есть вот такая палитра цветов HSV (приложена ниже). Я хочу сделать так, чтобы при каждом клике на ней, RGB светодиод зажигался соответствующим цветом. Собрал вот такую схему (приложена ниже). Код Арудино: Код (Text): #define redPin 9 #define greenPin 11 #define bluePin 10 void setup() { Serial.begin(9600); pinMode(redPin, OUTPUT); pinMode(bluePin, OUTPUT); pinMode(greenPin, OUTPUT); } void loop() { int rval = 200, gval = 30, bval = 80; while (Serial.available() > 0) { rval = Serial.parseInt(); gval = Serial.parseInt(); bval = Serial.parseInt(); if (Serial.read() == '\n') { analogWrite(redPin, rval); analogWrite(greenPin, gval); analogWrite(bluePin, bval); } } } Код на Processing: Код (Text): import processing.serial.*; PImage img; Serial port; void setup () { size(640,256); img = loadImage("hsv.jpg"); port = new Serial(this, "COM4", 9600); } void draw() { background(0); image(img, 0, 0); } void mosePressed() { color c = get(mouseX, mouseY); String colors = int(red(c))+","+int(green(c))+","+int(blue(c))+"\n"; print(colors); port.write(colors); } Вопросов несколько: 1. В чем ошибка и как ее исправить? 2. Почему, когда я ввожу в Мониторе порта Arduino, например, "123,20,30" (без кавычек) и нажимаю Enter, if-ветка не обслуживается? Попытался разобраться, как исправить проблему. Дело оказалось в том, что в таком случае Serial.read() == -1. Почему не '\n'?
Скорее всего парсер съедает перевод строки. Попробуйте поставить пробел после "30" и посмотрите что вернет Serial.read()
Это зависит от настроек монитора порта. Только '\n' в конце строки будет только если в мониторе порта справа внизу выбрана опция «Новая строка»
Код (Text): while (Serial.available() > 0) { rval = Serial.parseInt(); gval = Serial.parseInt(); bval = Serial.parseInt(); if (Serial.read() == '\n') { analogWrite(redPin, rval); analogWrite(greenPin, gval); analogWrite(bluePin, bval); } } Вопрос к знатокам. Разве не нужно перед каждым вызовом Serial.parseInt() или Serial.read() ждать while (Serial.available() > 0) пока появятся данные в принимающем буфере?
Необязательно. Насколько я помню, при попытке считывания из последовательного порта в случае, когда в буфере ничего не наблюдается, функция завершается, возвращая соответствующее значение. При этом read возвращает -1, а parseInt ждет время, заданное в setTimeout и если не дожидается ничего, возвращает 0.