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ä.
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ä.
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).
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.
..eli vielä korjauksena, että fscanf funkkarilla luvut talteen.
#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.