Added preamble to frames

This commit is contained in:
Sebastian 2015-06-28 14:05:05 +02:00
parent 46793e0468
commit 77bd02f0ed
4 changed files with 91 additions and 14 deletions

View File

@ -0,0 +1,34 @@
#!/usr/bin/env python2
import random
import time
from sss7bus import SSS7Bus
bus = SSS7Bus('/dev/ttyUSB0')
framecount = 0
lost = 0
while True:
bus.send_message("Hello World!")
more = True
while more:
msg = bus.read_message()
print msg
print framecount
frame = int(msg.split(':')[1])
delta = frame - framecount
if delta > 1 and framecount <> 0:
lost += delta
framecount = frame
if frame % 100 == 0 and frame > 0:
print "Lost Frames: %d %d %f" % (frame, lost, 100.0 * lost / frame)
more = bus.has_message()
time.sleep((500.0 + random.randint(0,500)) / 1000.0)

View File

@ -0,0 +1,20 @@
#!/usr/bin/env python2
import random
import time
from sss7bus import SSS7Bus
bus = SSS7Bus('/dev/ttyUSB1')
counter = 0
while True:
bus.send_message("Timestamp:%d:%d" % (counter, time.time()))
while bus.has_message():
bus.read_message()
counter += 1
time.sleep((500.0 + random.randint(0,500)) / 1000.0)

View File

@ -0,0 +1,3 @@
crcmod==1.7
pyserial==2.7
wheel==0.24.0

View File

@ -7,13 +7,15 @@ from crcmod.predefined import PredefinedCrc
# Timings in bit times
TIMEOUT = 24
CLEARCHANNEL = 48
TIMEOUT = 48
CLEARCHANNEL = 2 * TIMEOUT
class SSS7Bus(object):
def __init__(self, port, baudrate=9600):
random.seed()
self._bit_time = 1.0 / baudrate
self._serial = serial.Serial(port, baudrate, timeout=self._bit_time * TIMEOUT)
@ -35,15 +37,15 @@ class SSS7Bus(object):
self._flush_input_buffer()
self._serial.timeout = self._bit_time * CLEARCHANNEL
self._debug("Checking if bus is idle for %f seconds" % (self._bit_time * CLEARCHANNEL))
self._debug("Checking if bus is idle for %f seconds" % (self._serial.timeout))
length_byte = self._serial.read(1)
if len(length_byte) == 0:
first_byte = self._serial.read(1)
if len(first_byte) == 0:
self._debug("Bus seems idle")
return True
self._debug("Bus is not idle, reading frames")
self._read_frame_rest(length_byte)
self._read_frame_rest(first_byte)
return False
@ -52,15 +54,34 @@ class SSS7Bus(object):
self._debug("Trying to read a frame from the bus")
self._serial.timeout = timeout=self._bit_time * TIMEOUT
length_byte = self._serial.read(1)
if len(length_byte) == 0:
self._debug("Timeout reading frame length")
first_byte = self._serial.read(1)
if len(first_byte) == 0:
self._debug("Timeout reading first byte")
return False
return self._read_frame_rest(length_byte)
return self._read_frame_rest(first_byte)
def _read_frame_rest(self, length_byte):
def _read_frame_rest(self, first_byte):
if ord(first_byte) <> 0xAA:
self._debug("Wrong first byte: %s" % hex(ord(first_byte)))
return False
second_byte = self._serial.read(1)
if len(second_byte) == 0:
self._debug("Timeout reading second byte")
return False
if ord(second_byte) <> 0xFE:
self._debug("Wrong second byte")
return False
length_byte = self._serial.read(1)
if len(length_byte) == 0:
self._debug("Timeout reading length byte")
return False
length = ord(length_byte) - 1 # we read the size length byte already
self._serial.timeout = timeout=self._bit_time * TIMEOUT
@ -103,7 +124,6 @@ class SSS7Bus(object):
for byte in frame:
result = self._send_byte(byte)
if not result:
self._serial.flushInput()
self._debug("Sending frame failed with collision")
return False
@ -119,12 +139,12 @@ class SSS7Bus(object):
crc16.update(msg)
msg_crc = crc16.digest()
frame = chr(len(msg) + 3) + msg + msg_crc
frame = chr(0xAA) + chr(0xFE) + chr(len(msg) + 3) + msg + msg_crc
result = self._send_frame(frame)
while not result:
backoff = 8 * self._bit_time * (priority + random.randint(1,5))
backoff = TIMEOUT * self._bit_time * (4 + priority + random.randint(1,5))
self._debug("Collision occured backing off %f" % backoff)
time.sleep(backoff)
result = self._send_frame(frame)