Ethernet serial server

Serial server

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.

Ethernet serial serverIl 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.

Serial server configurazione LANSerual server configurazione porta seriale

 

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.

Serial server configurazione UDPIn 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.Serial server configurazione TCP

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()

 

 

(3/8/2011)

 

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *