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

RS232 w Borland C++ Builder

26 Wrz 2006 00:38 7799 13
  • Poziom 13  
    Witam robie komunikacje AVRa z PCtem. chcę zacząć od napisania programu w builderze do odbioru paru znaków. Ze strony AVRa wszystko gra wysyłam napis, sprawdzane w hyperterminalu wszystko OK. Ale teraz za bardzo nie wiem jak to zrobic w builderze. Korzystam z książki "RS232C - prog. praktycze".
    Chciałbym aby mi ktoś wytłumaczył na chłopski rozum jak sie odbywa odbiór napisu w builderze. Rozumię, że poprzez funkcje ReadFile(hCommDev, lpBuffer, nNumberOfBytesToRead, lpNumberOfBytesRead, Null). Ale co? Po wywołaniu tej funkcji jeśli teraz wyśle jakieś dane do PCta to automatycznie znajdą sie one w zadeklarowanym buforze wejściowym? i starczy tylko przeglądać czy w buforze już coś jest? czy jak to działa?
    Za pomoc z góry wielkie dzięki
  • Poziom 11  
    Sposob ktory prezentuje wzialem z przykladu z sieci , u mnie dziala bez problemu - wklejam wlasnie bezposredni z mojego programu ( napisany w C++ Builder 5 )

    Inicjalizacja

    Code:
     outp(PORT + 1 , 0);   /* Turn off interrupts - Port1 */
    

    //          PORT 1 - Communication Settings         */

     outp(PORT + 3 , 0x80);  /* SET DLAB ON */
     outp(PORT + 0 , 0x03);  /* Set Baud rate - Divisor Latch Low Byte */
                   /* Default 0x03 =  38,400 BPS */
                   /*         0x01 = 115,200 BPS */
                   /*         0x02 =  57,600 BPS */
                   /*         0x06 =  19,200 BPS */
                   /*         0x0C =   9,600 BPS */
                   /*         0x18 =   4,800 BPS */
                   /*         0x30 =   2,400 BPS */
     outp(PORT + 1 , 0x00);  /* Set Baud rate - Divisor Latch High Byte */
     outp(PORT + 3 , 0x03);  /* 8 Bits, No Parity, 1 Stop Bit */
     outp(PORT + 2 , 0xC7);  /* FIFO Control Register */
     outp(PORT + 4 , 0x03);  /* Turn on DTR, RTS, and OUT2 */
    // outp(PORT1 + 4 , 0x0B);  /* Turn on DTR, RTS, and OUT2 */


    wyslanie znaku i odczyt , w procku w petli glownej jest tak ze czeka na wyslanie znaku i potem na niego odpowiada
    Code:
      int l1=96,v;
    

       outp(PORT,b);
       while (  l1 == 96  ) l1 = inp(PORT+5) ;
       while (  l1 != 97  ) l1 = inp(PORT+5) ;
       v = inp(PORT) ;


    jeszcze zaladowanie fukncji odczytujacej i zapisujacej zawartosc portu
    Code:
     
    
      typedef UINT (CALLBACK* LPFNDLLFUNC1)(INT,INT);
      typedef UINT (CALLBACK* LPFNDLLFUNC2)(INT);

      LPFNDLLFUNC1 outp; // wskačnik na funkcjŕ wysy¦aj¦c¦ do rejestru
      LPFNDLLFUNC2 inp; // wskačnik na funkcjŕ czytaj¦c¦ rejestr
      HINSTANCE hDLL;


    hDLL = LoadLibrary("Inpout32");//tu jest nasza dll-ka

      if (hDLL != NULL)
      {
        outp = (LPFNDLLFUNC1)GetProcAddress(hDLL,"Out32");
        inp  = (LPFNDLLFUNC2)GetProcAddress(hDLL,"Inp32");

        if (!outp || !inp)
        {
          MessageBoxA ( NULL , "Error in io / out" , "Error" , MB_OK ) ;
          FreeLibrary(hDLL);
        }
      }
      else
      {
        MessageBoxA ( NULL , "Error in io / out" , "Error" , MB_OK ) ;
      }
  • Poziom 30  
    Marianekk napisał:
    Witam robie komunikacje AVRa z PCtem. chcę zacząć od napisania programu w builderze do odbioru paru znaków. Ze strony AVRa wszystko gra wysyłam napis, sprawdzane w hyperterminalu wszystko OK. Ale teraz za bardzo nie wiem jak to zrobic w builderze. Korzystam z książki "RS232C - prog. praktycze".
    Chciałbym aby mi ktoś wytłumaczył na chłopski rozum jak sie odbywa odbiór napisu w builderze. Rozumię, że poprzez funkcje ReadFile(hCommDev, lpBuffer, nNumberOfBytesToRead, lpNumberOfBytesRead, Null). Ale co? Po wywołaniu tej funkcji jeśli teraz wyśle jakieś dane do PCta to automatycznie znajdą sie one w zadeklarowanym buforze wejściowym? i starczy tylko przeglądać czy w buforze już coś jest? czy jak to działa?
    Za pomoc z góry wielkie dzięki

    Po wywołaniu tej funkcji program będzie czekał na to, aż w buforze znajdzie się nNumberOfBytesToRead bajtów. Być może da się coś pozmieniać, ale nigdy nie próbowałem. Więcej szczegółów choćby tutaj: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/fs/readfile.asp
  • Poziom 20  
    W wymienionej przez ciebie książce masz wszystko łopatologicznie opisane. Poczytaj , pokopiuj przykłady, poczytaj też helpa od winapi. Wersja tomiwroc6 nie zadziała w xpeku bez odblokowania portów.
    Pozdrawiam.
  • Poziom 13  
    Wiem, że tam jest wszystko łopatologicznie napisane a mimo to mam problem z odbieraniem danych :). Chodzi mi o to aby ktoś wytłumaczył mi sam algorytm jak działa odbieranie danych przez RSa. Tzn: Chce odebrać dane z mojej płytki która tylko wysyła np. "czesc" po zresetowaniu procka. A wiec otwieram port i teraz ide do mojej plytki i naciskam reset i chce aby w oknie Edit1 wyświetlił mi sie napis "czesc". Czy w tym celu po otwarciu portu odrazu wywoluje funkcję ReadFile() i teraz naciskam reset aby wysłać "czesc".
    Czy może najpierw wysyłam z płytki "czesc" i napis ten zapisuje sie w jakimś buforze i dopiero teraz wywołuje funkcje ReadFile(). Z tym mam problem chce poznać co pokolei robić.
    Pozdrawiam i dziękuję za cierpliwość.
  • Poziom 30  
    Marianekk napisał:
    Wiem, że tam jest wszystko łopatologicznie napisane a mimo to mam problem z odbieraniem danych :). Chodzi mi o to aby ktoś wytłumaczył mi sam algorytm jak działa odbieranie danych przez RSa. Tzn: Chce odebrać dane z mojej płytki która tylko wysyła np. "czesc" po zresetowaniu procka. A wiec otwieram port i teraz ide do mojej plytki i naciskam reset i chce aby w oknie Edit1 wyświetlił mi sie napis "czesc". Czy w tym celu po otwarciu portu odrazu wywoluje funkcję ReadFile() i teraz naciskam reset aby wysłać "czesc".
    Czy może najpierw wysyłam z płytki "czesc" i napis ten zapisuje sie w jakimś buforze i dopiero teraz wywołuje funkcje ReadFile(). Z tym mam problem chce poznać co pokolei robić.
    Pozdrawiam i dziękuję za cierpliwość.


    No a nie prościej spróbować?
    Bezpieczniej będzie najpierw uruchomić procedurę, a potem zresetować płytkę, ale musisz to sprawdzić sam. 5 minut i będziesz wiedział, czy to w ogóle działa. Sprawdź też terminal windowsowy do testowania poprawności nadawania - HyperTerminal. Jak będziesz miał już chociaż tych kilka rzeczy przetestowanych, to możemy próbować dalej.

    Co do działania / nie działania w XP (tych, co zaimplementowali blokadę dostępu do portów to bym chętnie jakoś specjalnie "nagrodził"...), to jest to temat rzeka i bezpieczniej korzystać po prostu z ReadFile.
  • Poziom 11  
    Witam,
    Jesli mozna skoro pojawil sie juz taki temat to chcialbym sie podpiac z podobnym pytaniem, mianowice do tej pory uzywalem sposobu jaki sam opisalem jednak teraz pojawil sie problem ktore musze rozwiazac - jak w Builderze komunikowac sie przez RS-a ale takiego z przetwonika usb na rs-232 ktory tworzy wirtualny port (com3 . 4 ) . bo jak sprawdzalem progam ponyprog na nim dziala , a zwykly odczyt stanu portow nic nie daje - bo sa same wartosci 255. Probowalem rowniez funkcja CreateFile i przez com-a zwyklego dziala , procek odbiera dane a przez tego usb jest dalej cisza pomimo ze nie ma bledow fukcje zawsze zwracaja poprawne wywolanie :?:
    Czy w takiej sytuacji trzeba uzywac tej funckji w jakis specjalny sposob ? Czy moze trzeba zrobic jakas inicjalizacje wczesniej ? ( rs podlaczony jest do atmegi wiec uzywane jest tylko tx i rx bez dtr itd ) , bo przez to ze porty sa na 255 nie mozna wykonac inicjalizacji jak w podanym przezemnie wyzej przykladzie , ale w menadzerze urzadzen com3 jest ustawiony jak trzeba :?:
  • Poziom 20  
    A widzisz, w comie usb nie masz juz tych rejestrów i twój sposób sie nie nadaje. Zrób to przez winapi, polecam książkę wymienianą w tym topicu i helpa do winapi.
    Pozdrawiam.
  • Poziom 30  
    tomiwroc6 napisał:
    Witam,
    Jesli mozna skoro pojawil sie juz taki temat to chcialbym sie podpiac z podobnym pytaniem, mianowice do tej pory uzywalem sposobu jaki sam opisalem jednak teraz pojawil sie problem ktore musze rozwiazac - jak w Builderze komunikowac sie przez RS-a ale takiego z przetwonika usb na rs-232 ktory tworzy wirtualny port (com3 . 4 ) . bo jak sprawdzalem progam ponyprog na nim dziala , a zwykly odczyt stanu portow nic nie daje - bo sa same wartosci 255. Probowalem rowniez funkcja CreateFile i przez com-a zwyklego dziala , procesor odbiera dane a przez tego usb jest dalej cisza pomimo ze nie ma bledow fukcje zawsze zwracaja poprawne wywolanie :?:
    Czy w takiej sytuacji trzeba uzywac tej funckji w jakis specjalny sposob ? Czy moze trzeba zrobic jakas inicjalizacje wczesniej ? ( rs podlaczony jest do atmegi wiec uzywane jest tylko tx i rx bez dtr itd ) , bo przez to ze porty sa na 255 nie mozna wykonac inicjalizacji jak w podanym przezemnie wyzej przykladzie , ale w menadzerze urzadzen com3 jest ustawiony jak trzeba :?:


    No i właśnie dlatego lepiej to robić, jak pisałprzedpiśca - w WINAPI - poczytaj o CreateFile, ReadFile itp na MSDN-ie, a najlepiej faktycznie kupić książkę "RS 232C - praktyczne programowanie. Od Pascala i C++ do Delphi i Buildera. Wydanie II" z Heliona, bo tam wszystko to jest opisane.
  • Poziom 11  
    Cytat:

    No i właśnie dlatego lepiej to robić, jak pisałprzedpiśca - w WINAPI - poczytaj o CreateFile, ReadFile itp na MSDN-ie, a najlepiej faktycznie kupić książkę "RS 232C - praktyczne programowanie. Od Pascala i C++ do Delphi i Buildera. Wydanie II" z Heliona, bo tam wszystko to jest opisane.


    No tak. tylko jak pisalem wczesniej wyprobowalem rowniez uzycie funckji CreateFile z winapi oraz WriteFile i w przypadku com-a wbudowanego w plyte widac bylo ze avr odebral znak , jednak jak zrobilem to samo ale korzystajac z com-a na usb ( kabel profilic czy jakos tak 2303 zdaje sie ) to bylo zero reakcji - a program w procku i na kompie zostal bez zmian... Dlatego chcialem sie zapytac czy to zostalo zweryfikowane w praktyce czy mozna za pomoca tych funckji uzywac coma usb , czy moze potrzebna jest jeszcze jakies dodatkowe ustawienie poprzez funkcje konfigurujace ?
    Czy przytoczona ksiazka opisuje rowniez taka sytuacje, bo jak mniemam zakup jest zwiazany z pewnymi kosztami, a najwazniejsza jest dla mnie wlasnie komunikacja po comie usb ?

    Pozdrawiam :D
  • Poziom 20  
    Powiem szczerze ze nie mam przejsciówki usb-com choć bardzo chętnie bym to sprawdził. Czy zmieniłeś nazwę portu podczas CreateFile? Książkę mam w formie ebooka tyle ze wydanie 1. Jak chcesz to podeślę.
    Pozdrawam.
  • Poziom 11  
    przemek20 napisał:
    Powiem szczerze ze nie mam przejsciówki usb-com choć bardzo chętnie bym to sprawdził. Czy zmieniłeś nazwę portu podczas CreateFile? Książkę mam w formie ebooka tyle ze wydanie 1. Jak chcesz to podeślę.
    Pozdrawam.


    Za ksiazeczke bym byl bardzo wdzieczny :D slash6(malpa)poczta.onet.pl.
    Co do funkcji to tak - oczywiscie zmienilem na com3 , funkcja createfile nie zwrocila bledu jednak dane nie doszly juz do procka.

    Natomias ten port wirtualny dziala w programatorze ponyprog tylko trzeba wybrac siprog i/o bo na siprog api nie dziala.

    Pozdrawiam :D
  • Poziom 30  
    tomiwroc6 napisał:
    Cytat:

    No i właśnie dlatego lepiej to robić, jak pisałprzedpiśca - w WINAPI - poczytaj o CreateFile, ReadFile itp na MSDN-ie, a najlepiej faktycznie kupić książkę "RS 232C - praktyczne programowanie. Od Pascala i C++ do Delphi i Buildera. Wydanie II" z Heliona, bo tam wszystko to jest opisane.


    No tak. tylko jak pisalem wczesniej wyprobowalem rowniez uzycie funckji CreateFile z winapi oraz WriteFile i w przypadku com-a wbudowanego w plyte widac bylo ze avr odebral znak , jednak jak zrobilem to samo ale korzystajac z com-a na usb ( kabel profilic czy jakos tak 2303 zdaje sie ) to bylo zero reakcji - a program w procku i na kompie zostal bez zmian... Dlatego chcialem sie zapytac czy to zostalo zweryfikowane w praktyce czy mozna za pomoca tych funckji uzywac coma usb , czy moze potrzebna jest jeszcze jakies dodatkowe ustawienie poprzez funkcje konfigurujace ?


    Odpowiem "standardową odpowiedzią serwisanta nr 1": U mnie działa. Mam jakąś przejściówkę USB na RS (brak RSa w laptopie) i właśnie na niej działam. Wszystkie CreateFile, ReadFile itp działają bez problemu.