Ввод переменных через Serial
Здравствуйте. Подскажите как решить следующую проблему. Есть три переменных, public,int, имена a, b, c (для примера.) Требуется: При старте ардуинки, в терминал должно выводиться "Vvedi A". И ожидать ввода. Ввели А, нажали ENTER, потом "Vvedi B". И ожидать ввода.. Когда все три переменных будут заполнены, программа должна выполнять другие действия,(например моргать диодом с длительностью a) и не запрашивать больше ввода, до ресета. Сейчас не могу привести то, что написал, но у меня или забивает весь экран "Vvedi A", либо ждет, как положено, но принимает только первый байт. :(
Re: Ввод переменных через Serial
Я бы как-то так сделал:
PHP код:
int a, b, c;
byte count=0;
void setup(void)
{
Serial.begin(9600);
Serial.println("Vvedi A");
}
void loop(void)
{
byte i;
if (Serial.available() > 0)
{
i = Serial.read();
switch(count)
{
case 0:
a=i;
count++;
Serial.println("Vvedi B");
break;
case 1:
b=i;
count++;
Serial.println("Vvedi C");
break;
case 2:
c=i;
count++;
Serial.write(a);//для проверки записи
Serial.write(b);//для проверки записи
Serial.write(c);//для проверки записи
break;
}
}
if(count>2)
{
//моргаем диодом или еще что-то делаем
}
}
Re: Ввод переменных через Serial
Спасибо, попробую. У меня более красивый код, с подпрограммами, вечером выложу. Может поможете его поправить..
Re: Ввод переменных через Serial
Починил частично свой код, благодаря manu_245. Но есть проблемы.
1. Вводимые переменные могут принимать значение от 0 до 32000
2. Код manu_245, как и моя производная от него, кушает один байт из Serial.read(), а из п.п 1 их может быть до 5 сразу.
3. На int назначается ASCII код символа, а не он сам.
Вот мой скретч:
PHP код:
int a, b, c, set;
void setup(void)
{
Serial.begin(9600);
pinMode(13,OUTPUT);
}
void loop(void)
{
if(set==0) //ЕСЛИ SET не равен 1, то считываем переменные
{ Serial.println("Vvedi A");
a=readdata(); // назначаем а значение из функции readdata()
Serial.println("Vvedi B");
b=readdata();
Serial.println("Vvedi C");
c=readdata();
set=1; // Запрещаем более считывать переменные, и начинаем выполнять дальнейший код
}
Serial.print("Prisvoeno A ");
Serial.print(a, DEC);
Serial.println();
Serial.print("Prisvoeno B ");
Serial.print(b, DEC);
Serial.println();
Serial.print("Prisvoeno C ");
Serial.print(c, DEC);
Serial.println();
digitalWrite(13, HIGH); // set the LED on
delay(1000); // wait for a second
digitalWrite(13, LOW); // set the LED off
delay(1000);
}
int readdata()
{
byte x=0;
do
{
if (Serial.available()> 0)
{
delay (100);
x= Serial.read();
}
}while(x==0);
return x;
}
Пробовал через массив char, примерно так,
PHP код:
int readdata()
{
char* a ="{aaaaa}";
int i=0;
do
{
while(Serial.available())
{
a[i] = Serial.read();
i++;
}
}while(a[i] != '\0'); //Выполнять, пока не попадется ENTER
//}while(atoi(a)== 0); //Так тоже пробовал :(
//a[i] = '\0';
Serial.print("Prinyato");
Serial.println(atoi(a),DEC); //переводим char в int и печатаем для теста
return atoi(a); // Возвращаем значение функции, переводим char в int
}
но он ловит один символ, а потом остальные, и вообще не пойми как работает. Хотя у меня на него были большие надежды :)))
Re: Ввод переменных через Serial
вот как вариант. работает вроде правильно.
PHP код:
int readdata()
{
int bytes=0;
int i=0;
char data[5];
int x[5];
int y[5];
int result=0;
bytes=Serial.available();//считаем сколько байт
if(bytes!=0)
{
result=0;
for(i=0;i<bytes;i++)
{
data[i]=Serial.read();
x[i]=data[i]-48;//из ascii в dec
y[i]=x[bytes-1-i];//разворачиваем. удобнее для возведения в степень.или иначе следующий код
}
for(i=bytes-1;i>=0;i--)
{
result=result+y[i]*pow(10.0,i);//считаем значение
}
Serial.print(result);//проверка преобразования
bytes=0;//обнуляем счетчик
}
return result;
}
Re: Ввод переменных через Serial
:( А у меня неправильно. Проскакивает его и все.. Ничего не запрашивает, не ждет :((
Re: Ввод переменных через Serial
Подумал, и написал.. Скромненько и компактно. Изменненая функция readdata() для моего кода выше. Пожалуйста пользуйте, кому нужно.
PHP код:
int readdata() //Эта функция возвращает начение переменной в int, введенной в Serialmonitor
{
byte getByte;
int outByte=0;
do
{
while(Serial.available()!=0)
{
getByte=Serial.read()-48; // Вычитаем из принятого символа 48 для преобразования из ASCII в int
outByte=(outByte*10)+getByte; //Сдвигаем outByte на 1 разряд влево, и прибавляем getByte
delay(500);// Чуть ждем для получения следующего байта из буфера (Чем больше скорость COM, тем меньше ставим задержку. 500 для скорости 9600, и приема 5-значных чисел)
}
}while (outByte==0); //Зацикливаем функцию для получения всего числа
Serial.flush(); //Вычищаем буфер (не обязательно)
return outByte;
}