 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
juref Član


Pridružen-a: Tor 15 Dec 2009 11:45 Prispevkov: 226 Aktiv.: 1.20 Kraj: Črnomelj
|
Objavljeno: Ned Maj 20, 2012 6:45 pm Naslov sporočila: UART pomoč |
|
|
Pozdravljeni!
Imam problem, ter ga ne vem rešiti zato sem se obrnil na vas. Uporabljam USART knjižnico Peter Fleury za povezavo z računalnikom. V Labview sem izdelal program z katerim bi krmilil PWM na ATMega8. Na AVR pošiljam string podatek, zajemam ga pa z getc() funkcijo katera prejema samo podatke tipa char. Potreboval bi pa podatek tipa integer. Zamislil sem si postopek tako da bi pretvoril prejeti char v strig, z funkcio atol() bi pa string spremenil v long integer.
Ali sem si to prav zamislil?
Prosil bi za vaša mnenja ter nasvete.
Najlepša hvala ter prijeten dan! |
|
Nazaj na vrh |
|
 |
besoft Član



Pridružen-a: Ned 01 Apr 2012 10:22 Prispevkov: 585 Aktiv.: 3.64 Kraj: Žižki - Prekmurje
|
Objavljeno: Ned Maj 20, 2012 7:05 pm Naslov sporočila: |
|
|
zakaj pa nebi enostavno pretvoril z val() funkcijo? |
|
Nazaj na vrh |
|
 |
aly Član



Pridružen-a: Tor 28 Sep 2004 14:51 Prispevkov: 9407 Aktiv.: 39.69 Kraj: Kranj - struževo
|
Objavljeno: Ned Maj 20, 2012 7:41 pm Naslov sporočila: |
|
|
Če bi rad imel integer, recimo 16 bitov dolg, za to rabiš dva Char podatka (char = 8 bitov).
Torej dva podatka sprejmeš: A=getc(); B=getc();
in narediš integer: M=(A<<8)|B;
A je v tem primeru MSB (zgornjih 8 bitov), B pa LSB (spodnjih 8 bitov).
Za 32-bitno cifro je podobno: A=getc(); B=getc(); C=getc(); D=getc();
in narediš integer: M=(A<<24)|(B<<16)|(C<<8)|D;
 _________________ I'm going to stand outside, so if anyone asks, I'm outstanding  |
|
Nazaj na vrh |
|
 |
juref Član


Pridružen-a: Tor 15 Dec 2009 11:45 Prispevkov: 226 Aktiv.: 1.20 Kraj: Črnomelj
|
Objavljeno: Ned Maj 20, 2012 8:16 pm Naslov sporočila: |
|
|
hvala lepa! ampak še vedno ne deluje :S
za test sem napisal naslednji programček
Koda: |
.
.
.
char A;
char B;
int M;
main()
{
uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );
while(1)
{
A = uart_getc();
B = uart_getc();
M=(A<<8)|B;
if (M = 1023) PORTD = 0b00110000;
if (M = 0) PORTD = 0b11000000;
}
return 0;
} |
v labview sem naredil tipko z katero pošljemo strin "0" ali string "1023", v programu pa preverjal če je M enak 1023 se ene lučke prižgejo drugač druge. Program dela z enim znakom, ampak jaz bi to rabil za krmiljenje pwm-ja |
|
Nazaj na vrh |
|
 |
gregoral Član

Pridružen-a: Pet 24 Nov 2006 9:42 Prispevkov: 688 Aktiv.: 3.04 Kraj: Ljubljana
|
Objavljeno: Ned Maj 20, 2012 10:20 pm Naslov sporočila: |
|
|
Živjo!
To kar ti je aly napisal bi veljalo če bi pošiljal integer v binarni obliki!
Če pa sem pravilno razumel tvoj post pa pošiljaš kot string.
Torej če pošiljaš string "1234" recimo, je pretvorba zelo enostavna.
Predvidevam da v resnici pošiljaš 5 znakov: '1', '2', '3', '4', '\0'
Vrednost je 1234 je tako 1*1000 + 2*100 + 3*10 + 4
Koda: |
int i;
char c;
i = 0;
// recimo da bereš takole (do null terminatorja)
while('\0' != (c = uart_getc()))
{
//če še nismo na koncu morajo biti prejšnje cifre "pomnožene" z 10
i = i * 10;
// '0' ima ascii vrednost 48
i += c - '0';
}
// i ima sedaj željeno vrednost
|
Za tvoj primer bo tole mogoče ok, odvisno kaj boš s tem krmilil.
Če lahko potencialno kaj uničiš ker bo pwm "previsok" potem ne bo ok.
Na splošno glede komunikacije:
- vgraditi moraš detekcijo napak (to je skoraj nujno)
- med napravami pošiljaj sporočila (začetek + podatki + kontrolna vsota)
- za to da veš kdaj se začne nov paket uporabi: a) dovolj dolgo "tišino" b) kakšen znak ki se sicer nikoli ne pojavi v podatkih
- paketi naj imajo crc ali podoben mehanizem da ugotoviš če so podatki "verjetno ok"
- če je napaka pri sprejemu pošiljatelju odgovoriš z crc error (ali podobnim obvestilom o napaki)
- podatke nazaj zopet pošiljaj v paketih
- ...
Skratka napake pri prenosih se dogajajo in program naj bo napisan tako da to zazna.
LP, Gregor |
|
Nazaj na vrh |
|
 |
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 496 dni
Powered by phpBB © 2001, 2005 phpBB Group
|