1

Temat: WDR3600 i rs485

Witam,
mam problem z komunikacją sterownik <-> rs485 <-> wdr3600.

Sterownik to atmega32 (zegarek+ sterowanie przekaźnikami)
przejściówka rs485 na czipie ch43...
ruter wdr3600 - z BB.

sterowanie ma się odbywać przy pomocy polecenia:
echo "S0110\r" > /dev/ttyUSB0
S-znak kontrolny
01 - numer karty
1 -  przekaźnik nr 1
0;1;2 to wyłącz/włącz/ wyślij status.
Ustawiona jest transmisja 115200 8n1

I teraz tak, na debianie (14.04); openwrt; sysrescuecd nie mogę się "dogadać" przy pomocy polecenia echo,
ale jak włączę minicom, to działa (nie sprawdzałem na BB); wysyłam komendy, odbieram status, reaguje.
Na Centos 7 działa prawidłowo i reaguje na polecenia echo.

Różnica w ustawieniu portu, odczytana przy pomocy stty jest tylko taka , że w centos jest parametr -cmspar, a na debianie/rescuecd/BB nie ma tego parametru, jest niedostępny.

Pytanie:
co ustawia dodatkowo minicom, że się dogaduje ze sterownikiem.
Jak to można obejść,  by dało się w łatwy sposób kontrolować sterownik np przez www/bash itp.

2

Odp: WDR3600 i rs485

Poczytaj o przełączniku -e w echo: http://ss64.com/bash/echo.html

3

Odp: WDR3600 i rs485

przepraszam, mój błąd,
tak wygląda prawidłowe polecenie.
echo -ne "S0110\r" > /dev/ttyUSB0

niestety, kombinowałem z samym e lub  n,  bez przełączników  i  nie działa.

pozdrawiam

4

Odp: WDR3600 i rs485

cineks napisał/a:

przepraszam, mój błąd,
tak wygląda prawidłowe polecenie.
echo -ne "S0110\r" > /dev/ttyUSB0

niestety, kombinowałem z samym e lub  n,  bez przełączników  i  nie działa.

pozdrawiam

A czego konkretnie oczekuje urządzenie na końcu?
Sprawdzałeś z jaką prędkością pracuje ta konsola, domyślnie chyba jest 9600.

5

Odp: WDR3600 i rs485

Sterownik oczekuje 5 znaków ASCII
prędkość w sterowniku ustawiona na 115200 i
i port w ruterze też. Sprawdzałem przez polecenie stty -F ... -a .
Mam zrobiony podgląd co sterownik dostaje po RS, ale
po wysłaniu polecenia z rutera (debiana) nie na nic, nawet śmieci nie ma, cisza.
Czyli jakby port nie wysyłał. Jak zamknę minicoma bez resetu a drugiej konsoli dam tail -f /dev/ttyUSB0
to wtedy polecenie echo -ne ..... działa.
pozdrawiam

6

Odp: WDR3600 i rs485

Wyświetl sobie przez stty parametry interfejsu przed i po uruchomieniu minicoma, zobaczysz co jest ustawione (lub nie).

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

7

Odp: WDR3600 i rs485

Już tak robiłem, ale spróbuje jeszcze raz,
może coś pominąłem.

8

Odp: WDR3600 i rs485

A czy ten sterownik nie potrzebuje czasem pracy w trybie kontroli przepływu (handshake, dodatkowe sygnały CTS/RTS)?

9

Odp: WDR3600 i rs485

kod do obsługi rs to
'----Konfiguracja RS-485"
Config Print0 = Portd.3 , Mode = Set                                                                                    'Wyjście 3 Portu D jako sterowanie kierunkiem transmisji
Config Portd.3 = Output
.
.
.
'*** obsluga RS485 ***
Przerwanie_od_rxd:
Inputbin Dana
Bufor(a) = Dana
Incr A
If A = 6 Then
   If Bufor(1) = 83 Then
      Karta = Bufor(2) - 48
      Karta = Karta * 10
      Karta = Karta + Bufor(3)
      Karta = Karta - 48
      Urzadzenie = Bufor(4) - 48
      Stan = Bufor(5) - 48
      If Karta = Adres Then
         N = Urzadzenie - 1
         Select Case Urzadzenie
            Case 1 To 8
               Select Case Stan
                  Case 0 To 1
                     Outputs.n = Stan
                  Case 2
                     If Outputs.n = 0 Then Print "off" Else Print "on"
               End Select
            Case 9
               Select Case Stan
                  Case 0
                     Piec_a_m = 2
                  Case 1
                     Piec_a_m = 1
                     'Piec_flaga = Stan
                  Case 2
                     If Piec = 0 Then Print "off" Else Print "on"
                  Case 3
                     Piec_a_m = 0
               End Select
         End Select
         A = 1
      Else
         A = 5
         For B = 1 To 4
            C = B
            Incr C
            Bufor(b) = Bufor(c)
         Next
      End If
   Else
      A = 5
      For B = 1 To 4
         C = B
         Incr C
         Bufor(b) = Bufor(c)
      Next
   End If
End If

Return

tak wygląda kod w bascomie odpowiedzialny za RS.
w Centos crtscts jest wyłączone, z minusikiem

10

Odp: WDR3600 i rs485

Sprawdziłem, co wysyła terminal,
co bym nie wpisywał to śle
<0><0><0>  itk 23 x <0>.
Ustawienie urządzenia za pomocą stty gdy minicom działą nie pomaga.
Oczywiści minicom wysyła poprawne dane.

ma ktoś jakiś pomysł co z tym fantem zrobić?

11 (edytowany przez cineks 2016-06-21 20:07:56)

Odp: WDR3600 i rs485

