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

[Visual C++] Jak obsługiwać port COM do wysyłania i odbierania danych z uP?

ArtKar 14 Sty 2004 01:18 9318 12
REKLAMA
  • #1 474606
    ArtKar
    Poziom 14  
    Posty: 153
    Witam,
    wkurzlem sie ostatnimi czasy na visual basic bo programy w nim napisane, ktore wykonywaly operacje na plikach strasznie wolno dzialaly...

    Zabralem sie za Visual C++ i wszystko jest OK, tylko w jaki sposob z tego czegos obslugiwac COM'a??

    Prosze o jakies gotowe procedury dzialajace bezposrednio lub poprzez kontrolke MSComm...

    Chodzi mi o wysylanie i odbieranie danych z uP (dane jednobajtowe)...

    dziekuje i pozdrawiam, ArtKar

    Temat zamykam. - arnoldziq
  • REKLAMA
  • #2 474609
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 241
    Na elektrodzie jest skan ksiażki po polsku z wytłumaczoną całą komunikacją poprzez API windows.
  • #4 508777
    ArtKar
    Poziom 14  
    Posty: 153
    witam...
    meczylem sie caly czas z tym serialport'em w c++ i rozgryzlem to w koncu.. tak mi sie przynajmniej wydaje....

    no wiec tak:
    napisalem program, na porcie zalozylem loopback'a i wyslalem dana, dana wrocila, wszystko OK...
    chce napisac program, aby prozumiewal sie z mikrokontrolerem.. napisalem do uP programik w BASCOMie, ktory odbiera dana i natychmiast ja wysyla... dana jednak juz nie zostaje odebrana przez program na PC :( wyskakuje timeout(zmienialem je wartosc)...
    prgoram w uP przepisalem tak, ze wysyla caly czas taka sama dana, program w C++ go nie odbiera :(

    Robilem rowniez testy na Hyperterminalu....tutaj dziala wszystko OK...komunikuje sie bez problemu

    Co moge miec namieszane w tym wszystkim??
    port w c++ sadze ze skonfigurowalem i otworzylem poprawnie(uzylem tego czegos z www.codeguru.com)

    dziekuje i pozdrawiam, ArtKar
  • REKLAMA
  • #5 508851
    BoskiDialer
    Poziom 34  
    Posty: 1530
    Pomógł: 353
    Ocena: 42
    Skoro VC++ niedziała poprawinie a HyperTerminal działa...
    to sprubój połączyć (na kablu COM) ze sobą sygnały:
    - CTS z RTS
    - RTS z DSR
    (mogłem pomylić sie w oznaczeniach ponieważ pisałem z pamięci..)
    albo po prostu piny na złączu DB9:
    - 2 z 3
    - 7 z 8
    ....
    Czasami programy wykorzystują kontrole przepływu danyh..
  • #6 508913
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 241
    A próbowałeś skonfigurować handshaking? Timeouty są to po żeby tak działać, można z nich zrezygnować wykonując operacje blokujące, ale z reguły znacznie gorzej to działa.
  • REKLAMA
  • #7 508977
    ArtKar
    Poziom 14  
    Posty: 153
    7 z 8 mam zwarte, 2 z 3 nie moge bo to jest wlasnie RX i TX... jak zewre je to powstanie loopback...

    Sprawdzalem co to jest handshaking... w jaki sposob go skonfigurowac i czy konieczne sa wtedy zmiany w oprogramowaniu w uP ??

    W HyperTerminal'u wszystko dziala, wiec nie wiem co jest nie tak... jako program testowy na PC uzylem ten demonstracyjny ze strony www.codeguru.com (na loopback'u dziala), a na uP z programem ktory powinien emulowac loopback'a niestety nie :(

    Oto zrodlo tego co jest w uP:
    
    Dim A As Byte
    
    Open "com3.1:9600" For Output As #1
    Open "com3.0:9600" For Input As #2
    
    Do
       Get #2 , A
       Put #1 , A
    Loop
    
    Close #1
    Close #2
    End
    
  • #8 509027
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 241
    ArtKar napisał:
    Sprawdzalem co to jest handshaking... w jaki sposob go skonfigurowac i czy konieczne sa wtedy zmiany w oprogramowaniu w uP ??
    No można, ale prościej jest go wogóle wyłączyć ;). Musisz tak przekonfigurować port szeregowy aby ignorował sygnały handshakingu.
  • #9 509050
    ArtKar
    Poziom 14  
    Posty: 153
    haaa, tylko jak go wylaczyc ? ;) hehe, jak chodzi o sprawy zwiazane z portem to jestem nowicjuszem :D
  • REKLAMA
  • #10 509398
    BoskiDialer
    Poziom 34  
    Posty: 1530
    Pomógł: 353
    Ocena: 42
    Sory.. pomyliło mi sie... połącz ze sobą piny 4 i 6...

    Cytat:
    na porcie zalozylem loopback'a i wyslalem dana, dana wrocila, wszystko OK...

    Cytat:
    Robilem rowniez testy na Hyperterminalu....tutaj dziala wszystko OK


    Sprawdź czy masz dobrą prędkość ustawioną. bo z tego co wyżej
    napisałeś to wnioskuje że albo masz źle skonfigurowaną prędkość..
    albo w transmisji występuje bit parzystości który dla mikrokontrolera
    może oznaczać błąd transmisji.. spróbuj wgrać na mikrokontroler taki program:

    dim a as bit
    do
      a = P1.0
      P1.1 = a
    loop


    Będzie on powodował loopback z poziomu programu mikrokontrolera..


    p.s. zmień timeout na 5000...
  • #11 511584
    ArtKar
    Poziom 14  
    Posty: 153
    ...sprobowalem tym sposobem no i jest tak, ze w hyperterminalu dziala, a z C++ nie dziala :)

    No ale wlasnie cos przy tym zauwazylem:
    mam podlaczony komputer do uP przez MAX232... jak zewre wejscie RX i TX MAXa to dziala w hyperterminalu i z C++, jak za MAXem to tylko z hyperterminala...

    Jaka wiec moze byc roznica w dzialaniu pomiedzy tymi dwoma programami??

    Sprobuje jeszcze zerknac w aplikacje MAX'a, bo ja wykorzystalem gotowy uklad, ktory kiedys zrobilem pod flashowanie telefonikow, gdzie rowniez byl RX i TX wymagany

    P.S. predkosc i parzystosc mam ustawiona OK

    Dziekuje ;-), Pozdrawiam, ArtKar
  • #12 512177
    ArtKar
    Poziom 14  
    Posty: 153
    DZIEKUUUUUJEE WAAAAAAM WSZYSTKIIIM ZA ZAINTEREEESOOWANIEE I POMOC:)

    Udalo sie :) Juz dziala:)

    A teraz takie pytanko male jeszcze??
    w czasie transmisji potrzebuje aby program odczekal chwilke...
    Jak moge w C++ zrobic cos w stylu 10ms pauzy??

    Chodzi o to, ze PeCet musi nadac troche danych, nastepnie odczekac powiedzmy 10ms i znowu nadac...

    Dziekuuuje :)
  • #13 515959
    fantom
    Poziom 31  
    Posty: 1649
    Pomógł: 108
    Ocena: 41
    Zainstaluj sobie timer funkcja SetTimer i obsluguj komunikat WM_TIMER w aplikacji.

Podsumowanie tematu

✨ Dyskusja dotyczy obsługi portu COM w Visual C++ do wysyłania i odbierania jednobajtowych danych z mikrokontrolera (uP). Użytkownik poszukiwał gotowych procedur lub klas, np. z wykorzystaniem kontrolki MSComm lub API Windows. Zaproponowano użycie klasy CSerialPort dostępnej na codeguru.com oraz odwołano do polskiej dokumentacji na elektrodzie. Problemy z odbiorem danych w C++ mimo poprawnej konfiguracji portu i działania HyperTerminala wskazywały na kwestie związane z konfiguracją sygnałów sterujących (handshaking) i połączeniami pinów RS-232 (np. CTS, RTS, DSR). Zalecano wyłączenie handshakingu i poprawne ustawienie parametrów transmisji (prędkość, parzystość). Wskazano na różnice w działaniu programu PC z mikrokontrolerem podłączonym przez układ MAX232, gdzie loopback działał tylko przed układem. Ostatecznie problem rozwiązano, a do realizacji opóźnień w transmisji zasugerowano użycie funkcji SetTimer i obsługę komunikatu WM_TIMER w aplikacji C++.
Wygenerowane przez model językowy.
REKLAMA