lockdog Skrevet 24. februar 2009 Del Skrevet 24. februar 2009 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
Thorsen Skrevet 24. februar 2009 Del Skrevet 24. februar 2009 (endret) 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 24. februar 2009 av Thorsen Lenke til kommentar
lockdog Skrevet 24. februar 2009 Forfatter Del Skrevet 24. februar 2009 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
Thorsen Skrevet 24. februar 2009 Del Skrevet 24. februar 2009 (endret) 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 24. februar 2009 av Thorsen Lenke til kommentar
lockdog Skrevet 24. februar 2009 Forfatter Del Skrevet 24. februar 2009 http://www.cplusplus.com/reference/clibrary/cstdio/gets.html kan eventuellt bruke scanf() Lenke til kommentar
Thorsen Skrevet 24. februar 2009 Del Skrevet 24. februar 2009 Les referansen: And second, gets does not let you specify a limit on how many characters are to be read, so you must be careful with the size of the array pointed by str to avoid buffer overflows. skal vel da være gets(motatt) og ikke gets(motatt,5); Lenke til kommentar
lockdog Skrevet 24. februar 2009 Forfatter Del Skrevet 24. februar 2009 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
Thorsen Skrevet 24. februar 2009 Del Skrevet 24. februar 2009 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
lockdog Skrevet 24. februar 2009 Forfatter Del Skrevet 24. februar 2009 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
Thorsen Skrevet 24. februar 2009 Del Skrevet 24. februar 2009 (endret) 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å 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 24. februar 2009 av Thorsen Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå