Un Serial Server è un dispositivo che si collega ad una comune LAN
ethernet, e mette a disposizione una o più porte seriali per
comunicare con apparecchiature che dispongono di questo tipo di
connessione. Può funzionare in diversi modi, ad esempio esistono dei
driver che lo fanno vedere al sistema operativo come una comune porta
seriale virtuale (allo stesso modo delle seriali su porta USB). Ma è
contattabile anche in modo "nativo" attraverso i protocolli UDP o TCP.
Il serial server va naturalmente configurato con un indirizzo IP
appartenente alla LAN.
Qui vediamo le immagini relative alla configurazione di un serial
server della Moxa, per la
precisione il modello NPort5110 dotato di una sola RS232.
Connessione UDP
In questo modo di funzionamento, ogni volta che un datagramma UDP viene
inviato all'indirizzo del serial server, i dati contenuti nel pacchetto
vengono ritrasmessi dalla porta seriale. Allo stesso modo ogni volta
che la seriale riceve dei dati dall'esterno, questi vengono
impachettati in un datagramma UDP e inviati sulla LAN all'indirizzo di
destinazione specificato (Destination IP address).
Il parametro "Force transmit" indica che in ogni caso i dati ricevuti
dalla seriale (anche un solo byte) vanno spediti sulla LAN ogni 50
millisecondi senza aspettare oltre. Il valore di "Force transmit" non
deve mai essere cosi' elevato da rischiare di saturare il buffer
interno da 1kbyte.
In pratica
Supponiamo di avere un'apparecchiatura dotata di porta seriale che
alla ricezione di un byte di valore 31 risponda con una stringa di
caratteri codificati in ASCII. Vogliamo ricevere e stampare la stringa.
Supponiamo inoltre che il computer su cui gira il nostro programma si
trovi all'indirizzo 192.168.1.2 e che il serial server si trovi
all'indirizzo 192.168.1.3
# Script Python3
import socket, time
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(("192.168.1.2", 4001))
s.settimeout(1)
s.sendto(bytes([31]), ("192.168.1.3", 4001))
time.sleep(0.01)
try:
print(str(s.recv(1024), "ascii"))
except:
print("ERRORE DI RICEZIONE")
s.close()
Nota: Avendo impostato "Force transmit" a 50 ms, e una velocità
seriale di 9600bps con 11 bit totali per ogni byte, la stringa di
risposta non può essere più lunga di 43 caratteri, altrimenti i
caratteri seguenti verrebbero impachettati in uno o più datagrammi
successivi. Se questo fosse un problema si può scegliere se aumentare
il tempo, oppure se effettuare più letture successive.
Connessione TCP
Il protocollo TCP permette di contattare in modo sicuro il server,
cioè con garanzia di integrità dei dati trasmessi, e il server stesso
non ha bisogno di sapere a priori l'indirizzo di chi lo contatta
perché lo ricava automaticamente al momento della connessione. Queste
caratteristiche permettono di usare il serial server anche attraverso
una connessione internet da qualsiasi parte del mondo.
In pratica
Il TCP richiede una fase preliminare di connessione (metodo connect).
La procedura di connessione può andare in errore per molti motivi,
pertanto anch'essa va racchiusa in un blocco try/except. L'impostazione
del timeout (in questo caso un secondo) è valida sia per la
connessione che per la ricezione.
# Script Python3
import socket
s = socket.socket() # socket TCP di default
s.settimeout(1) # timeout per connect e recv#-----------------------------------------------------------
def connesso(s, a):
try:
s.connect(a)
return True
except:
return False
#-----------------------------------------------------------
if connesso(s, ("192.168.1.3", 4001)):
s.send(bytes([31]))
try:
print(str(s.recv(1024), "ascii"))
except:
print("ERRORE DI RICEZIONE")
else:
print("ERRORE CONNESSIONE TCP")
s.close()
Pagina creata il 3/8/2011 -
Ultimo aggiornamento 30/11/2013