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ří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.
-
kiRRow
- Příspěvky: 1152
- Registrován: 07 kvě 2019, 07:03
- Reputation: 0
- Bydliště: Opava
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
Příspěvek
od vodny86 » 22 lis 2019, 10:54
Slušný
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.
-
gilhad
- Příspěvky: 779
- Registrován: 07 bře 2018, 11:22
- Reputation: 0
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
Příspěvek
od vodny86 » 22 lis 2019, 11:55
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.
-
kiRRow
- Příspěvky: 1152
- Registrován: 07 kvě 2019, 07:03
- Reputation: 0
- Bydliště: Opava
Příspěvek
od kiRRow » 22 lis 2019, 11:55
vodny86 píše: ↑22 lis 2019, 10:54
Slušný
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
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
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
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é
-
kiRRow
- Příspěvky: 1152
- Registrován: 07 kvě 2019, 07:03
- Reputation: 0
- Bydliště: Opava
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
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 12 hostů