Serial interface and echo example

This commit is contained in:
Mark Qvist 2018-03-20 16:57:26 +01:00
parent d4be407821
commit e66622bd69
3 changed files with 62 additions and 38 deletions

View file

@ -4,11 +4,12 @@ from time import sleep
import sys
import serial
import threading
import time
import FPE
class SerialInterface(Interface):
MAX_CHUNK = 32768
TIMEOUT_SECONDS = 0.15
TIMEOUT_SECONDS = 1.0
owner = None
port = None
@ -26,6 +27,8 @@ class SerialInterface(Interface):
self.databits = databits
self.parity = serial.PARITY_NONE
self.stopbits = stopbits
self.timeout = 100
self.online = False
if parity.lower() == "e" or parity.lower() == "even":
self.parity = serial.PARITY_EVEN
@ -41,9 +44,10 @@ class SerialInterface(Interface):
bytesize = self.databits,
parity = self.parity,
stopbits = self.stopbits,
timeout = SerialInterface.TIMEOUT_SECONDS,
xonxoff = False,
rtscts = False,
timeout = 0,
inter_byte_timeout = None,
write_timeout = None,
dsrdtr = False,
)
@ -52,10 +56,11 @@ class SerialInterface(Interface):
raise e
if self.serial.is_open:
sleep(0.5)
thread = threading.Thread(target=self.readLoop)
thread.setDaemon(True)
thread.start()
sleep(0.5)
self.online = True
FPE.log("Serial port "+self.port+" is now open")
else:
raise IOError("Could not open serial port")
@ -66,18 +71,29 @@ class SerialInterface(Interface):
def processOutgoing(self,data):
written = self.serial.write(data)
if written != len(data):
raise IOError("Serial interface only wrote "+str(written)+" bytes of "+str(len(data)))
if self.online:
written = self.serial.write(data)
if written != len(data):
raise IOError("Serial interface only wrote "+str(written)+" bytes of "+str(len(data)))
def readLoop(self):
#pass
while self.serial.is_open:
data = self.serial.read(size=self.owner.__class__.MTU)
if not data == "":
self.processIncoming(data)
try:
data_buffer = ""
last_read_ms = int(time.time()*1000)
while self.serial.is_open:
if self.serial.in_waiting:
data = self.serial.read(size=self.serial.in_waiting)
data_buffer += data
last_read_ms = int(time.time()*1000)
else:
time_since_last = int(time.time()*1000) - last_read_ms
if len(data_buffer) > 0 and time_since_last > self.timeout:
self.processIncoming(data_buffer)
data_buffer = ""
sleep(0.08)
except Exception as e:
self.online = False
FPE.log("A serial port error occurred, the contained exception was: "+str(e), FPE.LOG_ERROR)
FPE.log("The interface "+str(self.name)+" is now offline. Restart FlexPE to attempt reconnection.", FPE.LOG_ERROR)