Ви не увійшли.
ardnew пише:код из change #5 у меня не ругается, но и ничего не делает
![]()
и наверное этот код мне не подойдет, так как у меня есть и такие команды как "Watt 1.5", "Watt 2.5" т.е. значения могут быть дробными,
как в таком случае быть ?Вот в этом и проблема что "не делает" а должен. Вопрос не в том дробные не дробные. Надежный парсинг буфера Serial как бы по своей сути прост. Прост в том случае когда вы точно знаете что получаете ( и красота если вы можете внести изменения в передачу то есть поставить какие то символы для удобства разделения например символьных величин от числовых). В данном случае как понимать допустим 2.5 символьное или флот. Но поскольку вы указываете в кавычках следовательно мы рассматриваем строку. Мой код и код NoName читает строку из буфера Serial тут вопросов нет, только по разному происходит чтение у меня байты читаются в другой буфер, массив char[] выглядит примерно это так ['R','e','l','a','y',' ','1'], дальше идет преобразование массива в строковую переменную, ну и потом сравнение. NoName сомневается в надежности такого подхода и предлагает читать сразу в строку добавлением каждого поступившего символа к имеющей уже строке, одновременно проводить контроль по длине строки ( в целесообразности чего я сомневаюсь). Такой способ тоже очень распространен и есть масса примеров. В том коде от NoName есть какая то проблемка, и как я понял в моем, и проблема эта может быть в спецсимволах которые Serial компьютера посылает в конце строки, типа перевод каретки, конец строки. Ни в терминале ардуино ни гипертерминале вы их не увидите. Почему я спросил какая Arduino у Вас. Если допустим Atmega2560, то у нее есть 4 Serial порта тогда можно написать скетч монитор и "пощупать" именно байтики которые приходят с компьютера.
отладку делаю в протеусе, вижу все что передаю и принимаю, этот код меня устраивает полостью:
char input[20];
void loop()
{
if (Serial.available() > 0)
{
Serial.readBytes( input, 20 );
String str= (String) input;
if (str == "Rele 1") digitalWrite(led11, HIGH);
if (str == "Rele 2"') digitalWrite(led12, HIGH);
if (str == "Rele 3") digitalWrite(led13, HIGH);
}
}
но, читаю вас и думал что, что то в нем не так
1.5 сек ) no comments )
понял так что сказал глупость, а какую ? 1.5 сек. это нормально ?
Nefreemen пише:Странно другое, почему включается "через раз". А включается то которое надо? Или путаются номера?
да, включается именно то реле которое нужно, но, бывает 2-4 раза включается без проблем, а бывает нужно 2-3 раза дать команду.
и еще заметил, с не большой задержкой команды проходят, примерно 1.5 секунды, хотелось бы побыстрее
ardnew, а какая у Вас Arduino?
Arduino у меня Mega 2560
Ну это просто, там где включаете реле, допишите выключение остальных.
Примерно так:
if (inputString == "Rele 1"){
digitalWrite(pin1, HIGH);
digitalWrite(pin2, LOW);
digitalWrite(pin3, LOW);
...............................
digitalWrite(pin8, LOW);
}
нет, ну так то я могу, но слишком много строк получается, хотелось бы как то по изящнее
Странно другое, почему включается "через раз". А включается то которое надо? Или путаются номера?
да, включается именно то реле которое нужно, но, бывает 2-4 раза включается без проблем, а бывает нужно 2-3 раза дать команду.
код из change #5 у меня не ругается, но и ничего не делает
и наверное этот код мне не подойдет, так как у меня есть и такие команды как "Watt 1.5", "Watt 2.5" т.е. значения могут быть дробными,
как в таком случае быть ?
а в этом варианте ( if (x == 1) digitalWrite(led11, HIGH); ) что хотите то и пишите )
мы сейчас http://forum.arduino.ua/viewtopic.php?pid=2404#p2404 этот код обсуждаем
если честно, не въехал, может на примере покажите ?
это просто см change 5
добавлен лог выполнения
если правильно понял..
вот это работает четко if (x == 1) digitalWrite(led11, HIGH);
если с терминала даю один байт, типа 1, 2, или 3, но у меня текстовая строка, и вот в этом вся проблема
Nefreemen, самое смешное что ardnew уже получил что нужно и тему не читает )
читаю, и очень внимательно !
и получил как бы не совсем то, вернее то, но реле как то включаются через раз
какую либо статистику не собрать
и еще, никак не могу сообразить, у меня 8 реле, нужно сделать так что бы по сигналу включалось только одно реле, а остальные выключались,
например, пришел сигнал "Rele 2" включилось реле 2, пришел сигнал "Rele 5" включилось бы реле 5, а реле 2 выключилось,
короче, всегда может быть включено только одно реле из восьми.
может где то так
точно! так работает! спасибо большое за помощь !
вы делаете вычитку по байту
и байт сравниваете со строкой
Вам нужно читать строки
https://www.arduino.cc/en/Serial/ReadString
либо самому собирать строкунесколько вариантов в ответах
http://stackoverflow.com/questions/1119 … on-arduino
по последней ссылке нашел похожий пример, ну что то опять не хочет работать, что опять не так делаю ?
int x;
String str;
void setup(){
Serial.begin(9600);
}
if (Serial.available() > 0)
{
str = Serial.readStringUntil('\n');
x = Serial.parseInt();
if (x == 'Rele 1') digitalWrite(led11, HIGH);
if (x == 'Rele 2') digitalWrite(led12, HIGH);
if (x == 'Rele 3') digitalWrite(led13, HIGH);
}
помогите пожалуйста, с компьютера на ардуино поступают команды в таком виде: "Rele 1", "Rele 2", "Rele 3" (изменить их нельзя)
написал такой код:
if (Serial.available() > 0)
{
char str = Serial.read();
if (str == 'Rele 1') digitalWrite(led11, HIGH);
if (str == 'Rele 2') digitalWrite(led12, HIGH);
if (str == 'Rele 3') digitalWrite(led13, HIGH);
}
но не работает, что делаю не так ?
заранее признателен за помощь !