проблема в работе с 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, оттуда напрямую вынул нужные байты и преобразовав сложил в переменную. Просто Стринг как-то сразу оттолкнул своими размерами после компиляции. А велосипеды для моих задач обработки строк (примерно похожие) оказываются не такими уж сложными.