Skip to content
This repository was archived by the owner on Dec 22, 2022. It is now read-only.

Commit 49f7b86

Browse files
committed
Thise fixes #21 in python by sending bytes in batches rather than one by one to address windows7 slow api problem
1 parent 2f95b42 commit 49f7b86

File tree

2 files changed

+72
-96
lines changed

2 files changed

+72
-96
lines changed

application/fpga/python/DobotDriver.py

Lines changed: 38 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
from serial import SerialException
2020
import math
2121
import sys
22+
from serial_aggregator import serial_aggregator
2223

2324
# Workaround to support Python 2/3
2425
if sys.version_info > (3,):
@@ -43,7 +44,6 @@
4344
halfPi = math.pi / 2.0
4445

4546
stopSeq = 0x0242f000
46-
# stopSeq = 0x40420f00
4747

4848
class DobotDriver:
4949
def __init__(self, comport, rate=115200):
@@ -55,7 +55,15 @@ def __init__(self, comport, rate=115200):
5555

5656
def Open(self, timeout=0.025):
5757
try:
58-
self._port = serial.Serial(self._comport, baudrate=self._rate, timeout=timeout, interCharTimeout=0.1)
58+
self._port = serial_aggregator(serial.Serial(self._comport, baudrate=self._rate, timeout=timeout, interCharTimeout=0.1))
59+
# self._port = serial.Serial(self._comport, baudrate=self._rate, timeout=timeout, interCharTimeout=0.1)
60+
61+
# s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
62+
# s.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
63+
# s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 2)
64+
# s.connect(("localhost", 5555))
65+
# self._port = serial2socket(s)
66+
5967
# Have to wait for Arduino initialization to finish, or else it doesn't boot.
6068
time.sleep(2)
6169
except SerialException as e:
@@ -121,109 +129,44 @@ def _readslong(self):
121129
return (0,0)
122130

123131
def _read1(self, cmd):
124-
trys = _max_trys
125-
while trys:
126-
self._port.flushInput()
127-
self._sendcommand(cmd)
128-
self._writechecksum()
129-
val1 = self._readbyte()
130-
if val1[0]:
131-
crc = self._readchecksumword()
132-
if crc[0]:
133-
if self._crc&0xFFFF!=crc[1]&0xFFFF:
134-
# raise Exception('crc differs', self._crc&0xFFF, crc[1]&0xFFFF)
135-
return (0,0)
136-
return (1,val1[1])
137-
trys -= 1
138-
# raise Exception("couldn't get response in time for", _max_trys, 'times')
139-
return (0,0)
132+
return self._read(cmd, [self._readbyte])
140133

141134
def _read22(self, cmd):
142-
trys = _max_trys
143-
while trys:
144-
self._port.flushInput()
145-
self._sendcommand(cmd)
146-
self._writechecksum()
147-
val1 = self._readword()
148-
if val1[0]:
149-
val2 = self._readword()
150-
if val2[0]:
151-
crc = self._readchecksumword()
152-
if crc[0]:
153-
if self._crc&0xFFFF!=crc[1]&0xFFFF:
154-
# raise Exception('crc differs', self._crc&0xFFF, crc[1]&0xFFFF)
155-
return (0,0,0)
156-
return (1,val1[1],val2[1])
157-
trys -= 1
158-
# raise Exception("couldn't get response in time for", _max_trys, 'times')
159-
return (0,0,0)
160-
161-
def _read4(self, cmd):
162-
trys = _max_trys
163-
while trys:
164-
self._port.flushInput()
165-
self._sendcommand(cmd)
166-
val1 = self._readlong()
167-
if val1[0]:
168-
crc = self._readchecksumword()
169-
if crc[0]:
170-
if self._crc&0xFFFF!=crc[1]&0xFFFF:
171-
return (0,0)
172-
return (1,val1[1])
173-
trys -= 1
174-
return (0,0)
135+
return self._read(cmd, [self._readword,
136+
self._readword])
175137

176138
def _read4(self, cmd):
177-
trys = _max_trys
178-
while trys:
179-
self._port.flushInput()
180-
self._sendcommand(cmd)
181-
val1 = self._readlong()
182-
if val1[0]:
183-
crc = self._readchecksumword()
184-
if crc[0]:
185-
if self._crc&0xFFFF!=crc[1]&0xFFFF:
186-
return (0,0)
187-
return (1,val1[1])
188-
trys -= 1
189-
return (0,0)
139+
return self._read(cmd, [self._readlong])
190140

191-
def _read4_1(self, cmd):
192-
trys = _max_trys
193-
while trys:
194-
self._port.flushInput()
195-
self._sendcommand(cmd)
196-
val1 = self._readslong()
197-
if val1[0]:
198-
val2 = self._readbyte()
199-
if val2[0]:
200-
crc = self._readchecksumword()
201-
if crc[0]:
202-
if self._crc&0xFFFF!=crc[1]&0xFFFF:
203-
return (0,0)
204-
return (1,val1[1],val2[1])
205-
trys -= 1
206-
return (0,0)
141+
def _read41(self, cmd):
142+
return self._read(cmd, [self._readslong,
143+
self._readbyte])
207144

208145
def _reads444(self, cmd):
146+
return self._read(cmd, [self._readslong,
147+
self._readslong,
148+
self._readslong])
149+
150+
def _read(self, cmd, read_commands=list()):
209151
trys = _max_trys
210152
while trys:
211-
self._port.flushInput()
212153
self._sendcommand(cmd)
213154
self._writechecksum()
214-
val1 = self._readslong()
215-
if val1[0]:
216-
val2 = self._readslong()
217-
if val2[0]:
218-
val3 = self._readslong()
219-
if val3[0]:
220-
crc = self._readchecksumword()
221-
if crc[0]:
222-
if self._crc&0xFFFF!=crc[1]&0xFFFF:
223-
return (0,0,0,0)
224-
return (1,val1[1],val2[1],val3[1])
155+
self._port.send()
156+
157+
ret = [1]
158+
for c in read_commands:
159+
val = c()
160+
if not val[0]:
161+
return [0] * (len(read_commands) + 1)
162+
ret.append(val[1])
163+
164+
crc = self._readchecksumword()
165+
if crc[0]:
166+
if self._crc&0xFFFF == crc[1]&0xFFFF:
167+
return tuple(ret)
225168
trys -= 1
226-
return (0,0,0,0)
169+
return [0] * (len(read_commands) + 1)
227170

228171
def _writebyte(self, val):
229172
self._crc_update(val&0xFF)
@@ -242,7 +185,6 @@ def _writelong(self, val):
242185
def _writechecksum(self):
243186
self._port.write(bytearray([(self._crc>>8)&0xFF]))
244187
self._port.write(bytearray([self._crc&0xFF]))
245-
self._port.flush()
246188

247189
def _sendcommand(self, command):
248190
self._crc_clear()
@@ -257,6 +199,7 @@ def _write(self, cmd, write_commands=list()):
257199
c[0](c[1])
258200

259201
self._writechecksum()
202+
self._port.send()
260203
crc = self._readchecksumword()
261204
if crc[0]:
262205
if self._crc&0xFFFF == crc[1]&0xFFFF:
@@ -293,13 +236,13 @@ def _write444(self, cmd, val1, val2, val3):
293236
def _write_read(self, cmd, write_commands):
294237
tries = _max_trys
295238
while tries:
296-
self._port.flushInput()
297239
self._sendcommand(cmd)
298240

299241
for c in write_commands:
300242
c[0](c[1])
301243

302244
self._writechecksum()
245+
self._port.send()
303246
ret = self._readbyte()
304247
if ret[0]:
305248
crc = self._readchecksumword()
@@ -582,7 +525,6 @@ def reset(self):
582525
# self._lock.acquire()
583526
i = 0
584527
while i < 5:
585-
self._port.flushInput()
586528
self._port.read(1)
587529
i += 1
588530
self._crc_clear()
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
"""
2+
open-dobot serial aggregator.
3+
4+
This is a workaround to send data in bursts on systems that have slow API
5+
used by pyserial (e.g. Windows).
6+
7+
Author: maxosprojects (May 17 2016)
8+
Additional Authors: <put your name here>
9+
10+
Version: 1.1.0
11+
12+
License: MIT
13+
"""
14+
15+
class serial_aggregator:
16+
def __init__(self, ser):
17+
self._ser = ser
18+
self._buf = bytearray()
19+
20+
def write(self, data):
21+
self._buf.extend(data)
22+
23+
def read(self, size):
24+
return self._ser.read(size)
25+
26+
def flushInput(self):
27+
pass
28+
29+
def flush(self):
30+
pass
31+
32+
def send(self):
33+
self._ser.write(self._buf)
34+
self._buf = bytearray()

0 commit comments

Comments
 (0)