"Překlopení" dat Byte

Wiring, C++, C, Java, ...
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
vodny86
Příspěvky: 13
Registrován: 18 lis 2019, 15:31
Reputation: 0

"Překlopení" dat Byte

Příspěvek od vodny86 » 22 lis 2019, 08:58

Dobrý den.

Potřebuji postrčit. Mám čtečku RFID Gwion 7941E V3.0, kterou vyčítám do pole Byte. Toto pole pak vcelku pěkně vypíšu Serial.print(dataZctecky, HEX) nicméně potřebuji to nějakým způsobem překlopit nebo jak to nazvat na ideálně pole CHAR v kterém budou položkově znaky z výstupu(HEX) abych to mohl porovnávat s daty co mám na SDkartě.

Z čtečky vypadne těchto 10 Byte

Kód: Vybrat vše

BIN: 10 1010 10 1011001 0 1011111 11010110 10010010 1001010 11 
HEX: 2 A 2 59 0 5F D6 92 4A 3 
Mě z toho zajímá pouze část a to tak aby to bylo rozsekané v poli CHAR [0 5 F D ... atd]

Kód: Vybrat vše

 HEX: 0 5F D6 92 
Chtěl bych CHAR 0 5 F D 6 9 2
kód

Kód: Vybrat vše

byte nactenyZnak[3];  // pozadovany vysek
byte x[0];
int citac = 0;

void setup() {
  Serial.begin(9600);
  Serial1.begin(9600);

}

void loop() {
  while (Serial1.available() > 0) {     
      
      x[0] = Serial1.read();
      
      if (citac > 3 && citac < 8){
          nactenyZnak[citac-3] = x[0]; // Požadovaná data z karty
          Serial.print (nactenyZnak[citac-3], HEX);
          Serial.print (" ");                  
        }
                      
      citac++;
      
      if (citac >= 10){ citac = 0;} // vynulovat citac
      
      }
}
Děkuji za případné informace.

Uživatelský avatar
kiRRow
Příspěvky: 1152
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: "Překlopení" dat Byte

Příspěvek od kiRRow » 22 lis 2019, 10:14

HEX : 92
BIN : 10010010
pokud to chci rozdělit na
HEX : 9 a 2
BIN : 1001 a 0010

spodní 4bity dostanu tak, že provedu operaci 10010010 AND 00001111 ... získám tak 00000010 = 2
horní 4bity dostanu tak, že provedu operaci 10010010 AND 11110000 získám 10010000, nyní provedu bitový posuv o 4 bity směrem doprava a získám 00001001 = 9 - je i více možností jak dostat ty horní 4bity elegantněji ven ... třeba logickým posuvem >>> 4, nebo dělením

vodny86
Příspěvky: 13
Registrován: 18 lis 2019, 15:31
Reputation: 0

Re: "Překlopení" dat Byte

Příspěvek od vodny86 » 22 lis 2019, 10:54

Slušný :-D to nedám i když to říkáš dobře a asi to bude frčet.

Nešlo by nějak využít toho Serial.print(data, HEX)? že by to lezlo třebas do STRINGU? Ten už bych uměl rozpárat.

Uživatelský avatar
gilhad
Příspěvky: 779
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: "Překlopení" dat Byte

Příspěvek od gilhad » 22 lis 2019, 11:30

Kód: Vybrat vše

byte b;
byte bx[10];
char cx[20];
byte citac=0;
char ToHex[]="0123456789ABCDEF";

void loop() {
    while (Serial1.available() > 0) {     
      
        bx[citac] = Serial1.read(); 

        citac++;

        if (citac >= 10){ 
            citac = 0; // vynulovat citac
            // bx[] = [0x2, 0xA, 0x2, 0x59, 0x0 ,0x5F, 0xD6, 0x92, 0x4A, 0x3] 

            for (byte i=0;i<10;i++) {
                 cx[2*i  ] = ToHex[(bx[i]>>4) &0xF];
                 cx[2*i+1] = ToHex[ bx[i]     &0xF];
             };  // end for
             // cx[]= ['0','2','0','A','0','2','5','9','0','0','5','F','D','6','9','2','4','A','0','3']
             
             for (byte i=9; i<13;i++){
                 Serial.print(cx[i]);
             } //end for
             Serial.println(); // "05FD"+newline
        }; // end if
      
    }; // end while
} // end loop

vodny86
Příspěvky: 13
Registrován: 18 lis 2019, 15:31
Reputation: 0

Re: "Překlopení" dat Byte

Příspěvek od vodny86 » 22 lis 2019, 11:55

:shock:
Tak to je super. Klobou dolu jestli jsi toto vystřelil takhle od boku.

můžeš mi prosím vysvětli, co se děje zde?

Kód: Vybrat vše

for (byte i=0;i<10;i++) {
                 cx[2*i  ] = ToHex[(bx[i]>>4) &0xF];
                 cx[2*i+1] = ToHex[ bx[i]     &0xF];
             };  // end for
Naposledy upravil(a) vodny86 dne 22 lis 2019, 11:56, celkem upraveno 1 x.

Uživatelský avatar
kiRRow
Příspěvky: 1152
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: "Překlopení" dat Byte

Příspěvek od kiRRow » 22 lis 2019, 11:55

vodny86 píše:
22 lis 2019, 10:54
Slušný :-D to nedám i když to říkáš dobře a asi to bude frčet.

Nešlo by nějak využít toho Serial.print(data, HEX)? že by to lezlo třebas do STRINGU? Ten už bych uměl rozpárat.
celyByte = 0x92;
dolniBity = celyByte & 0x0F;
horniBity = celyByte >>> 4;

KamilV
Příspěvky: 479
Registrován: 03 dub 2018, 15:27
Reputation: 0
Bydliště: Olomouc

Re: "Překlopení" dat Byte

Příspěvek od KamilV » 22 lis 2019, 12:16

vodny86 píše:
22 lis 2019, 11:55
můžeš mi prosím vysvětli, co se děje zde?

Kód: Vybrat vše

for (byte i=0;i<10;i++) {
                 cx[2*i  ] = ToHex[(bx[i]>>4) &0xF];
                 cx[2*i+1] = ToHex[ bx[i]     &0xF];
             };  // end for
Přesně to, co jsi výše chtěl :) Máš pole bx na 10 "dvojciferných" bytů. Chceš to rozsekat na desítky a jednotky, tedy pole cx musí pojmout hodnot 20. Pak je cyklem procházíš, na sudé (2n) indexy si házíš "desítky" (textový popis již je výše), na liché (2n+1) indexy si házíš "jednotky".
Žádnou magii v tom nehledej, jen si to pomalu dávej dohromady větu po větě s tím, co zde už padlo.

vodny86
Příspěvky: 13
Registrován: 18 lis 2019, 15:31
Reputation: 0

Re: "Překlopení" dat Byte

Příspěvek od vodny86 » 22 lis 2019, 12:22

Však ano, zrovna si to tu kreslím co se kam/kdy ukládá nicméně si nedovedu furt představit toto "ToHex[(bx>>4) &0xF];" to jsem prostě nikde nikdy neviděl (tak patlám se s Arduinem tak tři týdny, tak asi proto) použité.

Je to supr když někdo vyřeší něco během chvíle co by jiný nedal za daleko delší čas. A nejlepší je, že se o to i podělí.

vodny86
Příspěvky: 13
Registrován: 18 lis 2019, 15:31
Reputation: 0

Re: "Překlopení" dat Byte

Příspěvek od vodny86 » 22 lis 2019, 12:26

To kouzlo je schované v tom "&0xF" co to je? :-)

Jinak to dává smysl a je to dobré, velmi dobré

Uživatelský avatar
kiRRow
Příspěvky: 1152
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: "Překlopení" dat Byte

Příspěvek od kiRRow » 22 lis 2019, 12:27

(bx>>4) &0xF znamená aritmeticky posuň hodnotu o 4bity do prava a proveď AND s 0xF .... 0xF binárně je 00001111 (radši to ale zapisuji 0x0F)
já použil logický posuv >>> a ten na začátek vkládá dycky nulu ... proto se to nemusí "maskovat" 0x0F

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 12 hostů