Serial Отправка/чтение
- Войдите на сайт для отправки комментариев
Доброго времени! Чего я хочу добиться!
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
}
Спасибо!
Это вопрос, или просто написали, что добились?
Это вопрос, или просто написали, что добились?
Ну конечно вопрос! Задача думаю, простая. Но у меня третий день что-то ни как не получается.
добавьте в скетч строку Serial.println(val); чтобы увидеть что приходит от устройства.
скорее всего проблема в том, что у вас переменная типа int а вам нужен тип char.
а что за "команда вида #1P2000" ? компилятор это не поймет.
От устройства приходит символ точка в одну строку (точки следуют одна за другой).Смотрел терминалом с помощью usb-uart. В каком виде мне сравнивать этот символ в моем скетче? Я так понимаю, что ардуино и устройство не могут понять друг друга из за разных типов данных.
Какие нафиг типы? Для Serial кроме byte (char) ничего не существует.
Serial.println('Q'); // напечатал букву delay(10); // подождал if (Serial.available()) // А что там есть? { val = Serial.read(); // прочитал } while (val != '.') // А вот тут мы ждем у моря погоды { Serial.println('Q'); // И срем буквами delay(10); // И ждем }Либо проходим мимо, либо впадаем в бесконечный цикл.
так у него val переменная типа int, и он сравнивает char с int. не помню точно при каких раскладах оно корректно сработает, при каких нет.
Да пофиг на типы, там в теле while переменная вообще никак не меняется.
Вот тут я код приводил: http://arduino.ru/forum/programmirovanie/neponyatnoe-povedenie-arduino#comment-88633
В нём если я шлю в ардуино #W то мне прилетают в ответ одни данные, если шлю #T то ардуино на этот запрос отправляет другие данные. Всё нужное для этого находится в куске:
082//****************READ*COM*PORT*************************************083if(Serial.available()>1)084{085uint8_t inByte =Serial.read();086if(inByte=='#')087{088inByte =Serial.read();089if(inByte=='W')090{091delay_ms(100);092Serial.print("{\"sensor_data\":{");//Открываем тег для API [мгновенные значения датчиков]093delay_ms(1);094//=====DTH=HOME=======095Serial.print("\"th\":");096delay_ms(1);097Serial.print(dthHome.temperature, 1);098Serial.print(",");099delay_ms(1);100Serial.print("\"hh\":");101delay_ms(1);102Serial.print(dthHome.humidity, 1);103Serial.print(",");104//=====DTH=STREET=====105delay_ms(1);106Serial.print("\"ts\":");107delay_ms(1);108Serial.print(dthStreet.temperature, 1);109Serial.print(",");110delay_ms(1);111Serial.print("\"hs\":");112delay_ms(1);113Serial.print(dthStreet.humidity, 1);114Serial.print(",");115//=====t window=====116delay_ms(1);117Serial.print("\"tw\":");118Serial.print(tw);119Serial.print(",");120//=====t balcon=====121delay_ms(1);122Serial.print("\"tb\":");123Serial.print(tb);124Serial.print("}}");//Закрываем тег для API [мгновенные значения датчиков]125}126//========== Мгновенные значения ==========================127128//========== Усреднённые значения для БД ==================129if(inByte=='T')130{131delay_ms(100);132Serial.print("th_s: ");//133Serial.print(th_s);//ДОМ ТЕМПЕРАТУРА среднее134delay_ms(1);135Serial.print(" hh_s: ");//136Serial.print(hh_s);//ДОМ ВЛАЖНОСТЬ среднее137delay_ms(1);138Serial.print(" ts_s: ");//139Serial.print(ts_s);//УЛИЦА ТЕМПЕРАТУРА среднее140delay_ms(1);141Serial.print(" hs_s: ");//142Serial.print(hs_s);//УЛИЦА ВЛАЖНОСТЬ среднее143delay_ms(1);144Serial.print(" tw_s: ");//145Serial.print(tw_s);//Temperature window Температура трубы окна СРЕДНЕЕ146delay_ms(1);147Serial.print(" tb_s: ");//148Serial.print(tb_s);//Temperature balcony Температуры трубы балкона СРЕДНЕЕ149}150//========== Усреднённые значения для БД ==================151152}153}155//****************READ*COM*PORT************************************Возьмите его за основу, доработайте под свои нужды, заменив delay_ms(); на delay();
Народ! Всем по плюсу и СПАСИБО!
Но сегодня растормозился и все заработало. Сделал так:
char d=0;
Serial.println('Q');
delay(10);
while(d != '.')
{
if (Serial.available()>0) d=Serial.read();
}