Keil i komunikacja - problem.



Masz problem? Zapytaj na forum elektroda.pl

Poprzedni Następny
Wiadomość
Spis treści
From: "Bartosz Waleska" <combosoft_at_nospam_poczta.onet.pl>
Subject: Keil i komunikacja - problem.
Date: Mon, 24 Feb 2003 20:56:59 +0100


Witam wszystkich,
Kiedys poruszalem juz ten problem, ale wowczas watek sie urwal... wracam
wiec ponownie.

mam taki kod w Keil uVision 2.12:

#include <AT89X52.H>
#include <stdio.h>
#include <adds.h>
#include <ctype.h>

char znaki[10];

SCON = 0x52; /* SCON */
TMOD = 0x20; /* TMOD */
TCON = 0xD0; /* TCON */
TH1 = 0xFD; /* TH1 */

gets(znaki,10);
puts("ABC");
puts(znaki);

I wszystko dziala kiedy wysylam 1234567890 wtedy otrzymuje 123...90 ABC
123..90
, ale nie dziala jezeli wysle #13 #10 #10 12345 #13 #10
Znaki z # oznaczaja kolejne numery ascii czyli #13 ZTCP nowa linia itd.
Program testuje na AT89C52, do wysylania i odbierania danych uzywam wlasnego
programu. Caly system
dziala poprawnie na zrodlach napisanych w ASM51.
W drugim przypadku otrzymuje #13#10 #13#10 #13#10 245 ABC 245

Niezbyt wiem dlaczego sie tak dzieje. Probowalem juz wielu "zagrywek", ale
niestety nie moge sobie z tym poradzic. Mam jeszcze pytanie dodatkowe, czy
gdzies w sieci sa proste (wrecz elementarne) programy dla Keila? Chodzi mi o
wlasnie prace na zmiennych, odbieranie wysylanie danych, praca na lancuchach
itd. Oczywiscie wiem o programach example dostarczonych wraz z keilem.

Pozdrawiam,
Bartek.









========
Path: news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!lublin.pl!news.icm.edu.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: "Zbych" <bzb_at_nospam_USUN_TO.poczta.onet.pl>
Subject: Re: Keil i komunikacja - problem.
Date: Mon, 24 Feb 2003 23:23:16 +0100



gets(znaki,10);
puts("ABC");
puts(znaki);

Jeżeli to jest cały program ( nie ma pętli ) to wogóle dziwne,
że wypisuje cokolwiek poza znakami końca linii i ciągiem ABC.
A jeśli całość jest w pętli to spróbuj wysyłać znaki ręcznie
z terminala (choćby nortonowskiego term95) i zobacz co się
dzieje.


=======

Poprzedni Następny
Wiadomość
Spis treści
From: "Krzyku" <krzyku123_at_nospam_poczta.fm>
Subject: Re: Keil i komunikacja - problem.
Date: Tue, 25 Feb 2003 00:32:20 +0100



Użytkownik "Bartosz Waleska" <combosoft_at_nospam_poczta.onet.pl> napisał w wiadomości
news:b3dtim$2dl$1_at_nospam_news.onet.pl...
gets(znaki,10);
puts("ABC");
puts(znaki);


