Показано с 1 по 7 из 7
  1. #1
    Новичок
    Регистрация
    31.05.2010
    Возраст
    37
    Сообщений
    8
    Вес репутации
    173

    По умолчанию Ввод переменных через Serial

    Здравствуйте. Подскажите как решить следующую проблему. Есть три переменных, public,int, имена a, b, c (для примера.) Требуется: При старте ардуинки, в терминал должно выводиться "Vvedi A". И ожидать ввода. Ввели А, нажали ENTER, потом "Vvedi B". И ожидать ввода.. Когда все три переменных будут заполнены, программа должна выполнять другие действия,(например моргать диодом с длительностью a) и не запрашивать больше ввода, до ресета. Сейчас не могу привести то, что написал, но у меня или забивает весь экран "Vvedi A", либо ждет, как положено, но принимает только первый байт.
    Последний раз редактировалось Mosh; 19.03.2012 в 12:25.

  2. #2
    Продвинутый
    Регистрация
    15.12.2008
    Возраст
    38
    Сообщений
    229
    Вес репутации
    393

    По умолчанию Re: Ввод переменных через Serial

    Я бы как-то так сделал:
    PHP код:
    int abc;
    byte count=0;
    void setup(void)
    {
      
    Serial.begin(9600);
      
    Serial.println("Vvedi A");
    }

    void loop(void)

      
    byte i
      if (
    Serial.available() > 0)
      { 
        
    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)
      {
        
    //моргаем диодом или еще что-то делаем
      
    }


  3. #3
    Новичок
    Регистрация
    31.05.2010
    Возраст
    37
    Сообщений
    8
    Вес репутации
    173

    По умолчанию Re: Ввод переменных через Serial

    Спасибо, попробую. У меня более красивый код, с подпрограммами, вечером выложу. Может поможете его поправить..

  4. #4
    Новичок
    Регистрация
    31.05.2010
    Возраст
    37
    Сообщений
    8
    Вес репутации
    173

    По умолчанию Re: Ввод переменных через Serial

    Починил частично свой код, благодаря manu_245. Но есть проблемы.
    1. Вводимые переменные могут принимать значение от 0 до 32000
    2. Код manu_245, как и моя производная от него, кушает один байт из Serial.read(), а из п.п 1 их может быть до 5 сразу.
    3. На int назначается ASCII код символа, а не он сам.
    Вот мой скретч:
    PHP код:
    int abcset
     
    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(aDEC);
       
    Serial.println();
       
    Serial.print("Prisvoeno B ");
       
    Serial.print(bDEC);
       
    Serial.println();
       
    Serial.print("Prisvoeno C ");
       
    Serial.print(cDEC);
       
    Serial.println();
         
      
    digitalWrite(13HIGH);   // set the LED on
      
    delay(1000);              // wait for a second
      
    digitalWrite(13LOW);    // set the LED off
      
    delay(1000);  
    }


    int readdata()
    {
      
    byte x=0;
      do
       {
        if (
    Serial.available()> 0)
         {
          
    delay (100);
          
    xSerial.read();
         }
       }while(
    x==0);
       
    return 
    x;

    Пробовал через массив char, примерно так,
    PHP код:
    int readdata()
    {
    char="{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

    но он ловит один символ, а потом остальные, и вообще не пойми как работает. Хотя у меня на него были большие надежды ))
    Последний раз редактировалось Mosh; 20.03.2012 в 02:32.

  5. #5
    Продвинутый
    Регистрация
    15.12.2008
    Возраст
    38
    Сообщений
    229
    Вес репутации
    393

    По умолчанию 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;

    Последний раз редактировалось manu_245; 20.03.2012 в 20:59.

  6. #6
    Новичок
    Регистрация
    31.05.2010
    Возраст
    37
    Сообщений
    8
    Вес репутации
    173

    По умолчанию Re: Ввод переменных через Serial

    А у меня неправильно. Проскакивает его и все.. Ничего не запрашивает, не ждет (

  7. #7
    Новичок
    Регистрация
    31.05.2010
    Возраст
    37
    Сообщений
    8
    Вес репутации
    173

    По умолчанию 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;

    Последний раз редактировалось Mosh; 25.03.2012 в 17:38.

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •