Thank you very much for the input. Now it works:)

I switched the wires and i played around with the tutorial.

I use now this script:

import serial, fcntl, struct, time

ser = serial.Serial(
    port='/dev/ttyO4',
    baudrate=9600,
    timeout=10,
    parity=serial.PARITY_EVEN,
    stopbits=serial.STOPBITS_ONE,
    bytesize=serial.SEVENBITS
)

# Standard Linux RS485 ioctl:
TIOCSRS485 = 0x542F

# define serial_rs485 struct per Michael Musset's patch that adds gpio RE/DE
# control:
# 
(https://github.com/RobertCNelson/bb-kernel/blob/am33x-v3.8/patches/fixes/0007-omap-RS485-support-by-Michael-Musset.patch#L30)
SER_RS485_ENABLED         = (1 << 0)
SER_RS485_RTS_ON_SEND     = (1 << 1)
SER_RS485_RTS_AFTER_SEND  = (1 << 2)
SER_RS485_RTS_BEFORE_SEND = (1 << 3)
SER_RS485_USE_GPIO        = (1 << 5)

# Enable RS485 mode using a GPIO pin to control RE/DE:
RS485_FLAGS = SER_RS485_ENABLED | SER_RS485_USE_GPIO
# With this configuration the GPIO pin will be high when transmitting and 
low
# when not

# If SER_RS485_RTS_ON_SEND and SER_RS485_RTS_AFTER_SEND flags are included 
the
# RE/DE signal will be inverted, i.e. low while transmitting

# The GPIO pin to use, using the Kernel numbering:
RS485_RTS_GPIO_PIN = 48 # GPIO1_16 -> GPIO(1)_(16) = (1)*32+(16) = 48

# Pack the config into 8 consecutive unsigned 32-bit values:
# (per  struct serial_rs485 in patched serial.h)
serial_rs485 = struct.pack('IIIIIIII',
                           RS485_FLAGS,        # config flags
                           0,                  # delay in us before send
                           0,                  # delay in us after send
                           RS485_RTS_GPIO_PIN, # the pin number used for 
DE/RE
                           0, 0, 0, 0          # padding - space for more 
values
                           )

# Apply the ioctl to the open ttyO4 file descriptor:
fd=ser.fileno()
fcntl.ioctl(fd, TIOCSRS485, serial_rs485)

# Send some bytes:
# GPIO1_16 should be low here
time.sleep(0.2)
# GPIO1_16 should be high while this is being transmitted:
ser.write("/?!\r\n");

count=1
while True:
    line = ser.readline();
    print("Received: " + line)
    count = count + 1

#    for line in ser.readline():
#        print(str(count) + str(': ') + chr(line) )
#        count = count+1

# GPIO1_16 should be low again after transmitting
time.sleep(0.2)
ser.close();

Best regards
Benj




Am Mittwoch, 26. August 2015 22:49:22 UTC+2 schrieb Alexander Hiam:
>
> The BeagleBone's omap-serial driver doesn't support RS-485 DE/RE control 
> with the RTS flow control signal. Instead it has an RS-485 mode using a 
> GPIO pin for DE/RE control, and has a modified serial_rs485 struct from the 
> standard serial driver. You have to use ioctl on the corresponding 
> /dev/ttyOx file to put the serial driver in RS-485 mode and tell it which 
> pin to use, and you also have to take care of muxing the pin to GPIO mode.
>
> So with the jumper in the RTS position that would be the GPIO signal that 
> shares the pin with the UART4 RTS signal, so that's GPIO0_9 on P8.33. Or 
> you can put it to the GPIO1_16 position and use GPIO1_16 instead. (I 
> believe GPIO1_16 
>
> There's a tutorial here: 
> http://inspire.logicsupply.com/2014/09/beaglebone-rs-485-communication.html
>
> Also, I believe RS485B is the inverting output, so you have your +/- 
> swapped.
>
> On Wednesday, August 26, 2015 at 2:41:49 PM UTC-4, benjamin...@gmail.com 
> wrote:
>>
>> Hello,
>>
>> I have a BeagleBone Black with a "Serial Cape" (
>> http://www.logicsupply.com/eu-en/cbb-serial/). This cape supports RS-485 
>> which i'm interested in. Before i had this cape, i used a 
>> RS-485-to-USB-converter.
>>
>>
>> My problem:
>> I try to read some data from an external device. It's very simple: The 
>> request is just "/?!\r\n" and then i get the data.
>>
>> With the RS485-to-USB-Stick i used this serial port configuration (with 
>> ser2net):
>> /dev/ttyUSB0 9600 7DATABITS EVEN 1STOPBIT
>>
>> With the cape i tried this configuration:
>> /dev/ttyO4 9600 7DATABITS EVEN 1STOPBIT
>>
>> Unfortunately this first try didn't work. I didn't get any response. I 
>> also tried this configuration:
>> /dev/ttyO4 9600 7DATABITS EVEN 1STOPBIT RTSCTS
>>
>> I set the jumpers on the cape like this:
>> J8: RS485
>> J7: UART4 RTS
>>
>> The RS485+ wire is connected to the RS485B port, and the RS485- wire is 
>> connected to the RS485A port.
>> (
>> https://docs.google.com/document/d/1sgurQ-7gLyn7g-Kg983NRM0aDkYEqHqy9dmrieX_RUM/edit
>>  
>> page7)
>>
>> To get a better overview i made a photo:
>>
>>
>> <https://lh3.googleusercontent.com/-DGOBBHIo6sM/Vd1xuVsgc_I/AAAAAAAAAEE/JS4oAhPYoOk/s1600/IMG_20150826_091607_mod.jpg>
>>
>>
>> At the bottom of the picture there is the RS485-to-USB converter. It just 
>> has two ports which i used to connect the RS485 wires.
>>
>> I think the board itself should work, because if i execute "cat 
>> /sys/devices/bone_capemgr.*/slots" i can see it.
>>
>> My question:
>> Do i do something wrong? Maybe someone else has used this cape with 
>> RS485? I thought it should be almost as easy as with the USB converter?
>>
>>
>> Thank you for any help
>>
>> Best regards
>> Benj
>>
>>

-- 
For more options, visit http://beagleboard.org/discuss
--- 
You received this message because you are subscribed to the Google Groups 
"BeagleBoard" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to beagleboard+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to