AFAIR funkcja gets() dziala tak ze przyjmuje znaki i zapisuje je do bufora
az do pobrania znaku '\n' nowej linii (kod #0AH czyli #10) po czym odebrany
znak nowej linii zastepuje w buforze znakiem NULL. Wydaje mi sie ze jezeli
chcesz odebrac pelny ciag znakow, powinienes uzyc funkcji getchar() w petli
bo gets() po kazdym odebranym znaku #10 zakancza swoja dzialalnosc.
Mam nadzieje ze nic nie pokielbasilem.....

Krzyku





========
Path: news-archive.icm.edu.pl!mat.uni.torun.pl!news.man.torun.pl!news.icm.edu.pl!news.onet.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: "Bartosz Waleska" <combosoft_at_nospam_poczta.onet.pl>
Subject: Re: Keil i komunikacja - problem.
Date: Tue, 25 Feb 2003 21:31:52 +0100


AFAIR funkcja gets() dziala tak ze przyjmuje znaki i zapisuje je do bufora
</ciach>


Masz racje... o to chodzilo...
No ale teraz mam jeszcze jeden problem... banalnosc tego problemu jest
olbrzymia, ale od 3h nie moge nic ciekawego wymyslec a probowalem juz
wiele...

Jak wspomniales musze wykorzystac funkcje getchar(), ale chcialbym by
zbudowana procedura (funkcja) zwracala mi lancuch odberanych znakow, staram
sie wiec to robic tak:

char *odbierz(int ile){
int i;
char *dane;
dane="";
for (i=0;i != ile; i++){
dane=dane,getchar();
}
return dane;
}

ale nie dziala mi suma lancuchow... przegladajac dokumentacje w przypadku
printf dane sa oddzielane ",", ktory jak rozumiem jest czyms co teraz
potrzebuje, niestety to nie dziala. Probowalem jeszcze cos takiego:

for (i=0; i!=ile, i++){
dane[i]=getchar();
}

Ale to rowniez nie dziala...
Banalna rzecz, ale nie moge sie tego doszukac w dokumentacji...

pozdrawiam,
bartek.



=======

Poprzedni Następny
Wiadomość
Spis treści
From: "Krzyku" <krzyku123_at_nospam_poczta.fm>
Subject: Re: Keil i komunikacja - problem.
Date: Wed, 26 Feb 2003 01:17:59 +0100



Użytkownik "Bartosz Waleska" <combosoft_at_nospam_poczta.onet.pl> napisał w wiadomości
news:b3gjvq$e1p$1_at_nospam_news.onet.pl...

zbudowana procedura (funkcja) zwracala mi lancuch odberanych znakow,

char *odbierz(int ile){
int i;
char *dane;
dane=""; // nie bardzo kumam
co tu sie dzieje
for (i=0;i != ile; i++){
dane=dane,getchar(); // szczerze? nie spotkalem
sie z takim zapisem i nie bardzo wiem co znaczy :)
}
return dane;
}
wydaje mi sie ze lepiej byloby zdefiniowac jakias tablice poza cialem
funkcji jesli chcesz zmagazynowac odebrane znaki np

//--------------------------------------------------------------
unsigned char bufor[50];

unsigned char *odbierz(unsigned char ile, unsigned char *gdzie)
{
unsigned char i;
for(i=0;i!=ile;i++)
*(gdzie+i) = getchar();
return gdzie;
}
//---------------------------------------------------------------
wywolujesz ta funkcje np:
wskaznik = odbierz(30, bufor);
teraz wystarczy napisac procedure odczytu spod adresu zawartego we
"wskaznik";

printf dane sa oddzielane ",", ktory jak rozumiem jest czyms co teraz
potrzebuje, niestety to nie dziala

poczytaj o funkcji printf i jej formatowaniu (o typach danych)

pozdrawiam,

wzajemnie

Krzyku



========
Path: news-archive.icm.edu.pl!mat.uni.torun.pl!news.man.torun.pl!news.icm.edu.pl!news.atman.pl!newsfeed.gazeta.pl!news.onet.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: jfox_at_nospam_poczta.onet.pl (J.F.)
Subject: Re: Keil i komunikacja - problem.
Date: Wed, 26 Feb 2003 18:24:49 GMT


On Tue, 25 Feb 2003 21:31:52 +0100, Bartosz Waleska wrote:
Jak wspomniales musze wykorzystac funkcje getchar(), ale chcialbym by
zbudowana procedura (funkcja) zwracala mi lancuch odberanych znakow, staram
sie wiec to robic tak:

char *odbierz(int ile){
int i;
char *dane;
dane="";
for (i=0;i != ile; i++){
dane=dane,getchar();
}
return dane;
}

ale nie dziala mi suma lancuchow... przegladajac dokumentacje w przypadku
printf dane sa oddzielane ",", ktory jak rozumiem jest czyms co teraz
potrzebuje, niestety to nie dziala.

Ty kolego nie rozumiesz C kompletnie, odsylam do ksiazek, ale o C, nie
C++ ani C# :-)

1) przy wywolaniu funkcji ',' oddziela parametry. Printf jest funkcja
o zmiennej ilosci parametrow. C takowe dopuszcza.

2) ',' jest tez operatorem - a,b dziala tak ze jest obliczane a,
wynik gubimy, obliczamy b, i jego wynik zwracamy jako wartosc
wyrazenia (a,b)

3) char * x ; definiuje zmienna 'x' bedaca wskaznikiem
wskazujacym obszar pamieci zawierajacy typ 'char',
ale NIE przydziela zadnego obszaru pamieci !
oraz nie inicjuje zmiennej x. Programista musi zadbac
o przydzielenie odpowiedniej pamieci i wpisanie jej adresu
do zmiennej x jesli chce korzystac.

W zwiazku z czym mozna to zrobic na kilka sposobow:

A)

char *odbierz(int ile){
int i;
char *dane;
dane=malloc(ile) //malloc przydziela obszar pamieci
for (i=0;i < ile; i++){
dane[i]=getchar();
}
return dane;
}

Nie polecam:


B)

char *odbierz(int ile){
int i;
static char dane[20];
for (i=0;i < ile; i++){
dane[i]=getchar();
}
return dane;
}

'static' powoduje ze pamiec jest na stale przydzielona.
Tez nie polecam:
poprzednia zawartosc. Mozna sie pomylic.
C to jest naprawde skomplikowany jezyk.

C)

void odbierz(int ile, char * gdzie)
{
for (ile >0 ; ile--){
*gdzie++=getchar();
}

*gdzie ='\000' ;

}

A potem w programie uzywasz np:
char bufor[20];
....
odbierz (10,bufor);

po wykonaniu dane sa w buforze.

To polecam: procedura jest uniwersalna, dane zapamietuje gdzie chcesz,
mozesz uzywac wielokrotnie, jest bezpieczna jesli tylko przy wywolaniu
'ile' nie przekroczy dlugosci-1 obszaru wskazywanego przez 'gdzie',
powinna sie efektywnie kompilowac.

J.



=======

Poprzedni Następny
Wiadomość
Spis treści
From: "Krzyku" <krzyku123_at_nospam_poczta.fm>
Subject: Re: Keil i komunikacja - problem.
Date: Wed, 26 Feb 2003 20:22:11 +0100



Uzytkownik "J.F." <jfox_at_nospam_poczta.onet.pl> napisal w wiadomosci
news:3e5cdfc8.1591626_at_nospam_no...

void odbierz(int ile, char * gdzie)
{
for (ile >0 ; ile--){
*gdzie++=getchar();
}

*gdzie ='\000'

}

Moze zarymuje;)
Mam pytanko. Co to ostatnie rownanko robi w tej funkcji, bo nie kumam go?
Krzyku



========
Path: news-archive.icm.edu.pl!mat.uni.torun.pl!news.man.torun.pl!news.icm.edu.pl!lublin.pl!news.onet.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: "GeePee" <geepee_at_nospam_o2.pl>
Subject: Re: Keil i komunikacja - problem.
Date: Wed, 26 Feb 2003 20:22:43 +0100


In news:3e5d135d$1_at_nospam_news.home.net.pl,
Krzyku <krzyku123_at_nospam_poczta.fm> typed:
Uzytkownik "J.F." <jfox_at_nospam_poczta.onet.pl> napisal w wiadomosci
news:3e5cdfc8.1591626_at_nospam_no...

*gdzie ='\000'

Moze zarymuje;)
Mam pytanko. Co to ostatnie rownanko robi w tej funkcji, bo nie kumam
go? Krzyku

Podstawy C.
*gdzie - oznacza komórka wskazana przez gdzie
'\000' to znak o wartości 0
można równie dobrze zapisać
*gdzie=0;



=======

Poprzedni Następny
Wiadomość
Spis treści
From: "Krzyku" <krzyku123_at_nospam_poczta.fm>
Subject: Re: Keil i komunikacja - problem.
Date: Wed, 26 Feb 2003 20:48:16 +0100



Użytkownik "GeePee" <geepee_at_nospam_o2.pl> napisał w wiadomości
news:b3j4o5$g1q$1_at_nospam_nemesis.news.tpi.pl...

*gdzie - oznacza komórka wskazana przez gdzie

zle sie wyrazilem, lewostronnie kumam - to jest oczywiste

'\000' to znak o wartości 0

hmm.... tego chyba nie doczytalem. Czlek sie cale zycie uczy....

można równie dobrze zapisać
*gdzie=0;

tak wlasnie caly czas pisalem
Dzieki.
Krzyku



========
Path: news-archive.icm.edu.pl!mat.uni.torun.pl!news.man.torun.pl!news.icm.edu.pl!newsfeed.silweb.pl!news.onet.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: jfox_at_nospam_poczta.onet.pl (J.F.)
Subject: Re: Keil i komunikacja - problem.
Date: Thu, 27 Feb 2003 17:18:24 GMT


On Wed, 26 Feb 2003 20:22:43 +0100, GeePee wrote:

*gdzie ='\000'

Moze zarymuje;)
Mam pytanko. Co to ostatnie rownanko robi w tej funkcji, bo nie kumam
go? Krzyku

Podstawy C.
*gdzie - oznacza komórka wskazana przez gdzie
'\000' to znak o wartości 0
można równie dobrze zapisać
*gdzie=0;

Jeszcze tylko dla wyjasnienia: w C sie przyjelo zaznaczac koniec
ciagu znakow przez bajt [znak] o wartosci 0. Wiec wypadaloby go
wstawic na koniec odebranych danych, co wlasnie powyzsze robi.

