Помогите извлечь переменные из строки string

Maxfr
Offline
Зарегистрирован: 30.06.2017

Из Processing'га по ethernet приходит стринг для управления сервами. В мониторе порта дуины вижу 2-а числа произвольной длины с пробелом. Скетч ардуины слеплен из разных примеров.

Процессинг отправляет строку так:

    c.write((X+90) + " " + (Y+90) +"\n");

Скетч ардуины

#include <Servo.h>
#include <SPI.h>
#include <Ethernet.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(192, 168, 0, 70);
EthernetServer server(80);
 
int data;
Servo myservo1;
Servo myservo2;
 
byte pos1 = 90;
byte pos2 = 90;
 
String inputString = "";
boolean stringComplete = false;
 
void setup() 
 
  Ethernet.begin(mac, ip);
  server.begin();
  
  Serial.begin(9600);
  myservo1.attach(9);
  myservo2.attach(8);
  inputString.reserve(200);
 
 
  inputString = "";
 
void loop() 
{  EthernetClient client = server.available();
  if (client) {
     char c = client.read();  //читает клиента
        Serial.write(c);       //пишет в сериал
 
  if (stringComplete) {    //если стринг полный..  В сериал соединении с компом работало, так не хочет
    pos1 = inputString[0];
    pos2 = inputString[1];
    myservo1.write(pos1);
    myservo2.write(pos2);
    delay(15);
    inputString = "";
    stringComplete = false;
  }}
 
 void serialEvent()
{  
  while (Serial.available()) {
    char inChar = (char)Serial.read(); 
    inputString += inChar;
         if (inChar == '\n') {
      stringComplete = true;    }   }}
 
В мониторе порта 2-а целых числа через пробел бегают от джойстика. Чую где-то рядом.. Про стринги кучу примеров перелопатил весь инет.. Мозга не хватает.. Хелп!
 
Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Maxfr пишет:
Мозга не хватает
А вот на это, тоже не хватило? Вставляй, давай как положено. Так как у тебя и читать-то вряд ли кто будет.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Maxfr пишет:

Скетч ардуины слеплен из разных примеров.

Опишите, пожалуйста, что он делает (по-Вашему), что Вы бы хотели, чтобы он делал, и что в его работе Вас не устраивает.

И, да, вставьте его правильно, а то так его читать скорее всего не будут.

Maxfr
Offline
Зарегистрирован: 30.06.2017

В приходящей строке есть числа-градусы положения сервоприводов (переменные byte pos1 и pos2), первый байт для одной сервы, пробел, байт для другой сервы, но сервы молчат :(   В мониторе порта дуины строка видна, меняется, к примеру 180 120 , а до серв не доходит. Т.е. мне надо извлечь из строки, к примеру первое число 180 и повернуть серву1, извлечь 120 и повернуть вторую серву2. Как быть?

Извиняюсь за некорректный вид, а корректный как?

Maxfr
Offline
Зарегистрирован: 30.06.2017
#include <Servo.h>
#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(192, 168, 0, 70);
EthernetServer server(80);
 
int data;
Servo myservo1;
Servo myservo2;

byte pos1 = 90;
byte pos2 = 90;

String inputString = "";
boolean stringComplete = false;

void setup() 
{ 
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.begin(9600);
  myservo1.attach(9);
  myservo2.attach(8);
  inputString.reserve(200);
  inputString = "";
} 

void loop() 
{  EthernetClient client = server.available();
  if (client) {
     char c = client.read();  
        Serial.write(c);

   if (stringComplete) {
    pos1 = input.String[0];
/   pos2 = input.String[1];
    myservo1.write(pos1);
    myservo2.write(pos2);
    delay(15);
    inputString = "";
    stringComplete = false;
  }}

 void serialEvent()
{  
  while (Serial.available()) {
    char inChar = (char)Serial.read(); 
    inputString += inChar;
         if (inChar == '\n') {
      stringComplete = true;    }   }}

 

Maxfr
Offline
Зарегистрирован: 30.06.2017

В 34 строке записывается в сериал то, что приходит от клиента.

А с 36 идет чтение данных из сериала.. Но видимо данные читаются неправильно как то, раз сервы бездвижны..(

При соединение по сериалу кусок кода с 36 строки работает на ура четко, а здесь надо по ethernet ловить, отправлять в сериал и уже оттуда читать..

может 33 строка не char c , а как то по другому со стрингом?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Maxfr пишет:
видимо данные читаются неправильно

Что значит "видимо"? КТо-то мешает поставить после строки 38 вывод в сериал переменных pos1 и pos2 и посмотреть чему они равны. Будете точно знать, а не "видимо". заодно посмотрите на них, может поймёте в чём ошибка. Печатайте, смотрите.

Maxfr
Offline
Зарегистрирован: 30.06.2017

Числа бегут, в качестве управляющих значений углов серв подходят, но серва не двигается. Может питания не хватает? Запитана от USB, ардуино уно + шилд W5100 + одна серва 995... Без шилда USB тянул и две таких сервы..

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Куда они бегут? Правильные числа? Вы смотрите, на числа и анализируйте, а не "бегут". Если мельтешат - шлите пореже и смотрите внимательно. там же чушь собачья у Вас бежит, а вовсе не то, что Вы отправляли.

Maxfr
Offline
Зарегистрирован: 30.06.2017

С питанием норм, серва живая, где-то в коде.. Processing отправляет:

    c.write((X+90) + " " + (Y+90) +"\n");

получаю 2-а числа через пробел, но изначально рабочий код для отправки по сериалу был:

serial1.write(X+90);
serial1.write(Y+90);
serial1.write("\n");

если же напишу для ethernet'а так:

c.write(X+90);
c.write(Y+90);
c.write("\n");

то в мониторе дуины получаю меняющиеся символы. Может здесь собака порылась?

b707
Offline
Зарегистрирован: 26.05.2017

Maxfr. сколько можно тупить?

Вам сказали - вставьте после строки 38 вывод в сериал переменных pos1 и pos2 и посмотрите - получаете ли вы то. что отправляли. Почему вы этого не делаете, а продолжаете писать в форум какую-то хрень? Если считаете, что сами знаете, что делать - сами и разбирайтесь. не отнимайте у людей время.

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ощущение такое, что Вы меня не слышите. Вы вообще читаете что Вам пишут? Или Вы пришли сюда выговориться?

Maxfr
Offline
Зарегистрирован: 30.06.2017

Сори.. Читаю, после 38 строки вставляю serial.println(pos1) в мониторе вижу тоже что и отправлял по ethernet : последовательность числовых значений

b707
Offline
Зарегистрирован: 26.05.2017

Maxfr пишет:

Сори.. Читаю, после 38 строки вставляю serial.println(pos1) в мониторе вижу тоже что и отправлял по ethernet : последовательность числовых значений

то есть все прекрасно и проблема решена?

Maxfr
Offline
Зарегистрирован: 30.06.2017

Не решена, по задумке pos1, после pos1 = input.String[0];,  должно быть числом для сервы1 , но не работатает даже если отправляю по Ethernet значения для одной сервы.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Или Вы выложили в посте #4 левый скетч, не имеющий отношения к действительности, или же Вы просто что-то фантазируете. Тот скетч не может не то, что что-то показывать, а даже компилироваться. Причём не может как раз из-за этих строк, т.к. объект input в программе не существут. Если пытаться компилировать это Ваш "скетч", получается вот такой результат

Kaka0.ino: In function 'void loop()':
Kaka0:37: error: 'input' was not declared in this scope
Kaka0:38: error: expected primary-expression before '/' token
Kaka0:48: error: a function-definition is not allowed here before '{' token
Kaka0:56: error: expected '}' at end of input
 

Попробуйте сами.

Расцениваю это как издевательство. Поэтому, извините, пока Вы не выложите нормальный скетч, вместе с протоколом "что отправлялось и что печаталось", помогайте себе сами.

b707
Offline
Зарегистрирован: 26.05.2017

ЕвгенийП пишет:

Расцениваю как издевательство.

похоже на то.

ТС, почему данные о вашем скетче из вас надо клещами вытягивать? - несколько умных и знающих людей собрались вокруг вас, чтобы помочь, а вы, вместо того чтоб четко отвечать на вопросы и выполнять предложенные рекомендации - мычите что-то нечленораздельное и не пытаетесь хоть как-то приблизится к решению?

Давайте так - либо вы четко и точно делаете то, что вам сказали - либо досвиданья.

Maxfr
Offline
Зарегистрирован: 30.06.2017

Скетч процессинг:

import processing.net.*;
Client c;

import processing.serial.*;
import org.gamecontrolplus.*;
import java.io.*;

String input;
int data[];

Serial myPort;
ControlIO controll;
ControlDevice device;
ControlSlider sliderX, sliderY;
byte X, Y;

void setup()
{
  size(200, 200);
  background(204);
  stroke(0);
  frameRate(60);
  c = new Client(this, "192.168.0.70", 80); // Connect to server on port 80
    String portName = Serial.list()[0];
  myPort= new Serial(this, portName, 9600);
  controll = ControlIO.getInstance(this);
  device = controll.getDevice("Logitech Extreme 3D");
  device.setTolerance(0.05f);
  sliderX = device.getSlider(0);
   sliderY = device.getSlider(1);
}

void draw()
{
   background(180);
  X = byte(sliderX.getValue()  * (-90));
  Y = byte(sliderY.getValue()  * (-90));
     c.write((X+90) + " " + (Y+90) +"\n");
//      c.write(X+90);
//      c.write(Y+90);
//      c.write("\n");
           
      text(X, 100, 30);
      text(Y, 100, 40);     
}

Скетч ардуино:

#include <Servo.h> 
#include <SPI.h>
#include <Ethernet.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(192, 168, 0, 70);
EthernetServer server(80);
Servo myservo1;
Servo myservo2;
byte pos1 = 90;
byte pos2 = 90;
String inputString = "";
boolean stringComplete = false;

void setup() 
{ 
  Ethernet.begin(mac, ip);   
  server.begin();
  Serial.begin(9600);
  myservo1.attach(9);
  myservo2.attach(8);
  inputString.reserve(20);
} 

void loop() 
{ 
   EthernetClient client = server.available();
  if (client) {
     char c = client.read();  
        Serial.write(c);
        
  if (stringComplete) {
    pos1 = inputString[0];
    pos2 = inputString[1];
    Serial.println(pos1);
    myservo1.write(pos1);
    myservo2.write(pos2);

    delay(50);
    inputString = "";
    stringComplete = false;
    }
  }
} 
void serialEvent() {
  while (Serial.available()) {
    char inChar = (char)Serial.read(); 
    inputString += inChar;
    if (inChar == '\n') {
      stringComplete = true;
    } 
  }
}

В мониторе порта  90 90   числа 0-180   нужно одно чтоб серва реагировала.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Maxfr,

Вы меня, кончено извините, но я вижу здесь два варианта. Или Вы не умеющий читать идиот, или Вы умышленно издеваетсь над нами.

Вам чёрным по белому писали:

- печатать обе переменные pos1 и pos2. А Вы что печатаете?
- приложить протоколы "что отправлялось и что печаталось". И где они?

В общем так, если Вы идиот, то помочь Вам невозможно, если специально издеваетесь - то помогать не нужно.

Не хотите- не надо. До свиданья.