проблема в работе с COM портом
- Войдите на сайт для отправки комментариев
Пробую подружить 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;
}
Команду нужно отправлять с символом возврата карретки (нажатие 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 и сравниваю ответ - есть там эхо или нет, если нет то инициализация продолжается дальше, если есть - перед ней выключается эхо.
Спасибо за ответ. С возвратом каретки уже разобрался. С отключением эха поэксперементирую. Есть ещё один вопрос. В ответ на свои запросы ПК будет получать СМС приблизительно такого содержания "MVT0 ; MVL1 ; 6,3" Даное СМС соответственно сохраняется в виде строковой переменной типа String. MVT0 и MVL1 - данные о положении датчиков, 6,3 - значение напряжения, может меняться от 0 до 11. Разделители могут быть любыми другими. С обработкой данных по датчикам разобрался, а вот как вытянуть из String переменной значение напряжения пока разобраться не могу. Подскажите решение.
Полистав просторы интернета а особо https://processing.org/reference немного разобрался с обработкой строковых переменных. Отрезать кусок от строки можно функцией substring ()
Оу, предполагал, что тут значительно больше опытных, которые шото лучше посоветуют. А я бы наверное перевернул String в простой char, оттуда напрямую вынул нужные байты и преобразовав сложил в переменную. Просто Стринг как-то сразу оттолкнул своими размерами после компиляции. А велосипеды для моих задач обработки строк (примерно похожие) оказываются не такими уж сложными.