www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 
Sponsored by SiOL

String -> int

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Arduino sekcija
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
ElGrigon
Član
Član



Pridružen-a: Pon 24 Jul 2006 22:38
Prispevkov: 3863
Aktiv.: 23.96
Kraj: okolica Lenarta

PrispevekObjavljeno: Sob Apr 20, 2019 11:35 pm    Naslov sporočila:  String -> int Odgovori s citatom

Pozdrav,

Kako naj pretvorim string podatek v int?

String dobim po serial komunikaciji v obliki npr. 71 82 00 00 in to moram pretvoriti v int, od tega je uporabno samo 82 00 00.

_________________
lp, ElGrigon
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
polkic
Član
Član



Pridružen-a: Pon 04 Dec 2017 20:27
Prispevkov: 58
Aktiv.: 2.54

PrispevekObjavljeno: Ned Apr 21, 2019 7:10 am    Naslov sporočila:   Odgovori s citatom

Pozdravljen,

string bi najprej obdelal (porezal stran tisto kar ne nucam) nato pa pretovril v int s pomočjo stringtoint. https://www.arduino.cc/en/Tutorial.StringToIntExample

Lep pozdrav.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
igo
Član
Član



Pridružen-a: Sre 11 Okt 2006 19:11
Prispevkov: 3567
Aktiv.: 22.49
Kraj: Krško

PrispevekObjavljeno: Ned Apr 21, 2019 10:38 am    Naslov sporočila:   Odgovori s citatom

To se običajno naredi obratno od postopka, s katerim si iz svojega podatka dobil tisti string.

Stvar je v tem, da je serijskemu portu povsem vseeno, kaj prenaša. Vedno bo poslano oziroma sprejeto n-krat po 8 bitov, njihov pomen pa je odvisen od načina kodiranja, kako so bili podatki pretvorjeni v niz z n členi po 8 bitov.

Primer:
Imaš 32-bitno HEX število Podatek71=0x00820000, ki ima pomen številka 71 (recimo skupno število nekih impulzov). Torej 24 uporabnih bitov, ki morajo imeti na sprejemni strani točno določen pomen.
Najprej z
if(Podatek71 > 0x00FFFFFF) preveriš, ali je število manjše od največjega dovoljenega, nato mu spredaj dodaš pomen
Podatek4TX = Podatek71 I 0x71000000 ;// Podatek za TX
Potem ga s shiftanjem >>8 in maskiranjem pretvoriš v niz (string) 4-krat po 8 bitov, z njimi napolniš TX buffer in sprožiš pošiljanje.

Na sprejemni strani pa najprej z maskiranjem z 0xFF000000 preveriš pomen (71), nato pa 32-biten Podatek71 na sprejemni strani s shiftanjem <<8 sestaviš nazaj v 00820000.
Podatek71 = Podatek71 << 8;
Podatek71 = Podatek71 + SprejetiNiz[i];

S tem boš dobil HEX število 820000, kar je DEC 8512680.

Če boš Podatek71 zapakiral in razpakiral na kak drug način, je lahko njegov pomen tudi ASCII za na lcd ali BCD desetiško kodiranje ali ...
... povsem odvisno od trenutnega navdiha.

_________________
Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
ElGrigon
Član
Član



Pridružen-a: Pon 24 Jul 2006 22:38
Prispevkov: 3863
Aktiv.: 23.96
Kraj: okolica Lenarta

PrispevekObjavljeno: Ned Apr 21, 2019 11:26 am    Naslov sporočila:   Odgovori s citatom

To s shiftanjem bi šlo, če bi potreboval cel niz. Iz 71 82 00 00 sta važna le bit 4 in 5. Vedno sta polna le ti dva bita.

Kaj, če uporabim
char RX[8]=mySerial.Read();
int RXdata= RX[5]*16+RX[4];
S tem bi dobil vrednost 130.

_________________
lp, ElGrigon
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
igo
Član
Član



Pridružen-a: Sre 11 Okt 2006 19:11
Prispevkov: 3567
Aktiv.: 22.49
Kraj: Krško

PrispevekObjavljeno: Ned Apr 21, 2019 1:51 pm    Naslov sporočila:   Odgovori s citatom

Če si sprejel 8 8-bitnih vrednosti, potem je tak postopek skoraj povsem pravilen.
Množiti moraš z 256, kar je enakovredno shiftanju v levo za <<8 .

RXdata = RX[5]*256 + RX[4];


Če pa si sprejel 4 8-bitne vrednosti
( char RXdata[4]= my.serialRead() ), kar bi se dalo sklepati iz 71 82 00 00, potem je 82 8-bitna HEX vrednost, ki jo ni treba posebej pretvarjati v desetiško, moraš pa vedeti, ali je vrednost desetiška ali šestnajtiška, saj je v osnovi šestnajtiška, ki jo potem v desetiško pretvori funkcija za izpis na lcd ali podobna. In seveda jo moraš izluščiti iz sprejetega paketa
RXdata = RX[2]; , ker je to byte2 po vrsti (0, 1, 2, 3) izmed prejetih.


V glavnem bit[...] je mišljena pozicija bita znotraj 8-, 16-, 32-, ... bitne spremenljivke.
Poziciji 5 in 4 sta pri paketu osmih 8-bitnih prejetih spremenljivkah, kjer je vsaka cifra zase prejet podatek 7,1, 8, 2, 0, 0, 0, 0, kjer gre lahko vsak od 0 do 255.
Pozicija 2 je pri štirih 8-bitnih spremenljivkah 71, 82, 00, 00, kjer gre vsaka izmed štirih od 0x00 do 0xFF šestnajstiško ali od 000 do 255 decimalno.

Zato je treba najprej definirati obliko zapisa (HEX, DEC, BIN, ...), potem pa izluščiš ven tisto, kar potrebuješ.

_________________
Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
ElGrigon
Član
Član



Pridružen-a: Pon 24 Jul 2006 22:38
Prispevkov: 3863
Aktiv.: 23.96
Kraj: okolica Lenarta

PrispevekObjavljeno: Ned Apr 21, 2019 2:11 pm    Naslov sporočila:   Odgovori s citatom

Nisem še tako daleč. HMI mi pošlje HEX npr. 71 82 00 00. Izluščiti moram samo 82. Niti ne vem kaj mi prebere na Serial oz. v kakšnem nizu to prebere.
Kolikor sem se igral z exampli Serial kar zleti skozi vsak prejet bit in ne prebere podatka naenkrat.

_________________
lp, ElGrigon
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
igo
Član
Član



Pridružen-a: Sre 11 Okt 2006 19:11
Prispevkov: 3567
Aktiv.: 22.49
Kraj: Krško

PrispevekObjavljeno: Ned Apr 21, 2019 2:44 pm    Naslov sporočila:   Odgovori s citatom

V tem primeru so sprejete 4 8-bitne HEX vrednosti.
char RXdata[4] = my.serialRead();

Potem uporabiš samo
RXdata[2]; // tu je 0x82 v HEX.


Primer:
if(RXdata[3] == 0x71) // če je 0x71, je sprejet veljaven Podatek71
{
Podatek71 = RXdata[2];
}
if(RXdata[3] == 0x72) // to je podatek s povsem drugim pomenom72
{
Podatek72 = RXdata [2];
}


Lahko uporabiš tudi switch / case stavek
switch(RXdata[3])
{
case 0x71:
Podatek71=RXdata[2];
break;
case 0x72:
Podatek72=RXdata[2];
break;
}

Glej Arduino reference za switch case.


Če boš potem
char Podatek71 prikazal na LCD, bo izpisalo desetiško 130 .

_________________
Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
ElGrigon
Član
Član



Pridružen-a: Pon 24 Jul 2006 22:38
Prispevkov: 3863
Aktiv.: 23.96
Kraj: okolica Lenarta

PrispevekObjavljeno: Ned Apr 21, 2019 7:56 pm    Naslov sporočila:   Odgovori s citatom

Bom priklopil HMI in da vidim ali pošlje tako kot prikazuje simulator.

Če zadevo shranim v String, bi moral videt cel buffer iz prejetega serial paketa?

_________________
lp, ElGrigon
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
igo
Član
Član



Pridružen-a: Sre 11 Okt 2006 19:11
Prispevkov: 3567
Aktiv.: 22.49
Kraj: Krško

PrispevekObjavljeno: Ned Apr 21, 2019 9:07 pm    Naslov sporočila:   Odgovori s citatom

Ja. V buffer dobiš 4 8-bitne vrednosti, ki jih shraniš v char RXdata[4];
Potem lahko z vsakim členom niza RXdata[i] počneš, kar želiš.
Lahko jih združiš, maskiraš z 0xF... , ..., uporabiš znotraj if(...) in podobno.

_________________
Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Arduino sekcija Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 174 dni


Powered by phpBB © 2001, 2005 phpBB Group