-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcomunicacio.py
executable file
·142 lines (112 loc) · 3.61 KB
/
comunicacio.py
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
# -*- encoding: utf-8 -*-
import serial
import crc16
"""
Mòdul comunicació
=================
S'encarrega de la gestió de mes baix nivell del protocol de comunicació.
"""
# Comprovacions ------------------------------------------------------
def check_start_end(frame):
"""
Verifica que la trama contingui la inicialització i finalització
de trama definides al protocol.
Retorna True si la trama conté la inicialització i finalització
correcte i False en cas contrari.
:param str frame: Cadena de caràcters que forma una trama
:rtype: bool
"""
frame_init = frame.find(">*>")
frame_end = frame.find("<#<")
if frame_init != -1 and frame_end != -1:
return True
else:
return False
def check_len(frame):
"""
Verifica que el camp de llargada de paquet que conté la trama
correspongui amb la llargada real del paquet.
Retorna True si la llargada del paquet coincideix amb el valor
del camp llargada i False en cas contrari.
:param str frame: Cadena de caràcters corresponent a una trama
:rtype: bool
"""
frame_len_data = ord(frame[3])+ord(frame[4])
frame_data = frame[6:-5]
if frame_len_data == len(frame_data):
return True
else:
return False
def check_frame(frame):
"""
Verifica que la llargada del paquet de la trama sigui correcte i
que el format de la trama sigui l'adequat.
Retorna True si es compleix que la llargada de la trama és
correcte i alhora el frmat de la trama també ho és.
En cas de que alguna de les dues comprovacions sigui errònia
retorna False.
:param str frame: Cadena de caràcters corresponent a una trama
:rtype: bool
"""
crc = ord(frame[-5])+ord(frame[-4])
return check_start_end(frame) and check_len(frame) and crc16.check_crc16(frame, crc)
# Frame API Functions ------------------------------------------------
def init():
"""
Inicialitza la comunicació. Retorna True si s'ha pogut inicialitzar
la comunicació i False en cas contrari.
:rtype: bool
"""
global ser
try:
ser = serial.Serial('/dev/ttyUSB0', 57600, timeout=0.5)
except:
return False
else:
return True
def close():
"""
Tenca la comunicació.
"""
global ser
ser.close()
# New -----------------------------------------------------
def tx_paquet(tx_paquet):
"""
Permet la funcionalitat d'enviament d'un paquet.
Afegeix els camps necessaris per convertir el paquet en
trama i envia la trama.
:param str tx_paquet:
"""
global ser
frame = ">*>{tx_paquet}<#<".format(tx_paquet=tx_paquet)
ser.write(frame)
def rx_paquet():
"""
Permet la funcionalitat de recepció d'un paquet o una
confirmació.
Espera a llegir una trama o confirmació i verifica que
aquesta no sigui corrupte.
Si la trama és vàlida extreu el paquet que conté. Pot
retornar un paquet, un OK si és una confirmació o un str
buit si la trama és corrupte.
:rtype: str
"""
global ser
frame = ""
while True:
caracter = ser.read()
frame += caracter
if caracter == '':
return ''
elif frame[-3:] == "<#<":
if check_frame(frame):
frame_init = frame.find('>*>')
frame_end = frame.find('<#<')
# Te en compte frame_init(3B) + frame_len_data(2B) = (5B) i frame_crc(2B)
rx_paquet = frame[frame_init+5:frame_end-2]
return rx_paquet
else:
return ''
elif frame[-5:] == ">a\x17a<":
return 'OK'