Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Mikrokontroler 89c2051 sterowany z PC poprzez port szeregowy

losradaros 02 Gru 2004 19:20 3066 8
  • #1 02 Gru 2004 19:20
    losradaros
    Poziom 2  

    Mam uklad, na ktorym jest mikrokontroler 89c2051. Chce sterowac tym miktrokontrolerem poprzez port szeregowy. Nigdy wczesniej czegos takiego nie robilem. Znam sie na c++, c, java. Z assebmlerem na mikroprocka tez nie ma problemu. Czy moglby mi ktos pomoc i podeslac jakies linki. Generalnie chodzi o komunikacje na porcie szeregowym. Wysylanie, odbieranie.. no i chyba jakos to trzeba zsynchronizowac z czestotliwoscia procka? Dzieki za wszelka pomoc.

    pozdrawiam

    Radarek

    0 8
  • #3 02 Gru 2004 22:11
    juntom
    Poziom 18  

    Najprosciej wykorzystac ktorys z dostepnych komponentow do c++ buildera lub delphi , ale najlepiej /moim zdaniem/ skorzystac z API - polecam ksiazke "rs232c od pascala i c++ do delphi i buildera" Pana Andrzeja Daniluk.

    pozdr.

    0
  • #4 03 Gru 2004 09:10
    myrcioch
    Poziom 18  

    Jakie środowisko pracy preferujesz?
    Bardzo wygodnie działa się pod wspomnianym C++ Builderem, do tego jakiś komponent nie blokujący pracy głównego programu - np. ciacomport i już działasz.
    Z synchronizacją nie ma problemu - zarówno na 51 jak i w PC-cie ustawiasz po prostu jedną ze standardowych prędkości portu szeregowego - np. 9600.

    0
  • #6 03 Gru 2004 20:09
    SACZI
    Poziom 16  

    A ja zaproponuję inną metodę.
    Użyj Visual Basica i jego słynna kontrolkę MSComm. Piszę się na tym bajecznie prosto!
    Odbiór:

    Code:

    Private Sub MSComm1_OnComm()

    Select Case MSComm1.CommEvent

    _Case comEvReceive
    ___RichEdit.Text = MSComm1.Input
    _End Select
    End Sub


    Wysyłanie
    Code:

    Private Sub Send_Click()
    ___MSComm1.Output = Text5.Text
    End Sub


    Znaczna część przykładów na różne "okoliczności" jest w Helpie. Nie masz się co przejmowac gadaniem, że VB to programowanie dla tępych. Nie piszesz przeciez systemu operacyjnego! Liczy sie przede wszystkim efekt!Ja pisałem aplikacje dla RSa pod C++ Builder z wykorzystaniem API na podstawie książki Andrzeja Daniluka "Praktyczne programowanie RS232c ...". Powiem jedno: to jest męczarnia!
    Mogę natomiast zrozumieć przywiązanie do jakiegoś środowiska. Osobiście nie lubię pisać pod VB (ohydne środowisko, ale prosty język ...), ale doskonale pisze mi sie pod C++ Builderem.
    Proponuję Ci ciekawy "myk": zaimportuj MSComm do C++ Buildera. Algorytmy zostają z VB, ale środowisko borlandowskie.

    Pozostają Ci również kobntrolki pisane przez innych programistów i inne firmy. Najłatwiejszą użyciu jest
    nrComm. Niestety, jest komercyjna.

    Klasyką, to jest chyba ComPort Library by Dejan Crnila (szukaj tego w google). Niestety, dość ciężka w instalacji, ale jeden z moich wykładowców dzięki temu komponentowi napisał oprogramowanie do symulatora samolotu.

    Ogólnie, co kto lubi.

    0
  • #7 04 Gru 2004 21:28
    losradaros
    Poziom 2  

    myrcioch napisał:
    Jakie środowisko pracy preferujesz?


    Najchetniej Visual C++... borlandem sie nie bawilem, a basica nie znam w ogole i raczej nie poznam chyba ze mnie do tego zmusi zycie :-) (znam troche jezykow wiec poznanie basica nie jest zbyt oplacalne :-) )

    0
  • #8 16 Gru 2004 15:49
    gol
    Poziom 13  

    a wie ktoś jak to zrobić pod linuxem w c

    0
  • #9 16 Gru 2004 16:22
    myrcioch
    Poziom 18  

    Obsługa portu szeregowego w C pod linuksem?

    1. Otwieranie portu szeregowego 9600/8/1, bez linii kontroli przepływu:
    int serialfd,max_fds;
    struct termios rs_param;
    serialfd=open(devname,O_RDWR | O_NOCTTY);
    bzero(&rs_param, sizeof(rs_param));
    rs_param.c_cflag=B9600 | CS8 | CREAD | CLOCAL;
    tcflush(serialfd, TCIFLUSH);
    tcsetattr(serialfd,TCSANOW,&rs_param);
    max_fds=serialfd+1;

    2. Obsługa odczytu
    while(1)
    {
    FD_ZERO(&readfds);
    FD_ZERO(&writefds);
    FD_SET(serialfd,&readfds);
    clk.tv_sec=0;
    clk.tv_usec=100000;
    select(max_fds,&readfds,&writefds,NULL,&clk);
    if(FD_ISSET(serialfd,&readfds))
    {
    //obsluga_odczytywanych_danych - odczyt bo 1 bajcie
    read(serialfd,&rsinbuf[rsinbufcntr],1);
    ++rsinbufcntr;
    }
    //jeśli nie ma danych, to tutaj jesteśmy co 100ms
    }

    3. Wysyłanie danych
    write(serialfd,rsoutbuf,n_bajtow);

    0