unsigned char összehasonlítás

 ( 1soproni | 2017. július 13., csütörtök - 19:07 )

Sziasztok!

Sajnos C++-ban nem vagyok otthon, de mivel az arduino erre épül, szükségem lenne egy kis segítségre.
CAN bus-ról kiolvasott adatokat szeretnék feldolgozni.
A jelenlegi állapot így néz ki

#include
#include "mcp_can.h"
#define DEBUG_MODE
unsigned char stmp[8] = {0xA7, 0x00, 0x54, 0x35, 0x44, 0x35, 0x20, 0x20};

void setup()
{
Serial.begin(38400);

if(CAN_OK == CAN.begin(CAN_500KBPS))
{
CAN.mcp2515_setCANCTRL_Mode(MODE_CONFIG);
//CAN.init_Mask(1, 1 , 0x000);
#ifdef DEBUG_MODE
CAN.mcp2515_setCANCTRL_Mode(MODE_LOOPBACK); // Loopback for debug
#else
CAN.mcp2515_setCANCTRL_Mode(MODE_LISTENONLY);
#endif
Serial.println("CAN BUS Shield init ok: ");
break;
}
}
}

void loop()
{
unsigned char len = 0;
unsigned char buf[8];
CAN.sendMsgBuf(0x1800008, true, 8, stmp); // If this is true I don't get anything back, false I do.
if(CAN_MSGAVAIL == CAN.checkReceive()) // check if data coming
{
CAN.readMsgBuf(&len, buf); // read data, len: data length, buf: data buf
unsigned int canId = CAN.getCanId();
Serial.println("-----------------------------");
Serial.print("Get data from ID: ");
Serial.println(canId, HEX);
for(int i = 0; i

Mivel a DEBUG_MODE be van kapcsolva, így amit küldök (CAN.sendMsgBuf), azt vissza is kapom (CAN.readMsgBuf).
Elsőként hogyan tudom összehasonlítani, hogy tényleg egyeznek -e? (Ahogy olvastam, unsigned char-t memcmp-vel lehet összehasonlítani)
A jelenlegi kimenetem ez:
-----------------------------
Get data from ID: 8
A7 0 54 35 44 35 20 20

Befelé még 0xA7 formátum ment, de kiolvasva már csak A7.
A memcmp(stmp,buf,8) szerint nem egyeznek.

A végső cél, hogy a különböző CAN üzenetekre más-más választ küldjek vissza. Ezt meg lehet oldani case vezérlővel?

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

A memcmp teljesen jo. A case-t erre nem ajanlom (elvileg bele lehetne tenni egyetlen 64 bites intbe, es utana talan tud vele valamit kezdeni a switch-case, de nem ajanlom uC-re). Az if(memcmp(...)){}else if(memcmp(...)){}, stb. jobb lesz ide.

A memcmp visszateresi erteket nezted, hogy hogy mukodik? Olyan, mint a strcmp es tarsai, szoval akkor 0, ha egyezik a ketto, es akkor !=0 ha nem (ilyenkor <0 ha az elso, >0 ha a masodik lenne elobb ABC sorrendben). Ha 0-at kaptal, akkor pont, hogy egyezik!
Az Arduinos Serial.print* meg ugy mukodik, hogy ha hexadecimalist kersz tole, akkor nem egesziti ki 2 digitre, es nincs elotte a 0x, de attol meg ugyanaz az ertek.

Ja, a kodod le van vagva, a &lt; a <, a &gt; pedig a > jel.

--
A strange game. The only winning move is not to play. How about a nice game of chess? - Wargames

Köszi.
Tényleg 0. Valami az utána lévő if ággal nem stimmelt (úgy teszteltem)
A sok if helyett tényleg nincs jobb ötlet? Lesz kb 15-20 else if... :-/

Nem ismerem a CAN protokolljat, van valami struktura a kapott bytehalmazban? Ha van koztuk olyan byte, ami pl. az uzenettipust jelenti, akkor arra mar mehet a switch-case.

--
A strange game. The only winning move is not to play. How about a nice game of chess? - Wargames

Köszönöm :-)

Csak én gondolom azt, hogy ilyen vezérlési szerkezetek esetén - például tokenek, kulcsszavak értelmezése - táblázatba kell tenni a konstans stringeket, s egy ciklussal végigmenni az egyes elemeken, s egyetlen feltételes utasítást kell írni bele? Mármint a ciklusmagba. Valahogy az elég idétlen, hogy van 43 db if, vagy egy switch-ben egy rakás case. Meg kellemetlen a bővítése, módosítása is.


tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Megteheted azt is. Pl. lehet egy strukturad, amiben benne vannak a tombjeid, es mellette a valaszaid, vagy a valaszt generalo fuggvenyekre mutato pointerek. Vagy szervezheted pl. faba, szamolhatsz hasht, es akkor gyors is lesz. Hash eseten meg a switch-case is jo ha nincs sok lehetseges uzenetfajta.
De lehet if(memcmp)-bol egy par, es a torzseben 1-1 fuggvenyhivas vagy egyszerubb esetben ertekadas. Ha nincs sok uzenetfajta, akkor nem problema. Nemtom CAN-en fix hosszuak-e az uzenetek, esetleg valami hierarchiaban vannak-e (pl. HTTP status kodoknal a 2 a jo, 3 az atiranyitas es tarsai, 4-5 kulonbozo jellegu hiba), az is segithet esszerubben szervezni a kododat. A switch-case viszont nem lesz praktikus, ha 8+ byte hosszu integerekre akarod hasznalni mikrokontrolleren.

--
A strange game. The only winning move is not to play. How about a nice game of chess? - Wargames

Ez a struktúrás megoldás tetszik. Köszönöm

Annyit tennék hozzá, hogy ha esetleg nagyon gyorsnak kell lenni (tehát ha a mérés, vagy gyakorlat szerint az elágazásról kiderül, hogy lassú), akkor a leggyorsabban úgy lehet a parancsokat felismerni, hogy a processor natív regisztermérete szerinti bitszámokra bontod a parancsot, és azok szerint csinálsz egymásba ágyazott switch-case-eket. Tehát pl, ha a processzor 8 bites, akkor bájtonként lehet switch-elni.

Elég melós és totál átláthatatlan, cserébe igen gyors. Példa: https://pastebin.com/XGR2DNJN

.