logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak odbierać dane RS232 w Borland C++ Builder? Funkcja ReadFile()

Marianekk 26 Wrz 2006 00:38 8501 13
REKLAMA
  • #1 3057486
    Marianekk
    Poziom 13  
    Posty: 129
    Pomógł: 2
    Ocena: 2
    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
  • REKLAMA
  • #2 3057949
    tomiwroc6
    Poziom 12  
    Posty: 42
    Pomógł: 1
    Ocena: 5
    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

     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
      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
     
      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 ) ;
      }
    
  • REKLAMA
  • #3 3058166
    Klima
    Poziom 31  
    Posty: 1535
    Pomógł: 112
    Ocena: 180
    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
  • #5 3060947
    przemek20
    Poziom 21  
    Posty: 328
    Pomógł: 41
    Ocena: 25
    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.
  • REKLAMA
  • #6 3061041
    Marianekk
    Poziom 13  
    Posty: 129
    Pomógł: 2
    Ocena: 2
    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ść.
  • #7 3061913
    Klima
    Poziom 31  
    Posty: 1535
    Pomógł: 112
    Ocena: 180
    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.
  • REKLAMA
  • #8 3066815
    tomiwroc6
    Poziom 12  
    Posty: 42
    Pomógł: 1
    Ocena: 5
    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 :?:
  • #9 3067550
    przemek20
    Poziom 21  
    Posty: 328
    Pomógł: 41
    Ocena: 25
    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.
  • #10 3068126
    Klima
    Poziom 31  
    Posty: 1535
    Pomógł: 112
    Ocena: 180
    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.
  • #11 3073161
    tomiwroc6
    Poziom 12  
    Posty: 42
    Pomógł: 1
    Ocena: 5
    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
  • #12 3074761
    przemek20
    Poziom 21  
    Posty: 328
    Pomógł: 41
    Ocena: 25
    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.
  • #13 3075285
    tomiwroc6
    Poziom 12  
    Posty: 42
    Pomógł: 1
    Ocena: 5
    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(_at_)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
  • #14 3077379
    Klima
    Poziom 31  
    Posty: 1535
    Pomógł: 112
    Ocena: 180
    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.

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy odbioru danych przez port RS232 w środowisku Borland C++ Builder z wykorzystaniem funkcji ReadFile(). Użytkownik chce zrozumieć algorytm odbierania danych, w szczególności czy po wywołaniu ReadFile() dane wysłane z mikrokontrolera AVR automatycznie trafiają do bufora i czy wystarczy tylko sprawdzać zawartość tego bufora. Odpowiedzi wyjaśniają, że funkcja ReadFile() blokuje program do momentu odebrania określonej liczby bajtów, a dane są przechowywane w buforze systemowym. Zalecane jest najpierw otwarcie portu i uruchomienie odczytu, a następnie resetowanie mikrokontrolera, aby odebrać wysyłany tekst. Wskazano również na konieczność korzystania z funkcji WinAPI (CreateFile, ReadFile) do obsługi portów, zwłaszcza w przypadku wirtualnych portów COM na adapterach USB-RS232, gdzie bezpośredni dostęp do rejestrów portu nie jest możliwy. Poruszono problem działania komunikacji przez konwertery USB-RS232 (np. Prolific, 2303), gdzie standardowe metody mogą wymagać dodatkowej konfiguracji lub nie działać bezpośrednio. Polecono książkę "RS232C - praktyczne programowanie" jako źródło wiedzy oraz komponent comport do ułatwienia komunikacji. Przykładowy kod inicjalizacji portu w C++ Builder pokazuje ustawienia baud rate i parametrów transmisji. Wskazano, że testy najlepiej wykonywać z terminalem HyperTerminal.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA