проблема в работе с COM портом

a1000
Offline
Зарегистрирован: 06.10.2015

Пробую подружить GSM модуль с ПК.  Модуль подключаю через переходник USB - UART. Пробую создать графический интерфейс с несколькими кнопками, при нажатии на которые GSM модуль должен отправить СМС определённого содержания. В Processing новичёк, как в прочем и в програмировании. Создаю скетч поэтапно. Создал что-то типа кнопки, описал процес нажатия. Прошу громко не ржать - сделал как сумел, красоту буду наводить позже. При попытке написать работу с СОМ портом возникла проблема. По теории при отправке на GSM модуль команды "АТ" он должен ответить "ОК". В гипертерминале всё проходит на ура! И не только опрос модуля, но и звонки и СМС, как входящие так и исходящие. А вот в скетче проблема. Вместо ожидаемого "ОК" в консоли печатает "АТ".  А такой ответ от модуля не должен приходить в принципе. Проверил входящим звонком. Печатает как и положено "RING". Подскажите, где проблема.


import processing.serial.*;
float x = 100, y = 100;
boolean h = true;
int i = 1;
Serial port;  // переменная обозначающая порт

void setup() 
{ 
 size(800, 600); 
 frameRate(30); 
 noStroke();
 port = new Serial(this, "COM1", 9600); // Задаем параметры порта. У меня он первый.
 }

void draw()
{ 
  background(255);  
  if (h) { fill(0, 200, 0); rect(x, y, 100, 100); i=1; } 
  else
  {
   fill(200, 0, 0); rect(x, y, 100, 100);
  
  for (; i <= 1; i++) 
   {
    port.write("AT");         // отправляем копанду в COM-порт. 
    delay (100);
   }
  }
 if (port.available() > 0){  // проверяем есть-ли что на СОМ порту
    println(port.read());   // печатаем данные с СОМ порта
  }
}

void mousePressed() // нажатие кнопки
{ 
  if (mouseX >= 100) if (mouseX <= 200) if (mouseY >= 100) if (mouseY <= 200) h = false;
  else h = true;
}  

void mouseReleased() // отпускание кнопки
{
  h = true;
} 
Ziliboba
Offline
Зарегистрирован: 22.10.2015

Команду нужно отправлять  с символом возврата карретки (нажатие Enter) - символ 0x0D.  Я в ардуине пользуюсь Serial.print("AT\r"). Тот же эффект будет от Serial.println("AT").

То есть первая команда должна быть "AT\r". Полный ответ, который будет лежать в буффере ардуины: "AT\r\r\nOK\r\n"

Эхо выключается командой "ATE0\r". В ответе так же будет эхо, а после него на простые команды ответом будет только "\r\nOK\r\n".

В своей задаче при первоначальном включении посылаю AT\r и сравниваю ответ - есть там эхо или нет, если нет то инициализация продолжается дальше, если есть - перед ней выключается эхо.

a1000
Offline
Зарегистрирован: 06.10.2015

Спасибо за ответ. С возвратом каретки уже разобрался. С отключением эха поэксперементирую.  Есть ещё один вопрос. В ответ на свои запросы ПК будет получать СМС приблизительно такого содержания "MVT0 ; MVL1 ; 6,3" Даное СМС соответственно сохраняется в виде строковой переменной типа String. MVT0 и MVL1 - данные о положении датчиков, 6,3 - значение напряжения, может меняться от 0 до 11. Разделители могут быть любыми другими. С обработкой данных по датчикам разобрался, а вот как вытянуть из  String переменной значение напряжения пока разобраться не могу. Подскажите решение.

a1000
Offline
Зарегистрирован: 06.10.2015

Полистав просторы интернета а особо https://processing.org/reference немного разобрался с обработкой строковых переменных. Отрезать кусок от строки можно функцией substring ()

Ziliboba
Offline
Зарегистрирован: 22.10.2015

Оу, предполагал, что тут значительно больше опытных, которые шото лучше посоветуют. А я бы наверное перевернул String в простой char, оттуда напрямую вынул нужные байты и преобразовав сложил в переменную. Просто Стринг как-то сразу оттолкнул своими размерами после компиляции. А велосипеды для моих задач обработки строк (примерно похожие) оказываются не такими уж сложными.