Hoe bij ontvangen van bepaalde HEX-waarde een antwoord in HEX-waarde terugsturen

Ik heb onderstaande snippet gevonden, als de ontvangen waarde 2 (ASCII) is, zend dan AB 9F 21 0E 49 (HEX) terug naar de seriële poort.

char DATA[] = {0xAB, 0x9F, 0x21, 0x0E, 0x49};

byte val = 0;

void loop() {
  while (Serial.available() > 0) {
    val = Serial.read();

    if (val == '2') {
      for (byte i = 0; i < sizeof(DATA); i++)(Serial.print(DATA[i]));

    }
  }
}

In mijn geval wil ik bij het ontvangen van een bepaalde HEX-waarde (i.p.v. ASCII) een HEX waarde terugsturen naar de seriële poort.

Dus als voorbeeld, als de ontvangen HEX-waarde 01 02 23 00 01 00 1E is dan moet HEX-waarde AB 9F 21 0E 49 (HEX) teruggestuurd worden naar de seriële poort.
De ontvangen HEX-waarde heeft geen vaste lengte dus kan kort of langer zijn.

Hoi Jeroen.

Je vraag past een beetje bij je snippet of code. Want jij weet de context en dus precies wat je bedoelt, maar wij als buitenstaander hebben geen idee over de context. Daarom word het wat lastig om jouw vraag te beantwoorden zonder te gaan gokken.

Ik zie dat je in je voorbeeld 7 hex posities ontvangt (maar dat kan dus variëren), en er 5 in je antwoord zet. Is er enige relatie tussen de ontvangen data en de te verzenden data, en wat is die relatie dan ? Is er een beperkt aantal antwoorden die je in een array zou kunnen zetten ?

Een hex waarde (bijvoorbeeld FF) word genoteerd als 0xFF, en zo weet de compiler dat het dus een hex waarde betreft. Bij seriele communicatie worden altijd dit soort gegevens verstuurd. Het is aan de ontvanger hoe die daar mee omgaat.

In jouw programma kun je dus testen op de ontvangst van 0x0102230001001E, en daar dan gepast op reageren door 0xAB9F210E49 terug te sturen. Maar een en ander is dus afhankelijk van hoe deze waardes correleren (de context dus).

Als voetnoot: 0x0102230001001E is een heel groot getal. Het kan zijn dat je dat als zodanig niet zomaar kunt verwerken met je Arduino code. Dan zou je bijvoorbeeld kunnen overwegen om het getal in hapklare brokken op de delen, zoals 0x0102, 0x2300, 0x01001E. Daar zou je dus nog wat onderzoek naar kunnen verrichten.

Hoi MAS3

Het is allemaal een beetje moeilijk uit te leggen.

Project is een apparaat die met een smartcard communiceert over WIFI.

De ene ESP-module zit verbonden met de smartcard en aan de andere kant is de ESP-module verbonden met het apparaat.

Heb de data op de I/O-lijn gesnift en uitgesplitst en heb gezien dat het apparaat vragen stelt aan de smartcard en dat de smartcard dan antwoord geeft. De data in HEX is voor mij herkenbaar.

Omdat de datacommunicatie tussen het apparaat en smartcard via de ESP-modules tijdens de verificatie te langzaam is komt het apparaat met een foutmelding.

Dit komt omdat het apparaat waarschijnlijk beveiligd is voor knutselaars als ik en ze hebben de tijd dat de verificatie voltooit moet zijn zo krap gezet dat dit waarschijnlijk alleen met een smartcard rechtstreeks in het apparaat lukt.

Om te kijken of ik het toch werkend kan krijgen wil ik de verificatie sneller laten verlopen. Ik wil alle antwoorden van de smartcard die elke keer hetzelfde zijn vanuit de ESP-module laten beantwoorden waardoor 90-95% van de dataoverdracht niet via beide ESP-modules over WIFI heen en weer gestuurd hoeft te worden.

Dus als het apparaat een vraag stelt die in de ESP-module voorkomt dan antwoord de ESP-module op deze vraag. Komt het antwoord niet in de ESP-module voor dan is het de bedoeling dat de vraag doorgestuurd gaat worden naar de smartcard waarna de smartcard alsnog het antwoord geeft.

Ik weet nu dus wel hoe ik het antwoord in HEX naar het apparaat moet sturen (apparaat herkend dit ook) maar zoek nu een manier dat de vraag in HEX herkend word zodat hij het bijbehorende antwoord kan antwoorden.

Hallo, kun je aub in het vervolg aub je programma plaatsen tussen code tags inplaats van in een tabel. En als je het eerst in IDE fatsoenlijk uitlijnt (tools → autoformat) ziet het er vervolgens zo uit.

char DATA[] = {0xAB, 0x9F, 0x21, 0x0E, 0x49};

byte val = 0;

void loop() {
  while (Serial.available() > 0) {
    val = Serial.read();

    if (val == '2') {
      for (byte i = 0; i < sizeof(DATA); i++)(Serial.print(DATA[i]));

    }
  }
}

Zijn alle berichten die je ontvangt dezelfde lengte? Wat is de lengte?

Als de berichten kort zijn, kun je ze opslaan in een array. En vervolgens memcmp() gebruiken om het te vergelijken.

Als je berichten een vaste lengte hebben of een start en een eind van bericht (eerste en laatste byte is altijd hetzelfde) hebben is het opslaan redelijk eenvoudig. Als dat niet het geval is wordt het gecompliceerder en zul je misschien je tijdwinst kwijt raken.

Kun je een lijst geven van alle ontvangen berichten die je wilt beantwoorden?

je kunt toch elke karakter die je ontvangt op allerlei manieren laten zien, bijvoorbeeld byte(x) en zo zijn er nog veel meer.