Serial Отправка/чтение

Pioneer_Lab
Offline
Зарегистрирован: 23.11.2014

Доброго времени! Чего я хочу добиться!

1) Отправить с Arduino в Serial #1P300 на устройство

2) Спросить у устройства выполнело ли оно команду? (Отправив в порт символ "Q"). Если команда выполнена устройство вернет символ "." Если нет "+". Если вернуло "+" продолжаю проверку до выполнения команды устройством (Посылаю в порт "Q") Как только устройство выполнело команду (вернуло ".") Перейти к выполнению следующей команды вида #1P2000

int val;                          

void setup()
{
  Serial.begin(9600);              
}

void veri()
{
  Serial.println('Q');
  delay(10);
  if (Serial.available())
  {        
   val = Serial.read();
  }    
    while (val != '.')
    {               
      Serial.println('Q');
      delay(10);
    }
 
}

void loop()
{
  Serial.println("#1P300");
  veri();

#1P2000
}

Спасибо!

Sirocco
Offline
Зарегистрирован: 28.09.2013

Это вопрос, или просто написали, что добились?

 

Pioneer_Lab
Offline
Зарегистрирован: 23.11.2014

Sirocco пишет:

Это вопрос, или просто написали, что добились?

Ну конечно вопрос! Задача думаю, простая. Но у меня третий день что-то ни как не получается.

 

 

Maverik
Offline
Зарегистрирован: 12.09.2012

добавьте в скетч строку Serial.println(val);   чтобы увидеть что приходит от устройства.  

скорее всего проблема в том, что у вас переменная типа int а вам нужен тип char. 

а что за "команда вида #1P2000" ? компилятор это не поймет.

Pioneer_Lab
Offline
Зарегистрирован: 23.11.2014

От устройства приходит символ точка в одну строку (точки следуют одна за другой).Смотрел терминалом с помощью usb-uart. В каком виде мне сравнивать этот символ в моем скетче? Я так понимаю, что ардуино и устройство не могут понять друг друга из за разных типов данных.

Radjah
Offline
Зарегистрирован: 06.08.2014

Какие нафиг типы? Для Serial кроме byte (char) ничего не существует.

Serial.println('Q'); // напечатал букву
  delay(10);  // подождал
  if (Serial.available())  // А что там есть?
  {        
   val = Serial.read(); // прочитал
  }    
    while (val != '.')   // А вот тут мы ждем у моря погоды
    {               
      Serial.println('Q'); // И срем буквами
      delay(10); // И ждем
    }

Либо проходим мимо, либо впадаем в бесконечный цикл.

Maverik
Offline
Зарегистрирован: 12.09.2012

так у него val переменная типа int, и он сравнивает  char с  int.  не помню точно при каких раскладах оно корректно сработает, при каких нет.

Radjah
Offline
Зарегистрирован: 06.08.2014

Да пофиг на типы, там в теле while переменная вообще никак не меняется.

Sirocco
Offline
Зарегистрирован: 28.09.2013

Вот тут я код приводил: http://arduino.ru/forum/programmirovanie/neponyatnoe-povedenie-arduino#comment-88633

В нём если я шлю в ардуино #W то мне прилетают в ответ одни данные, если шлю #T то ардуино на этот запрос отправляет другие данные. Всё нужное для этого находится в куске:

 

082 //****************READ*COM*PORT*************************************
083     if (Serial.available()>1)
084     {  
085        uint8_t inByte = Serial.read();  
086         if(inByte=='#')
087          {
088           inByte = Serial.read();
089           if(inByte=='W')
090           {
091            delay_ms(100);
092             Serial.print("{\"sensor_data\":{");  //Открываем тег для API [мгновенные значения датчиков]
093             delay_ms(1);
094             //=====DTH=HOME=======
095             Serial.print("\"th\":");
096             delay_ms(1);
097             Serial.print(dthHome.temperature, 1);
098             Serial.print(",");
099             delay_ms(1);
100             Serial.print("\"hh\":");
101             delay_ms(1);
102             Serial.print(dthHome.humidity, 1);
103             Serial.print(",");
104             //=====DTH=STREET=====
105             delay_ms(1);
106             Serial.print("\"ts\":");
107             delay_ms(1);
108             Serial.print(dthStreet.temperature, 1);
109             Serial.print(",");
110             delay_ms(1);
111             Serial.print("\"hs\":");
112             delay_ms(1);
113             Serial.print(dthStreet.humidity, 1);
114             Serial.print(",");
115             //=====t window===== 
116             delay_ms(1);         
117             Serial.print("\"tw\":");
118             Serial.print(tw);
119             Serial.print(",");
120             //=====t balcon=====
121             delay_ms(1);          
122             Serial.print("\"tb\":");
123             Serial.print(tb);
124             Serial.print("}}");        //Закрываем тег для API [мгновенные значения датчиков]
125             }
126 //========== Мгновенные значения ==========================
127  
128 //========== Усреднённые значения для БД ==================
129           if(inByte=='T')
130           {
131            delay_ms(100);
132             Serial.print("th_s: ");       //
133             Serial.print(th_s);          //ДОМ ТЕМПЕРАТУРА среднее
134             delay_ms(1);
135             Serial.print(" hh_s: ");      //
136             Serial.print(hh_s);          //ДОМ ВЛАЖНОСТЬ среднее
137             delay_ms(1);
138             Serial.print(" ts_s: ");      //
139             Serial.print(ts_s);          //УЛИЦА ТЕМПЕРАТУРА среднее
140             delay_ms(1);
141             Serial.print(" hs_s: ");      //
142             Serial.print(hs_s);          //УЛИЦА ВЛАЖНОСТЬ среднее
143             delay_ms(1);
144             Serial.print(" tw_s: ");      //
145             Serial.print(tw_s);          //Temperature window Температура трубы окна СРЕДНЕЕ
146             delay_ms(1);
147             Serial.print(" tb_s: ");        //
148             Serial.print(tb_s);          //Temperature balcony Температуры трубы балкона СРЕДНЕЕ
149           }
150 //========== Усреднённые значения для БД ==================
151          
152           }
153      }
 
155

//****************READ*COM*PORT************************************

Возьмите его за основу, доработайте под свои нужды, заменив delay_ms(); на delay();

Pioneer_Lab
Offline
Зарегистрирован: 23.11.2014

Народ! Всем по плюсу и СПАСИБО!

Но сегодня растормозился и все заработало. Сделал так:

char d=0;
  Serial.println('Q');
  delay(10);   
   
      while(d != '.')
      {
         if (Serial.available()>0) d=Serial.read();
      }