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

Najprostszy język do obsługi RS232 na PC?

goldfire 31 Mar 2004 14:07 30216 62
Najlepsze odpowiedzi

W jakim języku programowania na PC najłatwiej napisać obsługę RS232?

Najprościej będzie w VB6, bo ma gotową kontrolkę MSComm32.ocx i w praktyce wystarczą krótkie wywołania do otwarcia portu, ustawienia parametrów 9600,n,8,1 oraz wysyłania i odbioru danych [#619273][#623268] Jeśli wolisz Delphi, wielu forumowiczów poleca gotowy komponent CPort/CiaComPort, który też bardzo upraszcza obsługę RS232 [#585226] Gdy zależy Ci na pełnej kontroli i pracy bez komponentów, można użyć WinAPI z funkcjami typu CreateFile, ReadFile, WriteFile i strukturą DCB, ale to nie jest najprostsza opcja [#1167846] W praktyce najlepiej pisać w tym języku, który już znasz [#573244]
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA
  • #1 573235
    goldfire
    Poziom 14  
    Posty: 143
    Pomógł: 6
    Ocena: 3
    W jakim języku programowania jest najprościej napisać obsługę rs232?
    Na PC?

    Zamykam. - arnoldziq
  • REKLAMA
  • #2 573244
    Tdv
    Poziom 34  
    Posty: 2237
    Pomógł: 150
    Ocena: 53
    Chińskim albo w Suahili.
    Na przyszłość proponuję zadawać precyzyjniesze pytania bo z tego to niewiele wynika czy to ma być na PC czy na uC, jeżeli na uC to na jaki.
    A zasadniczo to npisz w tym języku, który znasz.
  • #3 574950
    jony15
    Poziom 25  
    Posty: 604
    Pomógł: 68
    Ocena: 74
    Proponuje jezyk C. A konkretniej polecenie "bioscom" ( dziala pod win98 )
    lub outportb ( pod dos w windzie nie kce dzialac ). zagladnij do helpa po szczegoly. pozdrowienia :-) deal1.
  • REKLAMA
  • #4 582842
    emj
    Poziom 15  
    Posty: 92
    Pomógł: 6
    Ocena: 5
    ja proponuje ci w pascalu. do odczytywania portu sluzy funkcja portw[adres+6] gdzie 6 jest offsetem a adres to $3f8 dla com1 i $2f8 dla com2.
    przykladowe zczytanie linii stan:=portw[$3f8+6]; (stan jest zminna typu byte)
    jezeli stan bedzie rowny:
    16- to cts
    32- to dsr

    64- to ri
    128- to dcd
    a jak bedzie np. stan rowny 48 to jedynka bedzie na cts i dsr bo 16+32=48

    do nadawania sluzy procedura port[adres]:={wartosc};
    powodzenia
    proponuje zajrzec na stronki:
    4programmers.net
    binboy.org
  • #5 583039
    BoskiDialer
    Poziom 34  
    Posty: 1530
    Pomógł: 353
    Ocena: 42
    Ja polecam książke "RS 232C praktyczne programowanie od pascala i C++ do Delphi i Buildera" wyd Helion.
  • #6 583052
    fantom
    Poziom 31  
    Posty: 1649
    Pomógł: 108
    Ocena: 41
    Ja tez ja polecam ale najpierw trzeba miec jakies podstawy z Pascala lub C zeby to przegryzc.
  • #7 585226
    yaroo
    Poziom 11  
    Posty: 32
    a ja udziele chyba najbardziej konkretnej informacji polecam komponent cia Cport pod Delphi
    www.mestdagh.biz
    na tej stronie znajdziesz instalke tego komponentu, przyklady zastosowan itd itp
    ja przy uzyciu tego komponentu zrobilem sobie oprogramowanie do sterowania swiatlem w pokoju:)
    pozdrawiam
  • #8 585279
    fantom
    Poziom 31  
    Posty: 1649
    Pomógł: 108
    Ocena: 41
    Wow niesamowity konkret 8O To ja tez udziele konkretu i powiem ze mozna to napisac w WinAPI uzywajac takich funkcji jak CreateFile,WriteFile,ReadFile,struktury DCB,COMMSTAT i jeszcze kilku innych funkcji oraz struktur :lol:
  • #9 586293
    yaroo
    Poziom 11  
    Posty: 32
    jesli dobrze mi sie wydaje to w pytaniu jest
    Cytat:
    W jakim jezyku programowania jest najprościej napisać obsługe rs232?

    no i wedlug mnie jest to Delphi z komponentem cia Cport. i do strony o nim podalem linka
    A ty co zrobiles?? Poleciles ksiazke
    Cytat:
    RS 232C praktyczne programowanie od pascala i C++ do Delphi i Buildera

    Kup ksiazke i sobie poczytaj
    oraz korzystanie z
    Cytat:
    WinAPI uzywajac takich funkcji jak CreateFile,WriteFile,ReadFile,struktury DCB,COMMSTAT i jeszcze kilku innych funkcji oraz struktur

    to chyba nie jest konkretna informacja
    a korzystanie z Winapi wcale najlatwiejszym sposobem nie jest!!
    mysl Fantom
    pozdrawiam

    a goldfire prosze o blizsze informacje. a dokladniej do czego chcialby wykorzystac ten port.
  • #10 586337
    fantom
    Poziom 31  
    Posty: 1649
    Pomógł: 108
    Ocena: 41
    Jezu nastepny klotliwy.Sieja ich czy jak ?
    Niech ze i bedzie Delphi co mnie to interesuje,tyle opinii co osob.Jeden pisze w Basicu,drugi w C/C++,trzeci w Pascalu a jeszcze inny w Fortranie.Ksiazki nie trzeba kupowac tylko zassac z elki i jest to najlepsze kompendium wiedzy o porcie szeregowym z jakim sie spotkalem (a spotkalem ich troche).WinAPI moze i najprostsze nie jest ale ma jedna wielka zalete:mozna z niego korzystac we wszystkich jezykach a do tego NIGDY nie ma zadnych problemow z uruchamianiem go na Windach bo do tego sluzy.
    Cytat:
    a goldfire prosze o blizsze informacje. a dokladniej do czego chcialby wykorzystac ten port.

    Coz no MYŚLĘ ze napewno do transmisji danych :lol:

    Aha no i MYŚLĘ ze chodzilo ci o komponent CiaComPort.
  • REKLAMA
  • #11 588146
    nooa
    Poziom 12  
    Posty: 22
    Mógły mi ktoś pomów w moim problemie związanym z wysłąnie 8 bitów przez TXD przy pomocy delphi. Proszę o konkretny przykład.
  • #12 588465
    centipede
    Poziom 16  
    Posty: 234
    Pomógł: 1
    Ocena: 4
    ja mam pytanko odnośnie pascala - wszystko pięknie, tylko jak ustawić "1"
    na RTS, tak ,żeby zasilać układ bezpośrednio z kompa - bez zasilacza lub baterii..
  • #13 588983
    BoskiDialer
    Poziom 34  
    Posty: 1530
    Pomógł: 353
    Ocena: 42
    1 na RTS:
    Ustawiasz bit 1 w porcie MCR (base+4).. w pascalu to będzie wyglądać tak:
    port[$3f8+4]:=port[$3f8+4] or $02;

    a wyłączenie:
    port[$3f8+4]:=port[$3f8+4] and (not $02);
  • #14 589007
    centipede
    Poziom 16  
    Posty: 234
    Pomógł: 1
    Ocena: 4
    Wielkie dzięki ..
  • #15 589037
    centipede
    Poziom 16  
    Posty: 234
    Pomógł: 1
    Ocena: 4
    Jeszcze jedno pytanko:
    Da się ustawiac 1 na jakichś inny liniach ??
    chodzi mi o włąściwości podobne do RTS'a ??
  • #16 589057
    fantom
    Poziom 31  
    Posty: 1649
    Pomógł: 108
    Ocena: 41
    centipede napisał:
    Jeszcze jedno pytanko:
    Da się ustawiac 1 na jakichś inny liniach ??
    chodzi mi o włąściwości podobne do RTS'a ??

    DTR (linia nr 4), a jezeli chodzi o ten dostep "portowy" to pamietaj ze w xp-ku trzeba to robic troche inaczej.
  • #17 589074
    centipede
    Poziom 16  
    Posty: 234
    Pomógł: 1
    Ocena: 4
    fantom napisał:
    pamietaj ze w xp-ku trzeba to robic troche inaczej.

    ja mam Slackware ..
    jak zrobić to z DTR'em ??
    w pascal'u ??
    wiem ,że może jestem nudny , ale nigdy nie programowałem portów I/O ..
  • #18 589084
    fantom
    Poziom 31  
    Posty: 1649
    Pomógł: 108
    Ocena: 41
    Nigdy mi nie przyszlo do glowy zeby obslugiwac RS-a portowo wiec nie pamietam.Jesli to Linux to sa tam specjalne biblioteki do portu szeregowego (chyba termios ?!)
  • #19 589266
    centipede
    Poziom 16  
    Posty: 234
    Pomógł: 1
    Ocena: 4
    BoskiDialer, pomożesz jeszcze raz ??
    jak ustawić "1" na DTR ??
  • #20 589425
    yaroo
    Poziom 11  
    Posty: 32
    jak juz tak sie uczepiliscie zasilania ukladow z portu rs232 to jaki prad maksymalnie mozna z niego pociagnac??
    a jaki z usb??
  • #21 589433
    fantom
    Poziom 31  
    Posty: 1649
    Pomógł: 108
    Ocena: 41
    Z USB okolo 500mA, z RS-a....hmmm jakies kilkanascie miliamperow z DTR i RTS razem wzietych.Natomiast na RS-ie jest -12 jako "1" a +12 jako "0" wiec trzeba z tym uzwazac a na USB klasycznie +5.
  • REKLAMA
  • #22 590608
    BoskiDialer
    Poziom 34  
    Posty: 1530
    Pomógł: 353
    Ocena: 42
    bit nr 0 portu MCR - DTR
    bit nr 1 portu MCR - RTS

    1 na DTR port[$3f8+4]:=port[$3f8+4] or $01;
    0 na DTR port[$3f8+4]:=port[$3f8+4] and (not $01);

    1 na RTS port[$3f8+4]:=port[$3f8+4] or $02;
    0 na RTS port[$3f8+4]:=port[$3f8+4] and (not $02);
  • #23 592929
    centipede
    Poziom 16  
    Posty: 234
    Pomógł: 1
    Ocena: 4
    Dzięki..za info o DTR..
    Pozdrawiam..
  • #24 615811
    centipede
    Poziom 16  
    Posty: 234
    Pomógł: 1
    Ocena: 4
    Nie chciałem zakładać nowego postu, ponieważ tu jest już dużo powiedziane na temat rs232 i pascala, napisałbym wcześniej , ale chwilowo nie miałem dostępu do internetu ..
    Pytanko:
    Jak w pascalu zmienić baudrate ??
  • #25 616734
    BoskiDialer
    Poziom 34  
    Posty: 1530
    Pomógł: 353
    Ocena: 42
    fragment mojego kodu:
    const com=$3f8;
    var i:word;z:longint;
    begin
    (...)
      z:=38400; { prędkość transmisji }
      i:=round(115200/z); { obliczenie wartości licznika }
      port[com+3]:=port[com+3] or $80; { wejście w tryb ustawiania prędkości }
      port[com]:=i and $ff; {wpisanie prędkości}
      port[com+1]:=i shr 8;
      port[com+3]:=port[com+3] and $7f; {wyjście z trybu ustawiania prędkości }
    (...)
    end.
  • #26 617275
    centipede
    Poziom 16  
    Posty: 234
    Pomógł: 1
    Ocena: 4
    Cytat:

    i:=round(115200/z);

    115200 jest stałą (stosuje się to do każdej prędkości) ??
    Dzięki ,widzę ,że jesteś mocno wtajemniczony w obsługę rs'a, szczerze mówiąc , to byłem przekonany ,że to właśnie Ty mi odpowiesz ..
  • #27 617757
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 241
    centipede napisał:
    Cytat:

    i:=round(115200/z);

    115200 jest stałą (stosuje się to do każdej prędkości) ??
    Tak, dla wartości 115kbit musi wyjść 1 dla mniejszych prędkosci odpowiednio więcej.
  • #28 617859
    centipede
    Poziom 16  
    Posty: 234
    Pomógł: 1
    Ocena: 4
    ostatnie już naprawdę pytanko :
    jak odsługuje się RXD ??
  • #29 618401
    BoskiDialer
    Poziom 34  
    Posty: 1530
    Pomógł: 353
    Ocena: 42
    jeśli do portu $3f8 wpiszesz jakąś daną, to zostanie ona wysłana przez kabel TxD.. jeśli dane zostaną odebrane z linii RxD to odczyt portu $3f8 zwróci tą właśnie daną..
    tz:
    Zapis $3f8 - Wysłanie danych..
    Odczyt $3f8 - Odczyt odebranych danych..
    jeśli w porcie $3f8+5 (LSR) jest ustawiony bit:
    0 - odebrano bajt, można go odczytać z portu $3f8
    1 - błąd nieodebranej ramki
    2 - błąd parzystości
    3 - błąd ramki
    5 - bufor nadajnika pusty (jeśli ten bit=1 można wpisać dane do portu $3f8)

    115200 to ja tak napisałem w skróceniu....
    w rzeczywistości powinno być 1843200/16
    (prędkość kwarcu uartu przez preskaler)
    ale dla skrócenia ja napisałem tak a nie inaczej, gdyż wynik jest taki sam
  • #30 619273
    euromatic
    Poziom 21  
    Posty: 422
    Pomógł: 17
    Ocena: 14
    "W jakim jezyku programowania jest najprościej napisać obsługe rs232?
    Na PC?"
    najprościej to będzie w VB6.

    MSComm1.Output = "To jest tekst do wysłania" & vbCr


    odbiór:

    Private Sub MSComm1_OnComm()
    Select Case MSComm1.CommEvent
    Case comEvReceive
    strWej = MSComm1.Input
    strDana = strDana & strWej
    If strWej = vbCr Then
    Ciag = strDana
    End If
    End Select
    End Sub



    a jak ustawić koma?

    MSComm1.CommPort = 1 'ustawienie numeru Comma
    MSComm1.Settings = "9600,n,8,1" 'parametry portu
    Debug.Print "----------"
    MSComm1.RThreshold = 1
    MSComm1.PortOpen = True
    MSComm1.InputLen = 1


    pozdrawiam

