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

Czy transmisja COM na 3 przewodach (masa, TxD, RxD) jest wystarczająca?

chemik143 17 Maj 2007 21:45 1983 12
REKLAMA
  • #1 3895472
    chemik143
    Poziom 13  
    Posty: 102
    Pomógł: 1
    Ocena: 17
    Witam, niewiem czy do końca trafiłem z tematem, ale myślę, że nie najgorzej. Otóż od dwuch miesięcy szperam, pytam i nic konkretnego dowiedzieć się na pewien temat niemoge, zawsze jakieś durne pytania, komentarze a na co poco itd...

    Do rzeczy:
    Otóż łącze pewien układzik elektroniczny, który konstruuje kolega z komputerem za pomocą portu com. Kolega mowi mi, ze musi to działać na 3 kabelkach tzn: masa, TxD i RxD z tego co pamiętam... No wiec troche mnie to dziwi, bo niby jak takie cuś miałoby działać. Naczytałem się sporo i wszędzie pisze że komputer musi dostać jakis sygnał przed wysłaniem danej, musi odpowiedzieć że jest gotowy na odbiór, a następnie odbierać dane.

    Teraz pytanie... Czy kolega ma racje że połączenie, w którym będą przesyłane 32 bajty danych na okrągło (taka ramka danych...) można przesyłać sprawnie za pomocą tychże 3 kabelków. Pomijam tu aspekt systemu operacyjnego komputera bo raczej zastanawia mnie to od strony układziku wysyłajacego... I prosze o odpowiedzi w miarę możliwości jednoznaczne.
  • REKLAMA
  • #2 3896017
    pubus
    Poziom 30  
    Posty: 1289
    Pomógł: 138
    Ocena: 31
    Tak jest to całkowicie normalne połączenie...
    Rzadko kiedy używa się pozostałych linii...
    Komputer wie, że coś jest w buforze odbiorczym...
    Generowane jest też przerwanie...
    Z tą ramką to trochę nie tak...
    Standardowa ramka dla rs232 ma 8-bit... max to 9...
    Natomiast pewnie chodzi o pakiet czyli 4x8bit...
  • REKLAMA
  • #3 3896468
    viayner
    Poziom 43  
    Posty: 10628
    Pomógł: 1563
    Ocena: 2051
    Witam,
    To jest normalna transmisja, sam buduje uklady na mikrokontralerach ktore komunikuja sie z PC za pomoca RS-232.
    Ta ramka to jak rozumiem bajt startu, dane i bajt konca transmisji.
    Pozostale piny w porcie RS sluza to kontroli transmisji i korekcji bledow. Jezli nie jest to duza odleglosc nie przejmuj sie nimi (10-15m)
    W tym wypadku masz tzw softwarowa kontrole przeplywu danych i o to martwi sie juz PC.
    Jak napisal kolega transmisja jest prosta, PC czy mikrokontroler dowiaduje sie o danych przez przerwanie zgloszone od odbiornika z portu szeregowego i tzw. obsluga przerwania zajmuje sie tym co z tymi danymi zrobic. Ilosc wysylanych danych nie ma tu znaczenia dla transmisji.
    Ukladzik wysyla dane na RS a PC a dokladniej program zajmuje sie ich poprawnym odczytem.
    Wazne aby parametry transmisji z obu stron byly jednakowe.
  • #4 3896533
    chemik143
    Poziom 13  
    Posty: 102
    Pomógł: 1
    Ocena: 17
    Wielkie dzięki!! usyskałem wiec odpowiedź na moje pytanie, za co jestem bardzo wdzięczny!! Kabel będzie miał może 50cm, nie wiecej, a z tą ramka to mam na myśli moja ramkę danych, 32 bajty każdy oznaczajacy inny parametr:) jednak to w rozpatrywanym problemie niepowinno mieć znaczenia. Teraz jednak mam jeszcze jedno, istotne pytanie:

    Czy dla połączenia komputer komputer jest identycznie? - mianowicie TxD i RxD na krzyż +masa

    Chcę testowac pewien program, który będzie dobierał dane, więc zrobiłem drugi, ktory wysyła przykładowe dane. Jednak program odbierajacy nie reaguje na przerwanie portu com, co oznacza, że żadna wartość nie przyszła...

    Czy po ustawieniu parametrów transmisji należy odczekać chwilkę, czy parametry zostają ustawione natychmiast?? - pytam ponieważ przeglądajac kod innego programu zauważyłem, że zaraz po ustawieniu parametrów transmisji jest oczekiwanie kilku sekund - niewiem poco.
  • #5 3896721
    viayner
    Poziom 43  
    Posty: 10628
    Pomógł: 1563
    Ocena: 2051
    Witam,
    linje TxD i RxD to dane wychodzace i przychodzace linja TxD nadajnika musi byc polaczona z RxD odbiornika.
    Co do niereagowania na dane przychodzace to problem moze byc w twoim programie, jestes pewien kodu ? uzyj moze terminala z windowsa do proba a jak transmisja bedzie ok, rob testy swojego programu.
    Ja pisalem kilka programow do obslugi RS'a i nie spotkalem sie z oczekiwaniem paru sekund, no moze kulku us jak to wynika z wykonania kilku linijek kodu ale bez przesady to powinno byc natychmiast, wysylasz dane do portu sterujacego/konfiguuracji - to trwa us.
    Moze ci podeslac jakis kod na probe, ostatnio cos pisalem w VB dla RS'a i dzialalo, komunikacja miedzy ukontrolerem a PC.
  • REKLAMA
  • #6 3896743
    chemik143
    Poziom 13  
    Posty: 102
    Pomógł: 1
    Ocena: 17
    tylko jeszcze zostaje jedna kwestia... Jeden komputer to zwykły przecietny komp z XPekiem , a drugi to stary laptop 100MHz, na którym mam DOSa i nawed CD tam niema żeby winde choćby 98 zainstalować. Oczywiscie podczas testów oba komputery włączam z pod DOSa... Wrazie czego zamieszczam kod programu, może akurat ktoś zauważy błąd. Niestety komputer będzie musiał pracowac na Dosie i inaczej z pewnych względów niemoge tego zrobić... A oto kody:


    program wysyłąjacy (wersja testowa!!):
    
     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);   {ustawiam znak odczytany z klawiatury jako znak do wysłania}
     regs.AH := 1;
     regs.DX := 1;
     Intr($14, regs);
     end.
    


    program odbierajacy:
    
    uses dos, crt;
    var regs:registers;
        stary:pointer;
        a:byte;
    
        procedure przerwanie; Interrupt;  {obsługa przerwania portu COM1}
        begin;
        regs.AH := 2;
        regs.DX := 1;
        Intr($14, regs);  {wczytanie wartości z portu...}
        a:=regs.AL;
        sound(300);
        delay(100);
        nosound;
        Write(a);      {wyświetlenie wartości}
        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)); {ustawienie procedury przerwania}
        asm
         in  al,  21h
         and al,  239
         out 21h, al       { Wlaczenie przerwania IRQ4 - COM1, tego co prawda do końca nie rozumiem tutaj, bo te 3 linie skopiowałem z innych programów wiec należało by to miejsce zweryfikowac... }
        end;
        repeat
        until keypressed;
    
           { Wylaczenie przerwania IRQ4 - COM1 }
        asm
        in  al,  21h
        or  al,  16
        out 21h, al
        end;
        setintvec($0C,stary);
        end.


    Wiem, że to juz zaczyna śmierdzieć programowaniem, ale niechcę zaczynać nowego tematu, a szczeże mówiąc, osoby w dziale programowanie niewiele mi pomogły...
  • #7 3896925
    viayner
    Poziom 43  
    Posty: 10628
    Pomógł: 1563
    Ocena: 2051
    Ah, stary dobry dos i przerwania, wspomianam z lezka w oku.
    A powaznie to na xp uzyj terminala nie ma znaczenia w jakim systemie chodzi komputer wysylajacy/odbierajacy. Nie jestem pewien ze ta procedurka w turbo pascalu pojdzie gladko pod xp nawet w sesji dosowej. A do wysylania mozesz uzyc starego dobrego NC on mial tam cos w stylu terminala lub poprostu wyslij jakis maly pliczek tekstowy.
    Kiedys mialem taka piekna ksiazke z dokladnym opisem przerwan systemowych i funkcji dos'a i tam bylo by wyjasnienie jak to dokladnie w dosie zrobic, ale nie pamietam teraz tego.
    Kiedys znalazlem biblioteke pod TP do obslugi RS'a poszukaj w sieci to ulatwialo sprawe.
  • #8 3896952
    chemik143
    Poziom 13  
    Posty: 102
    Pomógł: 1
    Ocena: 17
    nie odpalam dosa na XP, tylko z dyskietki;) czysty dosik... moduł jakis do tego mam, ale jest długi jak cholera z angielskimi komentarzami których nie rozumiem nijak-język jakis techniczny:/ Zaraz wyprubuje tego terminala w takim razie...

    chmm przyznaje sie, niewiem jak tego terminala użyć do sprawdzenia.. pisze mi że sie połaczył i co niby dalej??
  • REKLAMA
  • #10 3897044
    chemik143
    Poziom 13  
    Posty: 102
    Pomógł: 1
    Ocena: 17
    a niemiałbyś jak sprawdzić tych moich wypocin na swoim komputerku?? poczytałem co mi wysłałeś, w miarę kapuję z czym to sie je, ale niemoge dzisiaj za bardzo tego testować, bo muszw ważne sprawozdanie pisać. Gdybym wiwdział czy program wogóle wysyła daną...
  • #11 3897178
    viayner
    Poziom 43  
    Posty: 10628
    Pomógł: 1563
    Ocena: 2051
    Zobacze jak bede w domku, moze gdzies wydobede dosa i cos poprobuje.
    Sugeruje jednak na poczatek polaczysc ze soba te dwa komputery programami ktore napewno dzialaja a potem eksperymentowac jak wszystko zadziala
    Pozdrowienia
  • #12 3897197
    chemik143
    Poziom 13  
    Posty: 102
    Pomógł: 1
    Ocena: 17
    juz działa!! okazało sie że obsługa przerwania była trefna. Dałem bezpośrednie wpisanie wiadomości na port i bezpośrednio odczyt z portu na drugim kompie i działa bez zarzutu. Wielkie dzięki za pomoc. Z przerwaniami będę sie już bawił sam, jakos do tego dojde;) Pozdrawiam wszystkich:)
  • #13 4432049
    chemik143
    Poziom 13  
    Posty: 102
    Pomógł: 1
    Ocena: 17
    no i stało się najgorsze... Miałem efekty prac (już całe pliki przesyłałem...) a poszły się paść... wszystkie 5 nośników w których miałem ukryte moje kody (dysk, dyskietka, płyta, poczta i forum o maluchach) naraz się albo spieprzyło albo dane zniknęły... :/ teraz nie potrafię ani bajcika przesłać... nie wiem co było źle, bo dawno zaglądałem do programu. Tak więc temat całkowicie odświeżam. Google też sie jakieś dupiate zrobiło, nic konkretnego nie wyszukuje:/

    System windows XP czasem raz na 50 odpaleń programu wysyłajacego zgłasza sprzeciw...
    Wysyłanie nie działa nawet w czystym dosie z dyskietki!!
    Używam takiego kodu jak zamieściłem wyżej.
    probowałem ustawić porty za pomocą programu mode.com, i zapisywać / wczytywać dane prosto na/z portu, ale bez jakiejkolwiek reakcji.

    Jakieś propozycje?? jeśli ktoś ma czas i możliwość napisania programu jakiegokolwiek, który by przynajmniej jeden bajt przesłał jak trzeba, to prosiłbym o kod... dalej dam sobie rade...:D

Podsumowanie tematu

✨ Dyskusja dotyczy transmisji szeregowej RS-232 realizowanej na trzech przewodach: masa, TxD i RxD. Potwierdzono, że takie połączenie jest standardowe i wystarczające do przesyłania danych, nawet ciągłych ramek o długości 32 bajtów, pod warunkiem zgodności parametrów transmisji po obu stronach. Kontrola przepływu danych może być realizowana programowo, a komputer wykrywa dostępność danych przez przerwania generowane przez port szeregowy. W przypadku połączenia komputer-komputer należy połączyć linie TxD i RxD "na krzyż" oraz masę. Problemy z odbiorem danych często wynikają z błędów w oprogramowaniu obsługującym port COM, a nie z samego sprzętu. Użytkownik testował programy w DOS (Turbo Pascal), gdzie bezpośredni zapis i odczyt z portu COM okazał się skuteczny, natomiast obsługa przerwań wymagała korekty. Zalecane jest użycie terminala do testów transmisji. W późniejszym etapie pojawiły się problemy z transmisją na Windows XP i DOS, mimo stosowania poprawnego kodu i konfiguracji portu (np. za pomocą mode.com). Użytkownik prosił o przykładowy kod do przesłania pojedynczego bajtu, aby zweryfikować działanie sprzętu i oprogramowania.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA