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

Pascal - weryfikacja transmisji przez COM, przerwania i kabel home-made

chemik143 26 Kwi 2007 17:08 1738 9
REKLAMA
  • #1 3823880
    chemik143
    Poziom 13  
    Posty: 102
    Pomógł: 1
    Ocena: 17
    Witam, napisałem 2 programy. Służą one do przesyłania danej z jednego komputera na drugi. Chce opanować przesyłanie danych przez potr Com. Program 1 ma wysyłać wartość znaku naciśniętego na klawiaturce, a program 2 ma go odebrać i napisać na ekranie. Użyłem tam przerwania.. tylko czy prawidłowo. Proszę o weryfikacje, bo ni jak nie chce to działać mi a powinno. być może to wina kabla, bo jest home-made z kawałków długopisu i drutu nawojowego. Ktoś może obadać czy to działa?? albo napisać jakie widzi błędy...

    Program 1 :
    uses dos,crt;
    
    var regs:registers;
    var out:char;
    begin
    regs.AH := 0; {01h}
    regs.DX := 0; {COM1}
    regs.AL := 3; {110 b/s, brak parzystosci, 1 bit stopu, 8 bit˘w danych}
    Intr($14, regs);
    out:=readkey;
    regs.AL := ord(out);
    regs.AH := 1;
    regs.DX := 1;
    Intr($14, regs);
    end.


    Program 2 (odbierający...)

    
    uses dos, crt;
    var regs:registers;
        stary:pointer;
    
    procedure przerwanie; Interrupt;
    begin;
    regs.AH := 2;
    regs.DX := 1;
    Intr($14, regs);
    Write(char(regs.AL),regs.AL);
    end;
    
    
    begin
    regs.AH := 0; {01h}
    regs.DX := 0; {COM1}
    regs.AL := 3; {110 b/s, brak kontroli parzystosci, 8 bit˘w danych, 1 bit stopu}
    Intr($14, regs);
    getintvec($0C,stary);
    setintvec($0C,addr(przerwanie));
    { Wlaczenie przerwania IRQ4 }
    asm
     in  al,  21h
     and al,  239
     out 21h, al
    end;
    repeat
    until keypressed;
    { Wyylczenie przerwania IRQ4 - COM1 }
    asm
     in  al,  21h
     or  al,  16
     out 21h, al
    end;
    setintvec($0C,stary);
    end.


    Jeden komputer to athlonik 2600 32 bitowy, a drugi to 486 100MHZ-laptop stary[/code]
  • REKLAMA
  • #2 3824656
    zaytzev
    Poziom 13  
    Posty: 51
    Pomógł: 6
    Ocena: 6
    Sorry ale muszę zapytać. Po co bawisz się w to w tak przestarzałym i nie używanym w praktyce języku? Chyba nawet w Delphi (nie znam, bo wolę języki oparte na składni C) są do tego eleganckie klasy i kontrolki. :)
  • #3 3825784
    chemik143
    Poziom 13  
    Posty: 102
    Pomógł: 1
    Ocena: 17
    ehhh.. ten program to tylko test!! W rzecywistości robię troche większy projekt który ma działać na b. starym koputerku 486. Niemoge narazie zdradzić szczegułów ale musze sie nauczyć obsługiwać ten port z PASCALA

    Wiadomo że na delphi albo C++ to byłoby prościej... ale w pascalu umiem w cholere duo rzeczy robić, mam moduły porobione, to niebede wszystkiego robił od nowa spowodu jakiegoś COMa ;)
  • REKLAMA
  • #4 3826571
    Fyszo
    Poziom 37  
    Posty: 3987
    Pomógł: 223
    Ocena: 115
    Oj z tym comem w dosie rożnie bywało. Najlepsza obsługa to chyba przez porty I/O byłaby.
  • #5 3828434
    chemik143
    Poziom 13  
    Posty: 102
    Pomógł: 1
    Ocena: 17
    hmm.. to jak?? ten program teoretycznie powinien spełniać swoje zadanie waszym zdaniem?? może ktoś przetestować to??
  • #6 3828591
    starob
    Poziom 29  
    Posty: 1088
    Pomógł: 128
    Ocena: 137
    Czy interesuje cię gotowa biblioteka w TP (i nie tylko). Firma Moxa dołączała to kiedyś do swoich kart RS.
    Mam gdzieś gotowy sterownik pod Dos-a, obsługa coma jest banalna (sam podpina się pod przerwania, tworzy bufor, można założyć pułapkę na określony znak lub liczbę odczytanych danych,...full wypas). Obsługuje też porty z płyty gł.
    W międzyczasie spróbuj coś odszukać pod hasłem: "moxa, comlib" , a ja zaczynam szukać.
  • REKLAMA
  • #7 3839441
    chemik143
    Poziom 13  
    Posty: 102
    Pomógł: 1
    Ocena: 17
    nooo to by było ekstra:) tak się składa że musze odczytywać ramkę 32 bajty danych, wiec to by było bardzo pomocne:*
  • REKLAMA
  • #8 3847427
    starob
    Poziom 29  
    Posty: 1088
    Pomógł: 128
    Ocena: 137
    Poszło na PW - powodzenia.
  • #9 3848240
    Xitami
    Poziom 29  
    Posty: 1130
    Pomógł: 118
    Ocena: 31
    zaytzev napisał:
    Sorry ale muszę zapytać. Po co bawisz się w to w tak przestarzałym i nie używanym w praktyce języku? Chyba nawet w Delphi (nie znam, bo wolę języki oparte na składni C) są do tego eleganckie klasy i kontrolki. :)
    A ja to nawet myślę, że kiedyś na dowolne pytanie będzie można odpowiedzieć odsyłając do odpowiedniej biblioteki.
    Można tak, i pewnie wyrobnik/rzemiocha powinien tak do tego podchodzić, ale są tacy co chcą wiedzieć jak coś się robi.
    Choćby, po to by nie pytać jak np. wielodostępnej, rozproszonej, lekko rozmytej w logice aplikacji, pomnożyć przez siebie dwie liczby wykraczające poza tabliczkę mnożenia.

    A co do meritum (pamięta jeszcze ktoś?) to nie pamiętam niestety, pamiętam tylko że strasznie pomocna była maszyna :) "maszyna stanów".

    Z przechwytywaniem przerwań bym uważał, a co z kontrolerem przerwań? Port chyba $20

    Czy wszystko kiedyś znajdzie się w odpowiedniej bibliotece?
    Nie!!!
    Zawsze zostanie coś do wymyślenia, na szczęście.
  • #10 4594870
    chemik143
    Poziom 13  
    Posty: 102
    Pomógł: 1
    Ocena: 17
    Heh... ogólnie jestem wrogiem nowoczesności. Dzisiejsze komputery maja byc do wszystkiego, a są do niczego:( Tęsknie za czasami kiedy wystarczał mi Windows 3.1, który nigdy mi się nie zwiesił przez tyle lat:D Jednocześnie zdaję sobie sprawę z tego, że wiele programów byłoby praktycznie nie do napisania bez tych niewydajnych obiektów i skakania między DLL ami:) Puki co, to co sie da sterować starym kompem, steruje starym;) jakoś mam większe zaufanie:) Tymczasem wklejam kody programów które działają:) Może sie przyda komuś sedno sprawy. Jeden program wysyła znak a na drugim sie on pojawia. Tylko tyle;) żeby nie zatrzeć tego co najważniejsze:)

    Nie wiem dlaczego program działa na XP.. bo nie powinien ;) raz na 50 załączeń wyskakuje komunikat ze XP nie pozwala dostać sie do COM1 czego żąda program;) (powtarzalność procesów tak??)

    "Nadajnik":

    
    uses dos,crt;
    
    var regs:registers;
    var out:char;
    begin
    regs.AH := 0;
    regs.DX := 0;
    regs.AL := 3; 
    Intr($14, regs);
    
    repeat
    out:=readkey;
    Port[$3f8]:=ord(out);
    until out=#13;
    end.
    


    "odbiornik":

    
    uses dos, crt;
    var regs:registers;
    stary:pointer;
    a,sa:byte;
    
    begin
    regs.AH := 0;
    regs.DX := 0;
    regs.AL := 3;
    Intr($14, regs);
    a:=1;
    sa:=1;
    repeat
    
    a:=Port[$3f8];
    if a<>sa then write(chr(a));
    sa:=a;
    until keypressed;
    end.
    

