From f6f0fdac1ee10d6ee7a79da56370c18be1a6a1c2 Mon Sep 17 00:00:00 2001 From: Wolfgang Hottgenroth Date: Mon, 17 Jun 2019 16:10:04 +0100 Subject: [PATCH] works, but license issues due to bcm2835 lib --- pyserialext/Makefile | 13 ++++++++ pyserialext/RS485Ext.py | 19 +++++++++++ .../__pycache__/RS485Ext.cpython-35.pyc | Bin 0 -> 964 bytes pyserialext/writec.c | 31 ++++++++++++++++++ pyserialext/writec.o | Bin 0 -> 1404 bytes pyserialext/writec.so | Bin 0 -> 73572 bytes snippets/test1.py | 3 +- snippets/test5.py | 18 ++++++++++ 8 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 pyserialext/Makefile create mode 100644 pyserialext/RS485Ext.py create mode 100644 pyserialext/__pycache__/RS485Ext.cpython-35.pyc create mode 100644 pyserialext/writec.c create mode 100644 pyserialext/writec.o create mode 100755 pyserialext/writec.so create mode 100644 snippets/test5.py diff --git a/pyserialext/Makefile b/pyserialext/Makefile new file mode 100644 index 0000000..e3fc0f3 --- /dev/null +++ b/pyserialext/Makefile @@ -0,0 +1,13 @@ +CFLAGS=-I/opt/bcm2835/include + +writec.so: writec.o /opt/bcm2835/lib/libbcm2835.a + $(LD) -shared -o $@ $^ + +writec.o: writec.c + +.c.o: + $(CC) $(CFLAGS) -c $< + +.PHONY: clean +clean: + -rm -f *.so *.o diff --git a/pyserialext/RS485Ext.py b/pyserialext/RS485Ext.py new file mode 100644 index 0000000..c20aed7 --- /dev/null +++ b/pyserialext/RS485Ext.py @@ -0,0 +1,19 @@ +import serial.rs485 +import serial.serialutil +import ctypes + + +class RS485Ext(serial.rs485.RS485): + def __init__(self, *args, **kwargs): + super(RS485Ext, self).__init__(*args, **kwargs) + self.writec = ctypes.cdll.LoadLibrary('writec.so') + fd = self.fileno() + r = self.writec.set_rs485_mode(fd) + + def write(self, b): + d = serial.serialutil.to_bytes(b) + l = len(d) + fd = self.fileno() + r = self.writec.writec(fd, d, l) + return r + diff --git a/pyserialext/__pycache__/RS485Ext.cpython-35.pyc b/pyserialext/__pycache__/RS485Ext.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..170765eb6ceb1e56ab64014a29a07ebd4ffd6ed0 GIT binary patch literal 964 zcmYjPO^?$s5FN)(ns(E|u7nnTLJqVSkT@WO1Phl{h3G93veLwbg!BVD)o!cyR0KEv z2I4RI%83(qPRuy{Sj(Qg*yEWuZ+zM9cCLQ5KKx|>zv0dhh+pC|uhHZ<8B_oXJ7Dh) z=8$lBn|qLR_=>I^6oXPg>BA1s0=hhk#UG3W!;I`<@I5en1nLk!@!&ha1asl^;2Z99 zikb@wp9ne~#l8*SkDfexdUac8$leVfEycWt%e+HV<7BV_*m+QTutDs>4**v4Jwwc~ za~?7vzp@28fGu}8fHH&)Cx@+|%15y`T(@s@QLC(P=5gElX1P#Wdzj0HQWmqKmeK}U zy;>-fh%B$F-Ax z*dRuK6p_Oge|;2@4dcKD4N2Q+zRS9(Y*^3bcvUN7If|o+tR@n1poz0(W6My8N}th5 zM5cE%)O71RdAkTr2Mw?btTAE_*}8YE)49<5k#d$!751wmN&IC+IFj +#include +#include +#include +#include +#include +#include +#include +#include + + +const uint8_t DE_PIN = RPI_V2_GPIO_P1_11; + +int set_rs485_mode(int fd) { + bcm2835_init(); + bcm2835_gpio_fsel(DE_PIN, BCM2835_GPIO_FSEL_OUTP); + bcm2835_gpio_write(DE_PIN, LOW); +} + +ssize_t writec(int fd, char *buf, size_t count) { + bcm2835_gpio_write(DE_PIN, LOW); + ssize_t r = write(fd, buf, count); + uint8_t lsr; + do { + int r = ioctl(fd, TIOCSERGETLSR, &lsr); + } while (!(lsr & TIOCSER_TEMT)); + bcm2835_gpio_write(DE_PIN, HIGH); + + return r; +} + diff --git a/pyserialext/writec.o b/pyserialext/writec.o new file mode 100644 index 0000000000000000000000000000000000000000..133af699a06687e598471df0c5a758e3e6a19773 GIT binary patch literal 1404 zcma)6O-~b16g`hAwNTNPXh2JJV$fg+;}mGEt|WkH5TdAw#ziyJjxv#cWabfZ<(7?! zOBW{gC%ACy-h~VP0wql}u3Wga-aDN)OuNyS+@5>R{dl);-prfTd$)xUP)lG2#|-$O z1(D&!0A_F!Y2eP>kHn|9?bN|WJB4)TPq+IsYqpL=rgfyDb*MOE9HetBaj@RT{+I8n zhfX~vsmD|%-O=@Qhx^3qbUjD0TxSxwU?1LZ%v^74dh4*1`55Um7wOMB!qnQp!=vBb z?&#o5DKpoJ&+zmSkj2{a@=bka%krDHYt{9lv0#{U`O>V{bn~-S$G)+fzuHsvc{6|A zEaZz=GUzxg$Fg0BX>x~)NG4NaM2rrNC(ekoVnUk~=fwG;DRCirDSn>8G15<5OW;>m z>5N)mlzHzVs2mLm7^8iPz!>qbkrv;L`<;j)>}W_1@Dwtk!j)O-KN0d3!f~4K zO2`>FcVU394)7<$xptq7>$e8thT`jwzz*cNW1B6oO8o_&fAOJ_Up^PC++I(rgE)shwr+xKC3jUK5qYBi@$v3f%~#@goNIbT|p zmoS#LHVjKj&$V}@XJMc7dGTkd&~tm7HL|4;1Cf4;EXJ0i4@jfg znkvM3*AyXCd5qC)v7UHbA$RAi|nLY4Oy DzU;*$ literal 0 HcmV?d00001 diff --git a/pyserialext/writec.so b/pyserialext/writec.so new file mode 100755 index 0000000000000000000000000000000000000000..9fb8f8595f31619bb8d708b71c212fe314e9162a GIT binary patch literal 73572 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 z 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 literal 0 HcmV?d00001 diff --git a/snippets/test1.py b/snippets/test1.py index 5d7b74b..e7a1717 100644 --- a/snippets/test1.py +++ b/snippets/test1.py @@ -1,5 +1,6 @@ import serial.rs485 ser=serial.rs485.RS485(port='/dev/ttyAMA0',baudrate=2400) ser.rs485_mode = serial.rs485.RS485Settings(False, True) -ser.write('a test'.encode('utf-8')) +while True: + ser.write('a test'.encode('utf-8')) diff --git a/snippets/test5.py b/snippets/test5.py new file mode 100644 index 0000000..365aa35 --- /dev/null +++ b/snippets/test5.py @@ -0,0 +1,18 @@ +from pymodbus.client.sync import ModbusSerialClient +import serial.rs485 +import RS485Ext + +#ser=serial.rs485.RS485(port='/dev/ttyAMA0',baudrate=1200) +#ser.rs485_mode = serial.rs485.RS485Settings(rts_level_for_tx=False, +# rts_level_for_rx=True, +# delay_before_tx=0.005, +# delay_before_rx=-0.0) +ser=RS485Ext.RS485Ext(port='/dev/ttyAMA0', baudrate=1200) + +client = ModbusSerialClient(method='rtu') +client.socket = ser +client.connect() +result = client.read_holding_registers(address=0x2000, count=2, unit=1) +print(result) +print(result.registers) +client.close()