Soros port adatok olvasása, vesszővel tagolva + float

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Válasz küldése
Avatar
broland
Tranzisztorgyógyász
Hozzászólások: 152
Csatlakozott: 2009. április 20. hétfő, 6:00

Soros port adatok olvasása, vesszővel tagolva + float

Hozzászólás Szerző: broland »

Sziasztok

Nagyon nagy fába vágtam a fejszét, és nulla, azaz 0 ötletem van a megvalósítására.
Adott egy mega2560. Ha a soros porton küldök neki egy "s" karaktert, elkezdi önteni magából a nekem szükséges adatok. Ha egy "x"-et küldök akkor megállítja. A kapott adat vesszővel (,) tagolt halmaz, végén \r\n, mindíg ugyanannyi tagot tartalmaz..

Kód: Egész kijelölése

0,0.02,-0.01,9.82,2.0,0,1500,1500,1500,1000,1000,2000,0,0, 1000,1000,1000,1000,0,0,0,0,11.3,0\r\n
a float adatok változatosak, lehet 0.02, de lehet akár 10.21 is.
ezeket az adatokat szeretném változókba rakni de semmi ötlet. plusz ugye a \r\n sem kell.

pl. a mintából kiindulva:

Kód: Egész kijelölése

0,0.02,-0.01,9.82,2.0,0,1500,1500,1500,1000,1000,2000,0,0, 1000,1000,1000,1000,0,0,0,0,11.3,0\r\n

a értéke 0
b értéke 0.02
c értéke -0.01
d értéke 9.82

stbstb
Eddig jutottam, hát nem sok minden azt tudom, de nagyon lefagytam, kuka az agyam......

Kód: Egész kijelölése

void readSerialData(){
  dataserial.write("s");
  while (dataserial.available()){
    char readedData = (char)dataserial.read();
    if (readedData == '\n') {
      dataserial.write("x");
    } 
  }
}
Előre is köszönöm a segítséget.
ÜDv Broland
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

PC vagy Arduino oldal? más nyelv nem jó?
Bascom alatt ott lenne a split() függvény:)

Itt string olvas Ugye ez karakterenként

tomb(10)*string20 letrehozasa (max 10 erteked lesz, 20 elemű stringkent)

do

if serial>0 {
read char
if char=x -> vege
if char="," -> index++
if egyeb -> tomb(index)=tomb(index)+char

loop amig vege

Valaki tegye Arduino alá. Bascom alatt 10-12 sor.
Arduinoban nincs normális karakterlánc kezelés:(
Avatar
broland
Tranzisztorgyógyász
Hozzászólások: 152
Csatlakozott: 2009. április 20. hétfő, 6:00

Hozzászólás Szerző: broland »

Hello

Arduino oldal. Atmega2560 az adó, Nano v3 a vevő.

Üdv Broland
Avatar
tavir
Újonc
Újonc
Hozzászólások: 1
Csatlakozott: 2005. március 26. szombat, 7:00

Hozzászólás Szerző: tavir »

Küldd el nem vesszovel elvalasztva.
#adatkezdet
adat1
adat2
adat3
#adatvege

Arduino alatt meg fel is lehet dolgozni. Es NE tizedestortkent, hanem pl. *1000-kent kuldd el...
Avatar
broland
Tranzisztorgyógyász
Hozzászólások: 152
Csatlakozott: 2009. április 20. hétfő, 6:00

Hozzászólás Szerző: broland »

Hello Tavir

Ebbe sajnos egyéb okok miatt nem lehet belenyúlni. Ezt a formátumot használja egy pc-s program is. :(

Üdv Broland
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Az Arduino helyett akkor nyithatsz a C fele. Innentől a programnak annyi.
Vagy az első javaslatomat megvalósítod...

Most hol jársz? Mi az elképzelés? Mi a minta?
Avatar
broland
Tranzisztorgyógyász
Hozzászólások: 152
Csatlakozott: 2009. április 20. hétfő, 6:00

Hozzászólás Szerző: broland »

Hello

Most itt járok, de még nem teszteltem:

Kód: Egész kijelölése

float read() {
  #define SIZE 24
  byte index = 0;
  byte timeout = 0;
  char data[SIZE] = "";  
  dataserial.write("s");  
  do {
    if (dataserial.available() == 0) {
      delay(10);
      timeout++;
    }
    else {
      data[index] = dataserial.read();
      timeout = 0;
      index++;
    }
  } while ((index == 0 || data[index-1] != ',') && (timeout < 10) && (index < sizeof(data)-1));
  data[index] = '\0';
  dataserial.write("x");
  return atof(data);  
}

Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Avatar
broland
Tranzisztorgyógyász
Hozzászólások: 152
Csatlakozott: 2009. április 20. hétfő, 6:00

Hozzászólás Szerző: broland »

Hello

Na ez már félig működik, amikor elsőre kap adatok akkor jó, aztán elkezd zagyvulni.


Kód: Egész kijelölése

char inData[140]; //ez a deklaráció így nem lesz jó
byte index;

float datas[24] = {0};
char * val;
int count = 0;

boolean received = false;

void setup(){
  Serial.begin(115200);
}

void loop(){

  while(Serial.available() > 0){	                
    char inChar = Serial.read();
    if(index < 140){ //valahol nullázni kellene az index értékét?!
      inData[index] = inChar;
      index++;
      inData[index] = '\0';
    }    
    received = true;    		          
  }

if(received){
  val = strtok (inData,",");		
  datas[count] = atof(val);
		
  while ((val = strtok (NULL, ",")) != NULL){
    datas[++count] = atof(val);
  }
  
  for(int b=0; b<=23; b++){
    Serial.print(b);
    Serial.print(":");
    Serial.println(datas[b],2);
  }  
    
  received = false;
  }    
}

Kód: Egész kijelölése

Soros tesztkód próbálni:
0,0.02,-0.01,9.82,2.0,0,1500,1500,1500,1000,1000,2000,0,0, 1000,1000,1000,1000,0,0,0,0,11.3,0,
Üdv Broland
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Valahol? Itt:

Kód: Egész kijelölése

  index = 0;
  while(Serial.available() > 0){                   
     char inChar = Serial.read(); 
     if(index < 140){ //valahol nullázni kellene az index értékét?! 
       inData[index] = inChar; 
       index++; 
       inData[index] = '\0'; 
     }    
     received = true;                    
   }
8)
Válasz küldése