Ongelma ratkaistavaksi

Kuinka käsitellä C :ssa arrayta? Minun pitäisi parsia sarjaporttiviestistä tiettyjä osia erilleen. Esimerkkiviesti voi olla tällainen (Hex-arvoja):

02 31 32 1F 31 1F 32 1F 34 35 36 1F 31 31 1F 03

Kuten huomata saattaa, koostuu viesti aloitusmerkistä 02 ja lopetusmerkistä 03. Jokainen arvo erotellaan merkillä 1F. Eli viestissä on numeeriset arvot 12, 1, 2, 456 ja 11. Eli minun tulisi tällaisista viesteistä parsia nuo numeeriset arvot koottuina (eli 31 31 = 11) jne. Arvot tulisi lukea vaikkapa int -tyylisiin muuttujiin, esim.

i = 12
y = 1
x = 2
z = 456
j = 11

Nyt ei sytytä kuinka tämä onnistuisi parhaiten. Sarjaporttiviesti on unsigned char -arrayssä.
4337
Äänestä

Muut lukivat myös

Vastaukset 4

Vanhimmat

Eikö tuo onnistuisi käsittelemällä tavu kerrallaan?

unsigned char -taulukossa jokainen elementti on yhden tavun. Mitä, jos lukee esim. tavun 34 ja nollaa ylimmät 4 bittiä (0000111 AND 34 => 04), jolloin 3:n on poistettu.

Nyt pitää mahdollisesti lukea seurava arvo. Tässä tapauksessa se on 35, mikä pitää käsitellä kuin aikaisempi luku.

Nämä luvut voidaan yhdistää shiftaamalla ensimmäistä lukua 4 bittiaskelta vasemmalle (vastaa kertomista 16, 16-lukujärjestelmä) ja summaamalla uusi luku shiftattuun lukuun. Tätä pitää jatkaa kunnes tulee 1F.

Tässä on sama logiikka kuin kymmenjärjestelmän luvuilla. Esim. 35 37 39 on (5*10 7)*10 9=579).

Äänestä

näyttäisi olevan ihan ascii string muodossa nuo luvut taulukossa. Yksi tapa olisi käydä taulukko läpi ja asettaa jokaisen 1f, 02, tilalle välilyönti. Sitten 03 tilalle 0 eli NULL joka merkkaa merkkijonon loppumista. Sitten vain scanf funkkarilla luvut talteen muuttujiin.

Äänestä
  • ..eli vielä korjauksena, että fscanf funkkarilla luvut talteen.

    Äänestä

#include
#include
#include

int main(void)
{
unsigned char msg[17];
char delims[4];
char *tok;

delims[0] = 0x1f;
delims[1] = 0x02;
delims[2] = 0x03;
delims[3] = 0x00;

msg[ 0] = 0x02;
msg[ 1] = 0x31;
msg[ 2] = 0x32;
msg[ 3] = 0x1f;
msg[ 4] = 0x31;
msg[ 5] = 0x1f;
msg[ 6] = 0x32;
msg[ 7] = 0x1f;
msg[ 8] = 0x34;
msg[ 9] = 0x35;
msg[10] = 0x36;
msg[11] = 0x1f;
msg[12] = 0x31;
msg[13] = 0x31;
msg[14] = 0x1f;
msg[15] = 0x03;
msg[16] = 0x00;

tok = strtok((char *) msg, delims);

while (tok != NULL)
{
printf("tok = %d\n", atoi(tok));
tok = strtok(NULL, delims);
}

return 0;
}

Tolla luulis pääsevän alkuun. Alotus- ja lopetusmerkit pitää tietysti hoitaa järkevämmin.

Äänestä

Kommentoi aloitusta


Dell_ kirjoitti:

Kuinka käsitellä C :ssa arrayta? Minun pitäisi parsia sarjaporttiviestistä tiettyjä osia erilleen. Esimerkkiviesti voi olla tällainen (Hex-arvoja):

02 31 32 1F 31 1F 32 1F 34 35 36 1F 31 31 1F 03

Kuten huomata saattaa, koostuu viesti aloitusmerkistä 02 ja lopetusmerkistä 03. Jokainen arvo erotellaan merkillä 1F. Eli viestissä on numeeriset arvot 12, 1, 2, 456 ja 11. Eli minun tulisi tällaisista viesteistä parsia nuo numeeriset arvot koottuina (eli 31 31 = 11) jne. Arvot tulisi lukea vaikkapa int -tyylisiin muuttujiin, esim.

i = 12
y = 1
x = 2
z = 456
j = 11

Nyt ei sytytä kuinka tämä onnistuisi parhaiten. Sarjaporttiviesti on unsigned char -arrayssä.

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu