Arduino - Lägga till nummer på String variabeln

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
GeekJoan
Admin
Inlägg: 10642
Blev medlem: 26 maj 2003, 15:59:27
Ort: Solna

Arduino - Lägga till nummer på String variabeln

Inlägg av GeekJoan »

Alltså antingen är jag trött eller så är det kortslutning i skallen just nu.
Jag vill bara lägga till ett nummer på slutet av en "variabel".

int Nr = 0;
String Data[Nr] = "";

INData = client.read();

if (INData == '#'){Switch = 1;}
if (INData == '*'){Switch = 0; Nr++}

if (Switch == 1){Data[Nr] += INData;

Så för varje gång det kommer en * så räknar den upp 1 så jag får strängar som heter:
Data1
Data2
Data3, osv.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43148
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Arduino - Lägga till nummer på String variabeln

Inlägg av sodjan »

Får du verkligen det? Är inte [n] indexering av en array?
Användarvisningsbild
GeekJoan
Admin
Inlägg: 10642
Blev medlem: 26 maj 2003, 15:59:27
Ort: Solna

Re: Arduino - Lägga till nummer på String variabeln

Inlägg av GeekJoan »

Jag frågar ju hur man gör... Jag har ingen aning. Jag tar saker ut röven och stoppar in dom i mitt lilla program och hoppas att det ska funka.
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

Re: Arduino - Lägga till nummer på String variabeln

Inlägg av johano »

Funkar väl att bara lägga till integern till strängen?

Kod: Markera allt

int Nr=3;
String data="Data";
String test = data + Nr;
Eller har jag missförstått totalt?

/j
Användarvisningsbild
Icecap
Inlägg: 26106
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Arduino - Lägga till nummer på String variabeln

Inlägg av Icecap »

I C++ kan man lägga en sträng/ett tecken i slutet av en sträng just vid att köra:
Sträng = Sträng + Ny_Del;
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43148
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Arduino - Lägga till nummer på String variabeln

Inlägg av sodjan »

Men Data[Nr] är väl en array som heter Data (indexerat av Nr), inte
en sträng med innehållet "Data"...

Sen så behöver kanske arrayen dimensioneras också, om det inte sker dynamiskt.
Och du får alltså Data[1], Data[2], Data[3] o.s.v. Var och en kan innehålla
valfri sträng.
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

Re: Arduino - Lägga till nummer på String variabeln

Inlägg av johano »

Det var lite otydligt, jag trodde också först att det rörde sig om array:er.
Men efter sista meningen
GeekJoan skrev: "Så för varje gång det kommer en * så räknar den upp 1 så jag får strängar som heter:
Data1
Data2
Data3, osv.
så tolkade jag som att det rörde sig om att bygga upp strängar med en fast text "Data" och sen ett dynamiskt nummer.

Men kan ju vara helt fel.

/j
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43148
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Arduino - Lägga till nummer på String variabeln

Inlägg av sodjan »

Det är inte heller klart om "att få strängar" betyder att de existerar en i taget. Eller om de ska existera samtidigt. Ska det bli data[1]="data1", daya[2]="data2" osv.? Man kan ju inte bara skapa strängar löst i luften, de måste lagras någonstans också...
Användarvisningsbild
GeekJoan
Admin
Inlägg: 10642
Blev medlem: 26 maj 2003, 15:59:27
Ort: Solna

Re: Arduino - Lägga till nummer på String variabeln

Inlägg av GeekJoan »

Låt mig förklara. Tror ifs att jag kommit på en annan lösning, men det kunde ju vara bra att veta om det faktiskt gå som jag tänkt först.

Jag kan deklarera strängarna i förväg. Inga problem.

String Data1 = "";
String Data2 = "";
String Data3 = "";
String Data4 = "";
int Nr = 1;


Men i själva loopen skulle jag vilja stoppa in text i sträng Data1 som kommer från hemsida tex. "denna text hamnar i sträng 1".
När ett tecken från hemsidan kommer så vill jag kunna ändra Data1 till Data2 och knöla in "nu kommer det mer text som hamnar i Data2".

Alltså:
INData = client.read(); // Läser av hemsidan och stoppar in det i INData.
if (INData == '*'){ Nr++}; // Om ett * kommer från hemsidan till INData så räknar Nr upp ett
Data(Nr) += INData; // Bygg till inkommande tecken från INData till sträng Data1.

Ex text från hemsidan:
denna text hamnar i sträng 1*nu kommer det mer text som hamnar i Data2 tills nästa*kommer

Resultat:
denna text hamnar i sträng 1 // Åker in i Data1.
*nu kommer det mer text som hamnar i Data2 tills nästa // Åker in i Data2
*kommer // Åker in i Data3
Användarvisningsbild
mrfrenzy
Co Admin
Inlägg: 14818
Blev medlem: 16 april 2006, 17:04:10

Re: Arduino - Lägga till nummer på String variabeln

Inlägg av mrfrenzy »

Det du beskriver är en stack, det finns funktioner för att implementera detta exempel: https://playground.arduino.cc/Code/StackArray

Frågan är varför du vill göra det och vad slutresultatet ska bli? Det finns förmodligen enklare sätt.

Edit: Läste lite noggrannare. Du behöver bara en forloop och en array som Larry länkade.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43148
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Arduino - Lägga till nummer på String variabeln

Inlägg av sodjan »

Data1 = "";
Data2 = "";
Data3 = "";
Data4 = "";

Varje variabel är en egen variabel. Du kan inte ersätta
siffran i namnet med en annan variabel. Det är det man
har en "array" till. Alltså:

Data[1] = "";
Data[2] = "";
Data[3] = "";
Data[4] = "";

Sen kan du sätta i olika "index" mellan klamrarna och hantera
olika "element" i arrayen.

Notera att Data1, Data2, Data3 och Data4 är *4* helt olika variabler, de
har inget samband med varandra, de bara råkar ha liknande namn. Däremot
är Data[1], Data[2], Data[3] och Data[4] en och samma variabel, en array.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45168
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Arduino - Lägga till nummer på String variabeln

Inlägg av TomasL »

Jag tror du vill göra så här:

Kod: Markera allt

char tmp[3];
int Nr = 0;
String Data[Nr] = "";

INData = client.read();
......
..........
.........
itoa(Nr, tmp,10);        //gör om en integer till en sträng, lagrar det i tmp[]
strcat(INData,tmp);    //lägger till tmp[] i slutet på INData
strcpy (data[Nr], INData);     //Lägger in det hela i arrayen data
Utmatningen blir då så här:
Nr = 0
INData = "Datagram\0"
itoa()-> tmp = "00\0"
strcat()-> INData = "Datagram00\0"
strcpy -> data[0] = "Datagram00\0"

Om Nr =10, blir då resultatet i Data[10] "Datagram10\0"

\0 betyder strängavslut.
Exakt syntax får du kika på, för detta är i princip så man gör i C
Användarvisningsbild
GeekJoan
Admin
Inlägg: 10642
Blev medlem: 26 maj 2003, 15:59:27
Ort: Solna

Re: Arduino - Lägga till nummer på String variabeln

Inlägg av GeekJoan »

Så här blev det till slut.

String SLArray[6];
char INData = 0;
int Switch = 0;
int Nr = 0;

loop

if (client.available()) {INData = client.read(); // Läser in data från hemsida
if (INData == '#'){Switch = 1; INData=' ';} // Om # tecken kommer så sätt Switch till 1 och byt ut # mot mellanslag.
if (INData == '*'){Switch = 0; Nr++;} // Om * kommer sätt Switch till 0 och räkna upp Nr +1.
if (Switch == 1 && INData != '\n'){SLArray[Nr] += INData;} // Om Switch är 1 och inkommande data inte är en radbrytning Bygg på Array["Nr"0] med inkommande data.
}
int i;
for(i=0;i <= Nr;i = i + 1){Serial.println(SLArray);} // Skriv ut varje Array på en egen rad. Detta kommer senare att bli en egen rad i en LCD.


Verkar funka fint.
Så nu är det klart.

Men då har jag så klart en fråga till.
På raden:

if (INData == '#'){Switch = 1; INData=' ';}
så byter jag ut # till ett mellanslag för jag vill inte ha in # i strängen för då blir det så här: #Sundbyberg.
Vad jag skulle vilja göra är så klart att den bara ignorerar det tecknet istället för att göra det till ett mellanslag. Men att skriva 'Utan mellanslag' går inte. Finns det något smart typ som för radbrytning '\n' som är "ingenting" som jag skulle kunna använda?
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

Re: Arduino - Lägga till nummer på String variabeln

Inlägg av johano »

Kod: Markera allt

if (INData == '#'){Switch = 1; INData='\n';}
eller

Kod: Markera allt

if (INData == '#'){Switch = 0; INData=' ';}
Borde väl funka med den logik du har lite längre ner?
/j
Skriv svar