Widzę, że to ciężki problem.
Czy ma ktoś pakiet pyserial do CC by Cezary?
Albo moduł serial dla pythona?

edyta
dobra znalazłem  python-pyserial

12 (edytowany przez cineks 2016-06-21 20:29:25)

Odp: WDR3600 i rs485

znalazłem skrypt w sieci do obsługi serial portu i działa,
tylko nie tak jakbym chciał.
A działa to tak:
root@OpenWrt:/home# python serial_connection.py
Enter your commands below.
Insert "exit" to leave the application.
>> S0211
0
>> S0212
3
answer: n

>> exit

programik działa cały czas dopóki nie wpiszę exit

a ja chciałbym by działał tak:
python serial_connection.py S0211 i enter

i na konsoli wypisze co otrzymał z drugiej strony.

skrypt wygląda tak:

'''
Created on Sep 11, 2012

@author: art3

got this from:
http://www.varesano.net/blog/fabio/serial%20rs232%20connections%20python
'''

import time
import serial


# configure the serial connections (the parameters differs on the device you are connecting to)
ser = serial.Serial(
    port='/dev/ttyUSB0',
    baudrate=9600,
    parity=serial.PARITY_NONE,
    stopbits=serial.STOPBITS_ONE,
    bytesize=serial.EIGHTBITS
)

#ser.close()
#print(ser.isOpen())

#ser.open()
#print(ser.isOpen())

print 'Enter your commands below.\r\nInsert "exit" to leave the application.'

input=1
while 1 :
    # get keyboard input
    input = raw_input(">> ")
        # Python 3 users
        # input = input(">> ")
    if input == 'exit':
        ser.close()
        exit()
    else:
        # send the character to the device
        # (note that I happend a \r\n carriage return and line feed to the characters - this is requested by my device)
        #ser.write(input + '\r\n')
        ser.write(input + '\r')
        out = ''
        # let's wait one second before reading output (let's give device time to answer)
        time.sleep(1)
        print (ser.inWaiting())
        while ser.inWaiting() > 0:
            
            out += ser.read(1)
        if out != '':
            print "answer: " + out

znalazłem tutaj skrypt
Pomożecie przerobić skrypt?

13

Odp: WDR3600 i rs485

while 1 :

to pętla: http://www.tutorialspoint.com/python/py … e_loop.htm

Możesz to usunąć i będzie jednorazowo. Tak samo jak argument możesz przekazać z linii poleceń: http://www.diveintopython.net/scripts_a … ments.html

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

14

Odp: WDR3600 i rs485

za komentowałem tak
#while 1 :
    # get keyboard input
    input = raw_input(">> ")
        # Python 3 users
        # input = input(">> ")
#    if input == 'exit':
#        ser.close()
#        exit()
#    else:

ale nie wiem jak połączyć to input = raw_input(">> ") z sys.argv

nie będę ukrywał, że to trochę trudne dla mnie

15

Odp: WDR3600 i rs485

Sprawdź:

'''
Created on Sep 11, 2012

@author: art3

got this from:
http://www.varesano.net/blog/fabio/serial%20rs232%20connections%20python
'''

import time
import serial
import sys

# configure the serial connections (the parameters differs on the device you are connecting to)
ser = serial.Serial(
    port='/dev/ttyUSB0',
    baudrate=9600,
    parity=serial.PARITY_NONE,
    stopbits=serial.STOPBITS_ONE,
    bytesize=serial.EIGHTBITS
)

#ser.close()
#print(ser.isOpen())

#ser.open()
#print(ser.isOpen())

print 'Enter your commands below.\r\nInsert "exit" to leave the application.'

#input=1
    # get keyboard input
input = str(sys.argv)
        # Python 3 users
        # input = input(">> ")
if input == 'exit':
    ser.close()
    exit()
else:
        # send the character to the device
        # (note that I happend a \r\n carriage return and line feed to the characters - this is requested by my device)
        #ser.write(input + '\r\n')
    ser.write(input + '\r')
    out = ''
        # let's wait one second before reading output (let's give device time to answer)
    time.sleep(1)
    print (ser.inWaiting())
    while ser.inWaiting() > 0:
            
        out += ser.read(1)
    if out != '':
        print "answer: " + out

Wcięcia mają znaczenie!

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

16 (edytowany przez cineks 2016-06-21 21:26:37)

Odp: WDR3600 i rs485

Dzieki za szybką odpowiedź
Twoja modyfikacja prawie działa

root@OpenWrt:/home# python 1.py S0212

Enter your commands below.
Insert "exit" to leave the application.
4
answer: ▒▒C▒

działa tylko z odpowiedzią jest coś nie tak

powinno wyglądać tak
answer: ff

17

Odp: WDR3600 i rs485

A porównaj moje z tym co podałeś, output był nie ruszany.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

18 (edytowany przez cineks 2016-06-21 21:44:12)

Odp: WDR3600 i rs485

Widzę, że output nie ruszany,
ale ten argument nie jest interpretowany jako zwykły tekst,
na podglądzie ramki dostaje śmieci, ale sama ramka interpretowana jest poprawnie.

openwrt i centos7 wyświetlają  w odpowiedzi śmieć

19 (edytowany przez cineks 2016-06-21 22:12:16)

Odp: WDR3600 i rs485

Wysyłam tekst w ASCII i dostaje w ASCII
Niestety, ważna dla mnie jest odpowiedź , odpowiedź taka, którą da się obrobić w bashu.

20

Odp: WDR3600 i rs485

Ha!

Zmień input = str(sys.argv) na input = str(sys.argv[1]) smile

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

21

Odp: WDR3600 i rs485

jesteś genialny,
wielkie dzięki, działa.