Konwencja nie jest najlepsza - uniemozliwia przechowywanie bajtu o
wartosci 0 ... ale jest. Uzywaja jej wszystkie funkcje C operujace na
stringach.
Mozesz nie trzymac sie konwencji [czasem trzeba - dane zawieraja 0]
... ale musisz uzywac innych funkcji, a czasem napisac wlasne ..

J.


========
Path: news-archive.icm.edu.pl!mat.uni.torun.pl!news.man.torun.pl!news.icm.edu.pl!lublin.pl!news.onet.pl!newsfeed.gazeta.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: "Piotr Wyderski" <piotr.wyderskiREMOVE_at_nospam_hoga.pl>
Subject: Re: Keil i komunikacja - problem.
Date: Thu, 27 Feb 2003 00:44:07 +0100



Bartosz Waleska wrote:

Jak wspomniales musze wykorzystac funkcje getchar(), ale chcialbym by
zbudowana procedura (funkcja) zwracala mi lancuch odberanych znakow,

scanf()?

ale nie dziala mi suma lancuchow... przegladajac dokumentacje w przypadku
printf dane sa oddzielane ",", ktory jak rozumiem jest czyms co teraz
potrzebuje, niestety to nie dziala.

Jejku, z czego Tys sie uczyl podstaw C, z lektury horoskopow? :-)
Sume lancuchow czyli konkatenacje mozesz miec, ale w C++, jak
sobie przeciazysz operator +, w C musisz to robic przy pomocy
funkcji o "normalnych" nazwach. "," jest normalnym operatorem,
w zaleznosci od kontekstu sluzy do budowania listy parametrow
aktualnych dla funkcji oraz w dzialaniach na krotkach: c = (a,b)
znaczy a; c = b;

Probowalem jeszcze cos takiego:

for (i=0; i!=ile, i++){
dane[i]=getchar();
}

To jest w oczywisty sposob bledne, lecz w pewnych okolicznosciach
moze dzialac, szczegolnie z opcjami typu -fwritable-strings... :-)))
Poczytaj jakis podrecznik do C przed napisaniem jakiegokolwiek
programu w tym jezyku. Bez urazy, ale Ty nie masz bladego pojecia
o programowaniu w C; to jest bardzo prosty jezyk, wiec poswiec
czas na opanowanie go.

Banalna rzecz, ale nie moge sie tego doszukac w dokumentacji...

A w jakiej dokumentacji szukasz? :-) Kup sobie K&R, ksiazeczka
dosc archaiczna, prymitywna i miejscami przegadana, ale podstaw
C idzie sie z niej nauczyc.

Pozdrawiam
Piotr Wyderski



========
Path: news-archive.icm.edu.pl!pingwin.icm.edu.pl!news.icm.edu.pl!fu-berlin.de!fr.usenet-edu.net!usenet-edu.net!proxad.net!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: "GeePee" <geepee_at_nospam_o2.pl>
Subject: Re: Keil i komunikacja - problem.
Date: Tue, 25 Feb 2003 00:40:13 +0100


In news:b3dtim$2dl$1_at_nospam_news.onet.pl,
Bartosz Waleska <combosoft_at_nospam_poczta.onet.pl> typed:
Witam wszystkich,
Kiedys poruszalem juz ten problem, ale wowczas watek sie urwal...

wracam wiec ponownie.

, ale nie dziala jezeli wysle #13 #10 #10 12345 #13 #10
W drugim przypadku otrzymuje #13#10 #13#10 #13#10 245 ABC 245

Źle, źle źle - siadaj dwója.
Wystarczy zadać sobie trochę trudu i zajrzeć do biblioteki - a f-cje getc,
putchar i podstawowe Low Level IO są zwykle dostarczane ze źródłem.
W przypadku kolegi problem polega na tym, że f-cja putchar wykorzystywana
przez puts bazuje na transferze ascii a nie binarnym.
Tu jest źródło - akurat z ProView - ale nie sądzę, żeby się w uVision
różniło - w końcu to standard ANSI

#include <reg51.h>
#define CR 0x0D
#define LF 0x0A

int putchar( const char character ) {
if( character == LF )
{ // add automatic CR with line feed
while( !TI ); // wait until TI is set
TI = 0; // Now clear it
SBUF = CR; // now print a CR
}

while( !TI ); // wait until TI is set
TI = 0; // Now clear it
SBUF = character; // now print your character

return character; // done
}

Polecam lekturze.

Paweł Goś



========
Path: news-archive.icm.edu.pl!pingwin.icm.edu.pl!news.icm.edu.pl!newsfeed.gazeta.pl!news.internetia.pl!skynet.be!skynet.be!newsfeed.wirehub.nl!transit.news.cuci.nl!cleanfeed.casema.net!leda.casema.net!castor.casema.net.POSTED!53ab2750!not-for-mai