Stránka 1 z 2

"Překlopení" dat Byte

Napsal: 22 lis 2019, 08:58
od vodny86
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.

Re: "Překlopení" dat Byte

Napsal: 22 lis 2019, 10:14
od kiRRow
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

Re: "Překlopení" dat Byte

Napsal: 22 lis 2019, 10:54
od vodny86
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.

Re: "Překlopení" dat Byte

Napsal: 22 lis 2019, 11:30
od gilhad

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

Re: "Překlopení" dat Byte

Napsal: 22 lis 2019, 11:55
od vodny86
: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

Re: "Překlopení" dat Byte

Napsal: 22 lis 2019, 11:55
od kiRRow
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;

Re: "Překlopení" dat Byte

Napsal: 22 lis 2019, 12:16
od KamilV
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.

Re: "Překlopení" dat Byte

Napsal: 22 lis 2019, 12:22
od vodny86
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í.

Re: "Překlopení" dat Byte

Napsal: 22 lis 2019, 12:26
od vodny86
To kouzlo je schované v tom "&0xF" co to je? :-)

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

Re: "Překlopení" dat Byte

Napsal: 22 lis 2019, 12:27
od kiRRow
(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