# rs485 i kity avt

## bartmarian

Witam,

kupiłem kilka zestawów avt - 530usb, 531, 535 http://serwis.avt.pl/manuals/AVT531.pdf

pojawia mi się /dev/ttyUSB0, mogę zmienić prędkość portu na 1200, ale nie bardzo wiem jak wysłać

znaki ASCII do urządzenia, tzn w teorii wiem, poszukałem i znalazłem, tylko u mnie nie działa, to co znalazłem

nie dotyczy ww układów tylko ogólne informacje, nie wiem czy to co robię jest ok.

Zmiana na prędkość 1200:

```
stty -F /dev/ttyUSB0 1200
```

otrzymuję:

```
# stty -F /dev/ttyUSB0

speed 1200 baud; line = 0;

-brkint -imaxbel
```

próbuję odczytać stan z 535

```
echo -en "\x1B\x20\x35\x20\x72\x20\x31" > /dev/ttyUSB0
```

czyli o ile dobrze rozumiem odpowiednik "ESC 5 r 1"

Nie zwraca żadnego wyniku, proszę o jakieś wskazówki.

--edit--

znalazłem błąd, na końcu nie mam enter'a ale nie wiem jak go wysłać.

--edit--

enter o ile dobrze znalazłem to \x0a - całość nadal milczy.

----------

## sebas86

A próbowałeś kończyć linię CRLF (\r\n)?

----------

## bartmarian

Wcześniej nie, próbowałem na wszystkie - jakie znalazłem - w sieci, nic.

Jeżeli dobrze zrozumiałem chodzi o:

```
 echo -en "\x1B\x20\x35\x20\x72\x20\x31\x0A\r\n" > /dev/ttyUSB0 
```

milczy.

Spróbuję jutro z php, widziałem przykład w sieci, komuś działało.

----------

## sebas86

Jeśli wysyłasz CRLF 0x0a jest zbędne (a nawet błędne, jeśli druga strona oczekuje konkretnego kodu końca).

I nie jestem pewien czy stosowanie spacji jest w ogóle potrzebne i czy nie to jest właśnie problemem (0x20) - z dokumentacji nie wynika jednoznacznie czy znak spacji powinien się tam znaleźć czy też nie, enter jest zaznaczony wyraźnie ale najlepiej gdyby podawali przykłady kodów zapisanych bajtami (albo z akcentowanymi spacjami).

Spróbowałbym kilku wariantów, np.:

```
echo -en "\x1b1wn1\r\n"

echo -en "\x1b1wn1\n"

echo -en "\x1b 1 w n 1\r\n"

echo -en "\x1b 1 w n 1 \r\n"

echo -en "\x1b 1 w n 1\n"

echo -en "\x1b 1 w n 1 \n"
```

----------

## gexcite

Jeśli dobrze zrozumiałem instrukcję polecenie powinno wyglądać mniej więcej tak:

```
echo -en "\x1b1w11\n" > /dev/ttyUSB0
```

----------

## bartmarian

Karta 531 ruszyła - gexcite dokładnie tak jak napisałeś, część robiłem zdalnie, nie widząc co się dzieje,

męczyłem 535, bo ta powinna odpowiedzieć, jednak tak się nie dzieje, zmyliło mnie też to, że po próbie odczytu

położenia przekaźnika też otrzymuję ciszę, wygląda na to, że nie wyświetla odpowiedzi, gdy jest pytany ale

wykonuje polecenia.

--edit--

Przyniosłem do domu całość. 530usb posiada dwie diody sygnalizujące komunikację, gdy wł/wył przekaźnik(i)

widać tylko nadawanie, gdy odczytuję stan, 530usb sygnalizuje nadawanie i odbiór, ale nie widzę odpowiedzi

w konsoli.

----------

## gexcite

Sugeruję użyć najpierw Minicoma. Do testów zmacznie lepszy. Jak już ogarniesz to jakaś prosta apka w C. Ewentualnie bash.

----------

## bartmarian

Spróbowałem z putty, wyników/odpowiedzi terminal nie wyświetla ale wykonuje to co dostanie,

jedyny terminal jaki wyświetlał wszystko poprawnie to Bray+ (ten próbowałem z windy).

Przy wysyłaniu polecenia "włącz 1 przekaźnik" na 530usb widzę, że komunikacja jest w jedną

stronę, zapala się tylko dioda TX, przy odczycie zapala się TX a za ułamek sek RX, więc odpowiada

(bo i Bray+ pokazuje), prawdopodobnie mam złe ustawienia portu...

```
# stty -F /dev/ttyUSB0 -a

speed 1200 baud; rows 0; columns 0; line = 0;

intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W;

lnext = ^V; flush = ^O; min = 1; time = 0;

-parenb -parodd cs8 hupcl -cstopb cread clocal -crtscts

-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8

opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0

isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke
```

tylko nie wiem co mógłbym przestawić, do tej porty udawało mi się (zmianami) tylko utracić komunikację  :Smile: 

----------

## bartmarian

Jak się okazuje, klocki odpowiadają, nie jest to wyświetlane, python jednak odbiera bdb.

Znalazłem w sieci jak odczytać stan:

```

#!/usr/bin/env python

import serial

port =serial.Serial(

    "/dev/ttyUSB0",

    baudrate=1200,

    parity=serial.PARITY_NONE,

    stopbits=serial.STOPBITS_ONE,

    bytesize=serial.EIGHTBITS,

    writeTimeout = 0,

    timeout = .1,

    rtscts=False,

    dsrdtr=False,

    xonxoff=False)

port.write('\x1b5r3\x0d')

while True:

    response=port.read(8)

    print(response)

    break
```

nie wiem jak podać "port.write('\x1b5r3\x0d')" jako argument do skryptu, (idealnie) np: # stan.py 5r3

proszę o wskazówkę.

Pozdrawiam

----------

## sebas86

http://www.tutorialspoint.com/python/python_command_line_arguments.htm

http://pl.wikibooks.org/wiki/Zanurkuj_w_Pythonie/Obs%C5%82uga_argument%C3%B3w_linii_polece%C5%84

----------

## bartmarian

Nie znam języków jak python, wewnętrznie czułem jednak, że to musi być proste - nie wytrzymałem i napisałem @ do

znajomego dev'a jak to rozwiązać, przeczucie mnie nie myliło, że wystarczy jedna linijka  :Smile:  przy okazji powstał inny problem,

który tymczasowo obszedłem sprawdzeniem czy port nie jest w użyciu i odczekaniem chwili.

Na dłuższą metę jednak to nie wystarczy, szczególnie gdy uruchomię czujniki które będą odpytywane nie z cron'a raz na

minutę a w pętki co np 2sek, pomyślałem więc o serial-proxy, nie wiem czy coś takiego istnieje, ale wiem jak chciałbym by

działało, program tworzy wirtualne porty, dla różnych skryptów i tylko on odwołuje się do portu, nie wiem tylko czy coś takiego

istnieje. Jak ktoś wie, oprócz napisania sobie samemu w C a najlepiej w asemblerze, to z góry dzięki za info.

Nie wiem czy wszystko w skrypcie jest zgodne z sztuką, ale działa i może komuś się przyda.

```
#!/usr/bin/env python

import serial, string, time, getopt, sys

rs485 = '/dev/ttyUSB0'

baud = 1200

sendText = '\x1b' + sys.argv[1] + '\x0d'

while True:

    try:

        ser = serial.Serial(rs485, baud, timeout=.1)

        break

    except serial.SerialException:

        print 'rs485 not available. Wait...'

        time.sleep(1.5)

ser.write(sendText)

while True:

    response=ser.read(8)

    print(response)

    break
```

----------

## gexcite

Nigdzie nie zamykasz portu po użyciu. Peenie to jest przyczyna że się blokuje po użyciu na jakiś czas.

----------

## bartmarian

Zmieniłem w nocy całość, zamknięcie portu też ma już miejsce. Teraz pętla czyta/pisze z/do plików tekstowych

a powłoka wykonuje kiedy chce resztę, tak działa o wiele lepiej, jedyny kłopot jaki występuje to odczyt avt535,

co 10-15 odczytów w pliku nie ma niczego, sporadycznie otrzymuję dwa puste wyniki jeden po drugin, to nie jest

specjalnie uciążliwe, zwraca 0 na które nie reaguję, 1 gdzie jest część dalsza i nic, gdzie też nie ma reakcji,

więc co najwyżej grozi to 1-2 sek opuźnieniem, tylko niefajnie wyglądają takie szczerby, może jest na to rada ?

----------

## bartmarian

Rozwiązaniem jest odczyt do temp'a i zmiana nazw pliku, problemem był czas odczytu, dodatkowo przy starcie

całość kopiowana jest na ramdysk poza bazą rrd - teraz jest ok.

Nie wiem jak na stronie www, bez odświerzania umieścić status (sposób dowolny) w html/php/javascript/java, no może nie flash,

czyli ciągły odczyt nastu pliku(ów), w którym(ch) mam 0/1 + zamiana 0/1 na ikonę lub chociaż okrąg/kwadrat

zależnie od stanu zielony/czerwony. Pomocy  :Smile: 

Pozdrawiam

----------

