Fórum témák

» Több friss téma
Fórum » Arduino
A klónok CH340 Soros-USB illesztőjének drivere (Letöltés)
Lapozás: OK   131 / 851
(#) erdeidominik1999 válasza fkx hozzászólására (») Júl 6, 2015 /
 
Valószínű, én vagyok nagyon sötét, de még mindig nem értem, hogy a hexa értéket hogyan hozom össze a karakterrel?
(#) fkx válasza kapu48 hozzászólására (») Júl 6, 2015 /
 
Hát, inkább hobby webfejlesztő vagyok, nem ez a szakmám, ezzel csak érintőlegesen foglalkozom.
A szerver egyelőre csak ledeket kapcsolgat.
A DUE sajnos még nem érkezett meg, majd azt is elérhetővé teszem ha sikerül elindítani.
(#) kapu48 válasza erdeidominik1999 hozzászólására (») Júl 6, 2015 /
 
Itt a táblázat:
ISO/IEC 8859-2

A "Ő" pl. a 0xD5
(#) erdeidominik1999 válasza kapu48 hozzászólására (») Júl 6, 2015 /
 
Eddig tiszta, de mondjuk van egy stringem, amiben az van, hogy D5, ebből hogyan csinálok karaktert?
(#) fkx válasza erdeidominik1999 hozzászólására (») Júl 6, 2015 /
 
char *kodolt={"%F3"};
char dekodolt;

dekodolt = hex2byte(kodolt[1]); //dekódolt == 243 //dekódolt == ó

Persze a hex2byte függvényt neked kell megírni...
(#) erdeidominik1999 válasza fkx hozzászólására (») Júl 6, 2015 /
 
Köszi, de pont ezt nem értem, amit nekem kéne megírni.
(#) kapu48 válasza erdeidominik1999 hozzászólására (») Júl 6, 2015 /
 
F3
Const F = 15
n = 16 * F + 3
A hozzászólás módosítva: Júl 6, 2015
(#) erdeidominik1999 válasza kapu48 hozzászólására (») Júl 6, 2015 /
 
Egy ilyenem van:
  1. unsigned long hexToint(char *a, unsigned int len)
  2. {
  3.     int i;
  4.     unsigned long val = 0;
  5.  
  6.     for(i=0;i<len;i++)
  7.        if(a[i] <= 57)
  8.         val += (a[i]-48)*(1<<(4*(len-1-i)));
  9.        else
  10.         val += (a[i]-55)*(1<<(4*(len-1-i)));
  11.     return val;
  12. }

ha jól értem ez is jó, viszont a zónák neve egy tömb stringben van így: String zona_nev[6]; és ezt nem tudom write-tal írni...
(#) kapu48 válasza erdeidominik1999 hozzászólására (») Júl 6, 2015 /
 
Meg keresed, hol van a stringben „%”-jel az utána levő 2 Bytet alakítód át. (Alapból nem használszhatsz %-jelet, vagy ismert, hogy hol van ékezetes karakter? És azt keresed meg.)
És a 3 bytet (%FF) lecseréled a kapott 1 Bytevel.

...
unsigned char val = 0;
...

return val;
A hozzászólás módosítva: Júl 6, 2015
(#) Kovidivi válasza arduinoforever hozzászólására (») Júl 6, 2015 /
 
Szia.
Akkor te a Timer-eket, a DMA-t, és semmit nem használsz? Gondolom ezek Arduino-ból nem éppen beállíthatóak. Találtam adatlapot, még böngészem. 5$-ért ez a lap ajándék, amit tud, ez már bármire elegendő, sőt!
(#) erdeidominik1999 válasza kapu48 hozzászólására (») Júl 6, 2015 /
 
Az a gond, hogy nem egy dologról beszélünk. Azt tudom, hogy a stringben hogyan tudom lecsrélni meg megkeresni, az kéne, hogy hogyan tudom átalakítani. Azzal a metódussal, amit már írtál?
(#) kapu48 válasza erdeidominik1999 hozzászólására (») Júl 6, 2015 /
 
Te találtál jobbat!

Ha már szétdaraboltad a stringet?
Át adod a két karaktert:
  1. 1.      unsigned char hex2Toint(char *a, unsigned int len = 2)
  2. 2.      {
  3. 3.          int i;
  4. 4.          unsigned char val = 0;
  5. 5.       
  6. 6.          for(i=0;i<len;i++)
  7. 7.             if(a[i] <= 57)
  8. 8.              val += (a[i]-48)*(1<<(4*(len-1-i)));
  9. 9.             else
  10. 10.             val += (a[i]-55)*(1<<(4*(len-1-i)));
  11. 11.         return val;
  12. 12.     }


Visszakapod, ami kell neked!
Utána megint összefűzöd.
A hozzászólás módosítva: Júl 6, 2015
(#) erdeidominik1999 válasza kapu48 hozzászólására (») Júl 6, 2015 /
 
Na így sikerült, ha van valami rövidebb ötlet?
  1. String beerkezo="Z%F3na";
  2.  
  3. void setup(){
  4. Serial.begin(9600);
  5.  
  6. if(beerkezo.indexOf("%")>0){
  7.  
  8. int hely=beerkezo.indexOf("%");
  9. String val=beerkezo.substring(hely+1,hely+3);
  10. String val4=beerkezo.substring(hely,hely+3);
  11. int str_len2 = val.length()+1;
  12. char a[str_len2];
  13. val.toCharArray(a, str_len2);
  14. Serial.println(a);
  15. char val2=hex2Toint(a,2);
  16. Serial.println(val2);
  17. String val3;
  18. val3+=val2;
  19. beerkezo.replace(val4, val3);
  20. Serial.println(beerkezo);
  21. }
  22. }
  23.  
  24. void loop(){
  25.  
  26. }
  27.  
  28.  
  29. unsigned char hex2Toint(char *a, unsigned int len){
  30. int i;
  31. unsigned char val = 0;
  32. for(i=0;i<len;i++)
  33. if(a[i] <= 57)
  34. val += (a[i]-48)*(1<<(4*(len-1-i)));
  35. else
  36. val += (a[i]-55)*(1<<(4*(len-1-i)));
  37. return val;
  38. }
A hozzászólás módosítva: Júl 6, 2015
(#) kapu48 válasza erdeidominik1999 hozzászólására (») Júl 6, 2015 /
 
  1. String beerkezo="Z%F3na";
  2. //Deklaráljad
  3. unsigned char hex2Toint(char *a, unsigned int len = 2);
  4. void setup(){
  5. Serial.begin(9600);
  6. ...
(#) erdeidominik1999 hozzászólása Júl 6, 2015 /
 
Köszönöm szépen az összes segítséget! Ezer hála! Viszont még egy dolgot vettem észre, ha az első betű az ékezetes, akkor nem csinálja meg az átalakítást, ez miért lehet?
(#) kapu48 válasza erdeidominik1999 hozzászólására (») Júl 6, 2015 /
 
???
  1. ...
  2. if(beerkezo.indexOf("%")>=0){
  3. ...
(#) erdeidominik1999 válasza kapu48 hozzászólására (») Júl 6, 2015 /
 
Mi ezzel a gond? ha nincs benne, akkor minek fusson? Viszont még egy dolog felmerült, ha több ékezetes betű van, akkor hogyan tudnám az összeset átalakítani?
(#) fkx hozzászólása Júl 7, 2015 /
 
Ezt nagyon nem így szokták csinálni. Ezt a string osztályt felejtsd el, és használj C stringet (karaktertömböt) és a hozzá való függvényeket. Ez így ahogy most van, ha működni fog, akkor is nagyon lassú lesz, ahhoz képest amilyen lehetne.
A cserét úgy szokták megoldani, hogy pl. a string (és itt C stringről beszélek) a bufferben van. Felvesznek két pointert char *src, *dst. Az src pointerrel olvassuk a dst pointerrel írjuk az adatokat egy ciklusban. Azonban mikor % jelet olvasunk fel, akkor a következő két karaktert odaadjuk a konvertáló függvénynek, de a dst pointert csak eggyel növeljük és beírjuk a függvény által visszaadott értéket. Az src pointer persze mindegy egyes olvasott bájt után növekszik. Ezzel minden kódolt karaktert visszaállít.

A konvertáló függvény bár működhet, szintén nagyon nem hatékony így (tetű lassú). Mivel fixen 2 bájtból kell egyet csinálni, simán megoldható ciklus nélkül is. Egyszerüen ha a karakter '0'-'9' közötti akkor le kell vonni a '0' ASCII kódját(3. és 4. bit nullázása), ha 'A'-'F' közötti akkor le kell vonni az 'A' ASCII kódját és hozzáadni 10-et (összevonva -55). Miután ez megvan az első számot szorzod 16-al (<<4 mert a shiftelés sokkal gyorsabb) és hozzáadod a másodikat (vagyolod mert az alsó bitek nullában vannak és a vagyolás gyorsabb tehát: return (a<<4)|b ), és meg is van a konverzió. Ha azt akarod, hogy kisbetűkkel is működjön, akkor az 'A'-'F' ellenörzés előtt a 4. bitet nullázod..
A hozzászólás módosítva: Júl 7, 2015
(#) erdeidominik1999 válasza fkx hozzászólására (») Júl 7, 2015 /
 
Hú egy kicsit segítenél ebben, mert a c stringgel egyáltalán nem vagyok tisztában.
(#) fkx válasza erdeidominik1999 hozzászólására (») Júl 7, 2015 /
 
A C string egy sima karaktertömb, ahol a string végét egy nulla jelzi. Azaz a tömb ultolső bájtjába nullát kell tenni. Így könnyen kezelhető lesz, pl. ha ciklusban akarom felolvasni, akkor egyszerűen addig kell olvasni amig nullát nem kapsz. Vannak standard függvények hozzá: str() kezdettel.
(#) erdeidominik1999 válasza fkx hozzászólására (») Júl 7, 2015 /
 
Oké, de én a cserére gondoltam.
(#) fkx válasza erdeidominik1999 hozzászólására (») Júl 7, 2015 /
 
Nem írom meg helyetted a függvényt csak egy példát írok, hogy ilyen módszerrel hogyan szedem ki mondjuk a szóközöket egy C stringből. Próbáld megérteni (ha nem megy kérdezz), utána meg tudod írni magadnak amit kell.

  1. void tisztit(char *buff){
  2. char *src, *dst;
  3. src=dst=buff;
  4.  
  5. while (*src){
  6.  
  7.   if (*src != ' '){
  8.      *dst = *src;
  9.        dst++;
  10.   }//end if
  11.  
  12. src++;
  13.  
  14. }//end while
  15. *dst = 0;  //a string végét lezáró nulla
  16. }//end fv.
A hozzászólás módosítva: Júl 7, 2015
(#) erdeidominik1999 válasza fkx hozzászólására (») Júl 7, 2015 /
 
Kezdem érteni, már csak annyi kéne, hogy hogyan cserélem? Eddig jutottam:
  1. char* string="Ebben most %F3 betu van";
  2.  
  3. void setup(){
  4. Serial.begin(9600);
  5. Serial.println(string);
  6. tisztit(string);
  7. Serial.println(string);
  8. }
  9.  
  10. void loop(){
  11.  
  12. }
  13.  
  14. void tisztit(char *buff){
  15. char *src, *dst;
  16. src=dst=buff;
  17.  
  18. while (*src){
  19.  
  20.   if (*src != '%'){
  21.      *dst = *src;
  22.        dst++;
  23.   }else{
  24. Serial.println(hex2Toint(,2));  
  25.   }
  26.  
  27. src++;
  28.  
  29. }//end while
  30. *dst = 0;  //a string végét lezáró nulla
  31. string=buff;
  32. }//end fv.
  33.  
  34. unsigned char hex2Toint(char *a, unsigned int len){
  35. int i;
  36. unsigned char val = 0;
  37. for(i=0;i<len;i++)
  38. if(a[i] <= 57)
  39. val += (a[i]-48)*(1<<(4*(len-1-i)));
  40. else
  41. val += (a[i]-55)*(1<<(4*(len-1-i)));
  42. return val;
  43. }
(#) kapu48 válasza erdeidominik1999 hozzászólására (») Júl 7, 2015 /
 
Ezeket a setup elé tegyed:
  1. char* string="Ebben most %F3 bet%FB van";
  2. Serial.println(string);
  3. tisztit(string);
  4. Serial.println(string);
  5. void setup(){
  6. Serial.begin(9600);
  7. }
  8. ...
(#) kapu48 válasza kapu48 hozzászólására (») Júl 7, 2015 /
 
Már nem tudom javítani az előző hszt!

Helyesbítek:
  1. void tisztit(char *buff);
  2. unsigned char hex2Toint(char *a, unsigned int len);
  3. void setup(){
(#) fkx válasza erdeidominik1999 hozzászólására (») Júl 7, 2015 /
 
Nem, még nem érted hogy működik. Egy újabb példa, amiben a + jeleket cseréli szóközre, ha ezt jól kiegészíted akár jó is lehetne. Persze ahoz érteni kell a működését. Betehetném ide a teljes függvényt is, de akkor sosem jönnél rá magadtól.
  1. void tisztit(char *buff){
  2. char *src, *dst;
  3. src=dst=buff;
  4.  
  5. while (*src){
  6.  
  7.   if (*src != '+'){ //ha +jel jött be
  8.      *dst = ' ';    //akkor szóközt ir helyette
  9.      dst++;
  10.   }else{
  11.      *dst = *src;   //egyébként cél = forrás
  12.       dst++;
  13.   }//end if
  14. src++;
  15. }//end while
  16. *dst = 0;  //a string végét lezáró nulla
  17. }//end fv.
(#) kissi válasza fkx hozzászólására (») Júl 7, 2015 /
 
Szia!
Idézet:
„if (*src != '+'){ //ha +jel jött be”


Ez pont fordítva !
(#) fkx válasza fkx hozzászólására (») Júl 7, 2015 /
 
Látom a hex2char() megírása normális sebességűre nehézséget okoz. Ennyi lenne a konverzió ciklus nélkül, és nem kell erre óriási, csiga lassú függvényeket írni:

  1. Paraméter: 2byte hexa számjegy pointere
  2. Visszatérési érték: a hexa-ból dekódolt karakter:
  3.  
  4. char hex2char(char * hex){
  5.    if (*hex & 64) *hex += 9; *hex <<= 4; //első karakter
  6.    hex++;
  7.    if (*hex & 64) *hex += 9; *hex &= 15; //második karakter
  8. return *hex | *(hex-1);
  9. };


Ezt használom a MAC address feldolgozásakor is (persze előtte "feldarabolom")
(#) fkx válasza kissi hozzászólására (») Júl 7, 2015 /
 
Jogos az észrevétel, köszi! Legalább érti is valaki amit írtam
== kellett volna a feltételbe, és nem !=
(#) kissi válasza fkx hozzászólására (») Júl 7, 2015 /
 
OK !

Az a "baj", hogy a hex2char() is csak akkor érthető, ha valaki már papíron kipróbált egy pár átalakítást ! Ha van hely, akkor egy switch-case lehet, hogy érthetőbb !
A hozzászólás módosítva: Júl 7, 2015
Következő: »»   131 / 851
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem