Port szeregowy, ustawienie 0 i 1 na TXD

Problemy dotyczące programowania.

Moderatorzy: Moderatorzy, Administratorzy

Awatar użytkownika
aksnet
Użytkownik
Posty: 70
Rejestracja: 2008-03-02, 19:09
Lokalizacja: z 10.0.1.1

Port szeregowy, ustawienie 0 i 1 na TXD

Post autor: aksnet »

Witam

Potrzebuję zrobić pewną rzecz na porcie szeregowym (a nie jestem znawcą tematu).

Przed rozpoczęciem transmisji na TXD portu szeregowego występuje 1 (około -12V).
Szukam prostego sposobu na zmianę stanu TXD z 1 na 0 (około +12V ) na określony dłuższy czas rzędu sekund, a następnie zmianę tego stanu znów na 1.

Potrzebuję tego do sterowania urządzeniem zewnętrznym na zasadzie włącz/wyłącz
Byłoby miło gdyby dało się to zrobić w bashu, ewentualnie w C ;)

aksnet
Awatar użytkownika
aksnet
Użytkownik
Posty: 70
Rejestracja: 2008-03-02, 19:09
Lokalizacja: z 10.0.1.1

Re: Port szeregowy, ustawienie 0 i 1 na TXD

Post autor: aksnet »

Witam

Problem rozwiązałem poprzez zaprojektowanie elektroniki, która wykrywa jakąkolwiek (dowolną)transmisję na TXD.
Potem w pętli przez wybrany czas wysyłam cokolwiek na TXD. Po zakończeniu transmisji na TXD pojawia się znów 1 (-12V).
Jeśli ktoś jest zainteresowany mogę umieścić na forum całe rozwiązanie (dwa tranzystory, dioda, kondensator, trzy rezystory i na końcu przekaźnik)
Steruje tym prosty programik na kilka linii kodu w bashu.

pozdrawiam
aksnet
Awatar użytkownika
aksnet
Użytkownik
Posty: 70
Rejestracja: 2008-03-02, 19:09
Lokalizacja: z 10.0.1.1

Re: Port szeregowy, ustawienie 0 i 1 na TXD

Post autor: aksnet »

Rozwiązanie dla potomnych (może komuś się przyda)

Moja płyta ma wyprowadzone 2 porty szeregowe, więc robię transmisje na oba (obojętne do którego potem wepnę kabelek)
Zasilanie +12V i masę (GND) biorę z zasilacza komputerowego
Z portu szeregowego używam tylko jednego kabelka TXD.

Jako parametr skryptu podaje czas w sekundach (i tyle czasu jest włączony przekażnik)
Opóźnienie w załączeniu i wyłączeniu przekaźnika wynosi ok. 1 sekundy
(ale dzięki temu elektronika jest odporna na zakłócenia, np. zauważyłem niepożądany krótki impuls na TXD pojawiający się w trakcie wyłączania komputera)
Żeby zmniejszyć opóźnienie można dać trochę mniejszy kondensator.

Używam tego urządzenia do automatycznego restartu (wyłączenie zasilania na kilkanaście sekund) modemów co 48 godzin o 5 rano.
Modemy po kilku dobach pracy niestety potrafiły się mocno zamulić.


Pozdrawiam
aksnet

Kod: Zaznacz cały

#!/bin/sh

if [[ $1 -eq "" ]]
then
  echo "podaj czas w sekundach"
  exit;
fi

COM1="/dev/ttyS0"
COM2="/dev/ttyS1"
COM_INIT="9600 cs8 clocal -cstopb -parenb -parodd -crtscts -cread"
# COM speeds: 110, 150, 300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 56000, 115200

stty -F $COM1 $COM_INIT
stty -F $COM2 $COM_INIT

REBOOT_TIME=$1

NOW=$(date '+%s')   # sekund od 1970
STOP_TIME=$(( $NOW + $REBOOT_TIME ))

while [[ $NOW < $STOP_TIME ]] ;
do  
  echo '\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' > $COM1
  echo '\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' > $COM2
  
  NOW=$(date '+%s') 
  # echo $NOW
done

#stty -a -F $COM1
#stty -a -F $COM2
Załączniki
serwer_com.gif
Ostatnio zmieniony 2016-06-02, 14:39 przez aksnet, łącznie zmieniany 5 razy.
Awatar użytkownika
webster
Użytkownik
Posty: 1269
Rejestracja: 2009-10-06, 11:58
Lokalizacja: Gdańsk
Kontakt:

Re: Port szeregowy, ustawienie 0 i 1 na TXD

Post autor: webster »

Thx aksnet, fajnie by było, by temat wskoczył do "Propozycje do FAQ", łatwiej będzie kiedyś to znaleźć w potrzebie :)
††† Chaos Of The Mirror - Valheru †††
††† I ♥ SlackWare RuLeZ †††