Podsumowanie tematu

✨ Dyskusja dotyczy weryfikacji działania dwóch programów napisanych w Pascalu pod DOS, służących do przesyłania znaków przez port COM między dwoma komputerami, z wykorzystaniem przerwań. Program 1 wysyła znak z klawiatury, a Program 2 odbiera go i wyświetla na ekranie. Autor ma problem z działaniem transmisji, podejrzewa błędy w kodzie lub w domowej konstrukcji kabla z drutu nawojowego i elementów długopisu. Wskazano, że obsługa portu COM w DOS może być problematyczna i sugerowano alternatywne metody, np. bezpośredni dostęp do portów I/O. Zaproponowano także użycie gotowych bibliotek, takich jak biblioteka Moxa (comlib) do Turbo Pascala, która oferuje obsługę przerwań, buforowanie i zaawansowane funkcje komunikacji szeregowej. Autor potwierdził, że ostatecznie udało mu się uruchomić działające programy na systemie Windows XP, choć z pewnymi problemami dostępu do COM1. Dyskusja podkreśla trudności pracy z portem szeregowym w środowisku DOS i Pascalu na starym sprzęcie (486), a także zalety i ograniczenia stosowania przerwań i własnoręcznie wykonanych kabli do transmisji danych.
Wygenerowane przez model językowy.
REKLAMA