Нужна помощь по serial

gav81
Offline
Зарегистрирован: 26.12.2014

Из ардуино приходят строковые значения 1 24,7 5 48,1 3 26,5, где первое число индекс переменной, а второе строковое значение переменной. Ардуино отпраляет только тогда, когда значение переменной изменилось.

Как организовать идентификацию переменной и запись файл на Processing?

Сам не програмист, может что то не так описал.

Буду благодарен за любые подсказки!

 

 

boban_
Offline
Зарегистрирован: 09.10.2013

Нужен парсинг строки по какому либо условию.

Условие не увидел. Нужно более четкое определение получаемой строки.

Обычно в строку вставляется символ, или группа, принахождении которого начинается обработка последующих символов.

gav81
Offline
Зарегистрирован: 26.12.2014

Скетч отпраялющего ардуино

#include <Wire.h>
#include <OneWire.h>
#include "DHT.h"
#include <BMP085.h>
byte _d18x2x3Addr[8]={0x28, 0xB, 0x38, 0xB5, 0x5, 0x0, 0x0, 0x79};
byte _d18x2x2Addr[8]={0x28, 0x71, 0xF, 0xB6, 0x5, 0x0, 0x0, 0x73};
byte _d18x2x1Addr[8]={0x28, 0xBE, 0xDC, 0xB5, 0x5, 0x0, 0x0, 0x50};
DHT _dht1(5, DHT22);
BMP085  _bmp085 = BMP085();
long _bmp085P = 0;
long _bmp085T = 0;
long _bmp085A = 0;
OneWire  _ow3(3);
String _gtv1;
String _gtv2;
String _gtv3;
String _gtv4;
String _gtv5;
String _gtv6;
String _gtv7;
String _gtv8;
unsigned long _d18x2x1Tti = 0UL;
float _d18x2x1O = 0.00;
unsigned long _d18x2x2Tti = 0UL;
float _d18x2x2O = 0.00;
unsigned long _d18x2x3Tti = 0UL;
float _d18x2x3O = 0.00;
unsigned long _dht1Tti = 0UL;
float _dht1t = 0.00;
float _dht1h = 0.00;
unsigned long _bmp0851Tti = 0UL;
String _SV1CP0 = "0";
bool _SV1CP0needSend = 0;
String _SV2CP0 = "0";
bool _SV2CP0needSend = 0;
String _SV3CP0 = "0";
bool _SV3CP0needSend = 0;
String _SV4CP0 = "0";
bool _SV4CP0needSend = 0;
String _SV5CP0 = "0";
bool _SV5CP0needSend = 0;
String _SV6CP0 = "0";
bool _SV6CP0needSend = 0;
String _SV7CP0 = "0";
bool _SV7CP0needSend = 0;
void setup()
{
Wire.begin();
_bmp085.init(MODE_ULTRA_HIGHRES,9300, true);
Serial.begin(9600);
_dht1.begin();
}
void loop()
{if(_isTimer(_dht1Tti, 5000)) {
_dht1Tti = millis(); 
float tempDht5;
 tempDht5 = _dht1.readTemperature();
if (!(isnan(tempDht5))){_dht1t=tempDht5; }
 tempDht5 = _dht1.readHumidity();
if (!(isnan(tempDht5))){_dht1h=tempDht5; }
}if(_isTimer(_bmp0851Tti, 5000)) {
_bmp0851Tti = millis(); 
_bmp085.getAltitude(&_bmp085A);
_bmp085.getPressure(&_bmp085P);
_bmp085.getTemperature(&_bmp085T);
}



if(_isTimer(_d18x2x1Tti, 3000)) {
_d18x2x1Tti = millis(); 
_d18x2x1O=  _readDS18_ow3(_d18x2x1Addr, 0);}
if(_isTimer(_d18x2x2Tti, 3000)) {
_d18x2x2Tti = millis(); 
_d18x2x2O=  _readDS18_ow3(_d18x2x2Addr, 0);}
if(_isTimer(_d18x2x3Tti, 3000)) {
_d18x2x3Tti = millis(); 
_d18x2x3O=  _readDS18_ow3(_d18x2x3Addr, 0);}
_gtv1 = ( _floatToStringWitRaz((_d18x2x1O),2));
_gtv2 = ( _floatToStringWitRaz((_d18x2x2O),2));
_gtv3 = ( _floatToStringWitRaz((_d18x2x3O),2));
_gtv7 = ( _floatToStringWitRaz(_dht1t,2));
_gtv8 = ( _floatToStringWitRaz(_dht1h,0));
_gtv4 = ( _floatToStringWitRaz((_bmp085T)/(10.00),1));
_gtv5 = ( _floatToStringWitRaz((_bmp085P)/(133.322),1));
_gtv6 = (String(_bmp085A));
String _SV1CP0temp;
_SV1CP0temp = _gtv5;
if (_SV1CP0temp != _SV1CP0) {_SV1CP0 = _SV1CP0temp; _SV1CP0needSend = 1;}
String _SV2CP0temp;
_SV2CP0temp = _gtv4;
if (_SV2CP0temp != _SV2CP0) {_SV2CP0 = _SV2CP0temp; _SV2CP0needSend = 1;}
String _SV3CP0temp;
_SV3CP0temp = _gtv7;
if (_SV3CP0temp != _SV3CP0) {_SV3CP0 = _SV3CP0temp; _SV3CP0needSend = 1;}
String _SV4CP0temp;
_SV4CP0temp = _gtv8;
if (_SV4CP0temp != _SV4CP0) {_SV4CP0 = _SV4CP0temp; _SV4CP0needSend = 1;}
String _SV5CP0temp;
_SV5CP0temp = _gtv1;
if (_SV5CP0temp != _SV5CP0) {_SV5CP0 = _SV5CP0temp; _SV5CP0needSend = 1;}
String _SV6CP0temp;
_SV6CP0temp = _gtv2;
if (_SV6CP0temp != _SV6CP0) {_SV6CP0 = _SV6CP0temp; _SV6CP0needSend = 1;}
String _SV7CP0temp;
_SV7CP0temp = _gtv3;
if (_SV7CP0temp != _SV7CP0) {_SV7CP0 = _SV7CP0temp; _SV7CP0needSend = 1;}


if(_SV1CP0needSend) {
_SV1CP0needSend = 0;
Serial.write (1);
Serial.print (1);
Serial.write (2);
Serial.print (_SV1CP0);
Serial.write (3);}if(_SV2CP0needSend) {
_SV2CP0needSend = 0;
Serial.write (1);
Serial.print (2);
Serial.write (2);
Serial.print (_SV2CP0);
Serial.write (3);}if(_SV3CP0needSend) {
_SV3CP0needSend = 0;
Serial.write (1);
Serial.print (3);
Serial.write (2);
Serial.print (_SV3CP0);
Serial.write (3);}if(_SV4CP0needSend) {
_SV4CP0needSend = 0;
Serial.write (1);
Serial.print (4);
Serial.write (2);
Serial.print (_SV4CP0);
Serial.write (3);}if(_SV5CP0needSend) {
_SV5CP0needSend = 0;
Serial.write (1);
Serial.print (5);
Serial.write (2);
Serial.print (_SV5CP0);
Serial.write (3);}if(_SV6CP0needSend) {
_SV6CP0needSend = 0;
Serial.write (1);
Serial.print (6);
Serial.write (2);
Serial.print (_SV6CP0);
Serial.write (3);}if(_SV7CP0needSend) {
_SV7CP0needSend = 0;
Serial.write (1);
Serial.print (7);
Serial.write (2);
Serial.print (_SV7CP0);
Serial.write (3);}
}
bool _isTimer(unsigned long startTime, unsigned long period )
  {
  unsigned long currentTime;
currentTime = millis();
if (currentTime>= startTime) {return (currentTime>=(startTime + period));} else {return (currentTime >=(4294967295-startTime+period));}
  }
String  _floatToStringWitRaz(float value, int raz)
{
  float tv;
  int ti = int(value);
  String ts = String(ti);
  if (raz == 0) {
    return ts;
  }
  ts += ".";
  float tf = abs(value - ti);
  for (int i = 1; i <= raz; i++ )
  {
    tv = tf * 10;
    ti = int(tv);
    ts += String(ti);
    tf = (tv - ti);
  }
  return ts;
}
float _convertDS18x2xData(byte type_s, byte data[12])
{
  int16_t raw = (data[1] << 8) | data[0];
  if (type_s) 
  {
  raw = raw << 3; 
  if (data[7] == 0x10) { raw = (raw & 0xFFF0) + 12 - data[6]; }
  }
else 
  {
   byte cfg = (data[4] & 0x60);
   if (cfg == 0x00) raw = raw & ~7;   else if (cfg == 0x20) raw = raw & ~3;  else if (cfg == 0x40) raw = raw & ~1;
  }
return  (float)raw / 16.0;
}
float _readDS18_ow3(byte addr[8], byte type_s)
{  byte data[12];
byte i;
_ow3.reset();
_ow3.select(addr);
_ow3.write(0xBE);
for ( i = 0; i < 9; i++) {
 data[i] = _ow3.read();}
_ow3.reset();
_ow3.select(addr);
_ow3.write(0x44, 1);
return _convertDS18x2xData(type_s, data);}

Скетч принимающего ардуино

String _gtv1;
String _gtv2;
String _RV1CP0 = "0";
String _RV2CP0 = "0";
int _resiveMode0 = 0;
bool _hasRessiveVariable0 = 0;
String _resiveVariableString0;
int _resiveVariableIndex0 = 0;
void setup()
{
Serial.begin(9600);
}
void loop()
{if(Serial.available()){_ressiveByte(0, (Serial.read()));}
if(_hasRessiveVariable0) {_hasRessiveVariable0 =0;
if(_resiveVariableIndex0 == 1) {_RV1CP0 = _resiveVariableString0;}
if(_resiveVariableIndex0 == 2) {_RV2CP0 = _resiveVariableString0;}
}




_gtv1 = _RV1CP0;
_gtv2 = _RV2CP0;



}
void _ressiveByte(int port, byte resiveByte)
{
  int tempStatus;
  tempStatus = _statusForPort(port);
  if (tempStatus==0) {
    if (resiveByte == 1) {
      _setStatusToPort(1,port);  
      _setHasDataToPort(0, port);
      _resetStringVariableToPort(port);
    }
  }
  if (tempStatus==1) {
    if((resiveByte == 1 )||(resiveByte == 3)) {
      _setStatusToPort(0,port);
    } 
    else
    {
      if(resiveByte==2) {
        _setStatusToPort(2,port); 
        _setIndexVariableToPort((_stringVariableFromPort(port)),port); 
        _resetStringVariableToPort(port);
      } 
      else {
        _addByteToVariableToPort(port, resiveByte);
      }
    }
  }
  if (tempStatus==2) {
    if((resiveByte == 1 )||(resiveByte == 2)) {
      _setStatusToPort(0,port);
    } 
    else
    {
      if (resiveByte==3) {
        _setStatusToPort(0,port); 
        _setHasDataToPort(1, port);
      } 
      else {
        _addByteToVariableToPort(port, resiveByte);
      }
    }
  }
}
int _statusForPort(int port) 
{ if(port == 0) { return _resiveMode0;}}
void _setStatusToPort(int newStatus, int port) 
{if(port == 0) {  _resiveMode0= newStatus;} }
String _stringVariableFromPort(int port)
{ if(port == 0) { return _resiveVariableString0;}}
void  _setIndexVariableToPort(String value, int port) 
{if(port == 0) {  _resiveVariableIndex0= value.toInt();}}
void  _resetStringVariableToPort(int port) 
{if(port == 0) {  _resiveVariableString0= "";}}
void  _addByteToVariableToPort(int port, byte resiveByte) 
{if(port == 0) {  _resiveVariableString0+= char(resiveByte);}}
void  _setHasDataToPort(bool value, int port) 
{if(port == 0) {  _hasRessiveVariable0= value;}}

То есть, между двумя ардуино все работает!

Скетчи формирует программа. Отсутствует возможность сформировать сформировать для Processing

gav81
Offline
Зарегистрирован: 26.12.2014

boban_ пишет:

Нужен парсинг строки по какому либо условию.

Условие не увидел. Нужно более четкое определение получаемой строки.

Обычно в строку вставляется символ, или группа, принахождении которого начинается обработка последующих символов.

Пришлось разобраться с таблицей ASCII/

boban_,  спасибо за наводку.

Насколько я понял на данный момент ардуино при изменении переменной отправляет:

    Serial.write (1); - бинарный код - начало заголовка
    Serial.print (1); - текстовое значение индекса переменной
    Serial.write (2); - бинарный код - начало текста
    Serial.print (_SV1CP0); текстовое значение переменной
    Serial.write (3); - бинарный код - конец текста
 
Необходио идентифицировать приходящую переменную по индексу и присвоить сответсующей переменной в Process.. присланное значение.
 
Помогите с кодом для Processing.