Slackware Poland FaceBook
Awatar użytkownika
bojleros
Użytkownik
Posty: 785
Rejestracja: 2005-08-29, 11:12
Lokalizacja: z widokem na familoki :)

Re: Port szeregowy, ustawienie 0 i 1 na TXD

Post autor: bojleros »

Podstawa, jeżeli chce się sterować zasilaniem 230V to dla własnej zdrowotności trzeba wiedzieć co się robi albo porozmawiać z kimś kto się zna na rzeczy.

Poniżej kilka mniej oczywistych rozwiązań w różnej skali.

1) W FAQ Slacka (tych z paczek) był kiedyś opis układu załączającego czajnik za pośrednictwem elektroniki podpiętej do LPT.
2) Niektóre programatory do popularnych mikrokontrolerów po zmianie oprogramowania są konwerterami (tty)USB / 8bit więc dodać przekaźnik jest względnie łatwo.
3) Istnieją przemysłowe konwertery RS232 (do kilkunastu metrów) / RS485 (do kilkuset metrów po jednej parze skrętki przy wielu urządzeniach na magistrali) na IO stykowe.
4) Istnieją sterowniki pozwalające na sterowanie przez GSM.
5) Trochę drożej wychodzi zakup najtańszego chińskiego PLC z kilkoma IO i ethernetem/RS485/GSM i oprogramowanie go. Niemniej tu już będzie spora dowolność w sterowaniu i w implementacji sekwencji.

Konwertery przemysłowe i sterowniki będą miały protokół Modbus.

Pozdrawiam,
Awatar użytkownika
aksnet
Użytkownik
Posty: 70
Rejestracja: 2008-03-02, 19:09
Lokalizacja: z 10.0.1.1

Re: Port szeregowy, ustawienie 0 i 1 na TXD

Post autor: aksnet »

Zmieniam schemat na bardziej aktualny (poprawiona wersja ze wzmacniaczem operacyjnym).
Urządzenia w tej wersji używam od kilku tygodni i sprawuje się dobrze.

Pozdrawiam.
Albert
Użytkownik
Posty: 8
Rejestracja: 2016-04-27, 10:07

Re: Port szeregowy, ustawienie 0 i 1 na TXD

Post autor: Albert »

Może zamiast używać linii TXD lepiej byłoby wykorzystać którąś ze sterujących?

Ten układ na wzmacniaczu operacyjnym to przerost formy nad treścią. O wiele prościej byłby to zrobić na małym mosfecie.

Kod: Zaznacz cały

>- D1 -- R1 --o---o---- bramka mosfeta
              |   |
             R2   C
              |   |
             ---  ---
R1 C eliminują załączenia dla chwilowych impulsów, R2 C podtrzymują napięcie na bramce mosfeta. Mosfet zamiast wzmacniacza operacyjnego i tranzystora BD, reszta układu taka sama.

A może:
https://sklep.avt.pl/avt925.html
http://forum.slackware.pl/viewtopic.php?t=14575
Awatar użytkownika
aksnet
Użytkownik
Posty: 70
Rejestracja: 2008-03-02, 19:09
Lokalizacja: z 10.0.1.1

Re: Port szeregowy, ustawienie 0 i 1 na TXD

Post autor: aksnet »

Wzmacniacz operacyjny z dodatnim sprzężeniem zwrotnym tworzy dodatkowo histerezę włączania/wyłączania.
Na mosfecie tego nie masz (rozwiązanie z mosfetem pewnie mogłoby być prostsze i wystarczające).

Możesz podać przykład kodu jak sterować inną linią niż TXD? (np. w bash lub C/C++)
Albert
Użytkownik
Posty: 8
Rejestracja: 2016-04-27, 10:07

Re: Port szeregowy, ustawienie 0 i 1 na TXD

Post autor: Albert »

http://ep.com.pl/files/3151.pdf
^ części jest więcej

Wg: http://comments.gmane.org/gmane.org.use ... .ale/30518 wystarczy otworzyć port żeby linia DTR się uaktywniła
"Opening the tty port should raise DTR if the bit rate is non-zero so stty 9600 -hupcl < /dev/ttyS0 should do it.
Use stty hupcl if you want to turn if off after close. sleep 1 < /dev/ttyS0 to pulse it for about a sec."

Tu jest spory kawałek kodu w pytonie:
ftp://ftp.ti.com/pub/data_acquisition/A ... alposix.py

Do zabawy portem szeregowym przymierzałem się już od jakiegoś czasu ale ja od razu użyję mikrokontrolera i maxa232 z czymś prymitywnym w rodzaju sterowania/protokołu. Do tego sterowanie przez www - myślałem nad apache i cgi albo shell_exec z własną binarką. Na razie czasu brak.
ODPOWIEDZ