Gå til innhold

Konvertere en char til int


Anbefalte innlegg

Heisann

 

Sliter litt med programmering av en mikrokontroller.

Mikrokontrolleren skal motta en string over RS232, som sendes fra en delphi-program med denne strengen:

WriteFile(hCom,Pchar(Item9Value+Item10Value+Item11Value+Item12Value+chr(13))^, 5,AntallTegn,nil);

Alle de fire ItemXValue er ett siffer.

Jeg ønsker å plukke ut disse 4 verdiene i mikrokontrolleren, som er programmert i C.

Pr.nå ser koden slik ut;

int overstyrM1=0;
int overstyrM2=0;
int overstyrM3=0;
int auto=0;
char motatt [5];

gets(motatt,5);
overstyrM1=motatt[1];
overstyrM2=motatt[2];
overstyrM3=motatt[3];
auto=motatt[4];

Men dette ser ikke ut til å fungere.

Det virker som mikrokontrolleren blir hengende igjen i koden her en plass, for logikken lengere ned blir aldri eksekvert.

 

Noen tips?

Lenke til kommentar
Videoannonse
Annonse

hva med denne rutinen gets(motatt,5);

 

Sett en av pinnene på uC høy før denne rutinen og til lav etter den er utført, du kan da enkelt måle om du henger deg opp her :) Eventuelt bruk debugging dersom du har muligheten.

 

Er du sikker på at RS-232 overføringsparametere hos datamaskin og uC er satt opp riktig ?

 

Edit: dersom du ikke trenger mer enn 8 bit for representasjon av verdiene i uC er det ingen vits i å gjøre dem om til int heller, kan jo bare være char. Hvor stor er en int i din uC, 16/32 bit ?

Endret av Thorsen
Lenke til kommentar

Alt er satt opp riktig. Har fått overført en del strenger og slikt før.

Konvertering av strenger med atoi() går finfint, men plukke ut enkle chars fra en streng og bruke de som integer var litt vanskeligere.

 

gets(motatt,5); mottar en string fra rs232 porten på mikrokontrolleren, 5 chars lang og putter de i "motatt".

 

Så hele greia er egentlig:

 

Jeg har en string, 5 i lengde, og vil plukke ut enkle chars og bruke de som inter.

How?

Lenke til kommentar

Vel ut fra det jeg ser så er det ikke noe feil.

 

motatt skal inneholde et sett med chars, og resten av koden vil virke dersom den gjør det.

 

Du skal enkelt kunne bruke int a = motatt[0] og lagre denne charren som en int. Gitt at motatt[0] faktisk inneholder en char.

 

Det eneste jeg kan tenke meg er at du kan se litt på forskjell med tabeller og pekere, vil gjerne se koden for gets() rutinen din.

 

Edit: Se eksempelkode:

 

	char motatt[5];

//simulerer din gets rutine
char *peker = motatt;
int i = 0;
while(i<5){
	*peker = i;
	i++;
	peker++;
}

int a = motatt[0];
int b = motatt[1];
int c = motatt[2];
int d = motatt[3];
int e = motatt[4];

printf("%d \n",a);
printf("%d \n",b);
printf("%d \n",c);
printf("%d \n",d);
printf("%d \n",e);

 

Denne vil printe følgende:

 

0

1

2

3

4

Endret av Thorsen
Lenke til kommentar

Hm, viste ikke at det var forskjellige versioner av funksjonen, beklager.

 

char *gets(char *str, unsigned char len)

inputs, using getchar, the character string str terminated by the new line character.

The new line character will be replaced with 0.
The maximum length of the string is len. If len characters were read without encountering the new line character, then the string is terminated with 0 and the function ends.
The function returns a pointer to str.

Lenke til kommentar

Litt mer:

 

Husk at dersom du overfører verdiene som strings vil de bli kodet i ASCII. For å få den egentlige verdien må du da trekke fra ASCII verdien til 0.

 

Eksempel:

 

	char motatt[5];

  gets(motatt);

  int a = (motatt[0]-'0');
  int b = (motatt[1]-'0');
  int c = (motatt[2]-'0');



  printf("%d \n",a);
  printf("%d \n",b);
  printf("%d \n",c);

 

 

Kjører du dette i konsoll på pc og skriver inn 123 (+enter) vil du få printet ut

 

1

2

3

 

Dersom du derimot ikke tar med -'0' som trekker fra ASCII verdien til 0 vil du få ut.

 

49

50

51

 

(som er ASCII verdiene til 1,2,3)

Lenke til kommentar

Om jeg sender '255'+char(13), og har følgende kode i kontrolleren:

int ut;
char motatt [4];

gets(motatt,4);
ut=atoi(motatt);
PORTB=ut;

 

så settes alle bittene på port B høyt. (Port B er en 8-bits utgangsmodul, hvor 0-255 tilsvarer utgangsbittene)

 

Og da slipper jeg å trekke i fra '0'.

 

 

Tuklete at man ikke får debugga mikrokontrolleren :(

Lenke til kommentar

Hm.

 

Hvorfor kan du ikke bruke char ?

 

PORTB = motatt[0];

 

PORTB er jo ikke bredere enn 8 bit uansett ?

 

Jo fordi du sender '255' + CR ikke sant.

 

Du sender altså egentlig 3 bytes først 2 så 5 og så 5. (+ cr)

 

motatt[0] = 2 altså 0x02 eller 0b00000010 og ikke 0xFF eller 0b11111111.

 

Håper det oppklarte litt, jeg forsto iallefall bedre hva du mente nå :D

 

Dersom det du ønsker er å styre en port via PCen ville jeg heller sendt styresignalene direkte som hex, det er så mye lettere å jobbe med.

 

Edit: eller vent, begynner å bli litt trøtt nå kan være jeg missforstår :S

Endret av Thorsen
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...