Podsumowanie tematu

✨ Dyskusja dotyczy wyboru najprostszego języka programowania do obsługi portu RS232 na komputerze PC. Wskazano różne podejścia: język C z funkcjami bioscom (działającymi pod Windows 98) i outportb (DOS), Pascal z bezpośrednim dostępem do portów (np. portw[$3f8+6]), Delphi z komponentem CiaComPort ułatwiającym obsługę, Visual Basic 6 z kontrolką MSComm32.ocx oraz Python z biblioteką pyserial. Podkreślono, że pod Windows 2000 i nowszymi bezpośredni dostęp do portów (np. przez port[]) jest ograniczony i zalecane jest użycie WinAPI (funkcje CreateFile, WriteFile, ReadFile, struktury DCB, COMMSTAT) lub dedykowanych bibliotek (np. inpout32.dll, DLPortIO). Omówiono sterowanie liniami sygnałowymi RTS, DTR i TxD poprzez manipulację rejestrami portu (np. port[$3f8+4]) oraz kwestie ustawiania prędkości transmisji (baudrate) w Pascalu. Poruszono też problem kompatybilności kodu pod Windows XP i nowsze systemy, gdzie bezpośredni dostęp do portów wymaga dodatkowych nakładek lub korzystania z API. Wskazano, że komponenty obiektowe w Delphi i C++ Builder znacznie upraszczają programowanie RS232, ale można też korzystać z natywnych funkcji systemowych. Dyskutowano także o problemach z transmisją danych binarnych, obsługą przerwań, błędami parzystości oraz oprogramowaniu do sterowania portem COM. Wspomniano o książce "RS 232C praktyczne programowanie od Pascala i C++ do Delphi i Buildera" jako wartościowym źródle wiedzy.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA