Skip to content

Commit c8e9145

Browse files
committed
Add a test for serial port
1 parent 84c1cff commit c8e9145

File tree

5 files changed

+78
-16
lines changed

5 files changed

+78
-16
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,4 @@ core
99
**/*.a
1010
/jlink-fw-sw
1111
.idea/
12+
**/venv

Makefile

+12
Original file line numberDiff line numberDiff line change
@@ -89,3 +89,15 @@ sizes-example:
8989
cargo size --example $(EXAMPLE) --release
9090

9191

92+
venv:
93+
python3 -m venv venv
94+
venv/bin/pip install -U pip
95+
96+
# re-run if dev or runtime dependencies change,
97+
# or when adding new scripts
98+
update-venv: venv
99+
venv/bin/pip install -U pip
100+
venv/bin/pip install -U -r dev-requirements.txt
101+
102+
test-serial:
103+
venv/bin/python test_serial.py

dev-requirements.txt

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
pyserial

src/usbfs/bus/endpoint.rs

+1
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ impl Endpoint {
116116
let i = self.index as usize;
117117
if i > 0 {
118118
assert!(epl.eps[i].ep_in[0].read().a().is_not_active());
119+
// while epl.eps[i].ep_in[0].read().a().is_active() {}
119120
}
120121

121122
if i == 0 {

test_serial.py

+63-16
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,70 @@
1-
import serial
21
import secrets
2+
import sys
3+
4+
import serial
5+
6+
ser = serial.Serial(
7+
"/dev/ttyACM1",
8+
115_200,
9+
# 4_000_000,
10+
timeout=0,
11+
write_timeout=0,
12+
)
13+
print("connected")
14+
15+
w = 0
16+
while ser.read():
17+
w += 1
18+
pass
19+
print(f"cleared {w} waiting chars")
320

4-
ser = serial.Serial("/dev/ttyACM1")
521

6-
max_length = 4096
7-
repeats = 100
8-
smallest, largest = max_length, 0
22+
def loop(sent_msg, verbose=False):
23+
length = len(sent_msg)
24+
at = 0
25+
recv_msg = bytes()
26+
while (at < length) or (len(recv_msg) < length):
27+
sent = ser.write(sent_msg[at:])
28+
at += sent
29+
if verbose and sent > 0:
30+
print(f"...wrote {sent}")
931

10-
for _ in range(repeats):
11-
length = secrets.randbelow(max_length + 1)
12-
if length < smallest:
13-
smallest = length
14-
if length > largest:
15-
largest = length
16-
sent_msg = bytes([secrets.randbelow(256) for _ in range(length)])
17-
ser.write(sent_msg)
18-
recv_msg = ser.read(length)
32+
recv = ser.read(at - len(recv_msg))
33+
got = len(recv)
34+
if verbose and got > 0:
35+
print(f"...read {got}")
36+
recv_msg += recv
1937

2038
assert recv_msg == sent_msg
39+
if verbose:
40+
print(f"...success!")
41+
42+
43+
try:
44+
print(f"small cases")
45+
for i in range(32):
46+
# print(f"small case {i}")
47+
loop(bytes(range(i))) # , verbose=True)
48+
49+
max_length = 65536
50+
# max_length = 6144
51+
repeats = 10
52+
smallest, largest = max_length, 0
53+
54+
print(f"large cases")
55+
for i in range(repeats):
56+
length = secrets.randbelow(max_length + 1)
57+
msg = bytes([secrets.randbelow(256) for _ in range(length)])
58+
# print(f"iteration {i}: {length}B")
59+
if length < smallest:
60+
smallest = length
61+
if length > largest:
62+
largest = length
63+
loop(msg)
64+
65+
print(f"Successfully looped {repeats} random msgs of length <= {max_length}")
66+
print(f"smallest: {smallest}, largest: {largest}")
2167

22-
print(f"Successfully looped {repeats} random msgs of length <= {max_length}")
23-
print(f"smallest: {smallest}, largest: {largest}")
68+
except AssertionError as e:
69+
print(f"Error: {e}")
70+
sys.exit(1)

0 commit comments

Comments
 (0)