serial_com.py
1.71 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# -*- coding: utf-8 -*-
"""
author Benoit Dubois
licence GPL v3+
brief Basic protocol communication with stm32 discovery board.
"""
import pyb
import uselect
import ustruct
class SerialCom(object):
def __init__(self, id_=0):
self.vcom = pyb.USB_VCP(id_)
self.poller = uselect.poll()
self.poller.register(self.vcom, uselect.POLLIN)
def write_message(self, msg):
header = ustruct.pack('<L', len(msg))
self.vcom.write(header + msg.encode('utf-8'))
def read_message(self):
header = self.vcom.read(4)
if header is None:
print("Read error: no data readed")
return ''
if len(header) == 4:
msg_len = ustruct.unpack('<L', header)[0]
try:
data = self.vcom.read(msg_len).decode('utf-8')
except:
print("Serial read error")
return
# Check message validity
if data is None:
print("Read error: data received but no message to read")
return
if len(data) != msg_len:
print("Read error: bad message length")
return data
def write_message_simple(self, msg):
self.vcom.write(msg.encode('utf-8'))
def read_message_simple(self):
data = self.vcom.readline().decode('utf-8')
if data is None:
print("Read error: data received but no message to read")
return
return data
def test():
scom = SerialCom()
while True:
scom.poller.poll(250)
if scom.vcom.any():
msg = scom.read_message_simple()
if msg is not None:
scom.write_simple_message("Read: " + msg)
#test()