# (solved) programmare porte seriali

## Ic3M4n

ciao a tutti, ho un piccolo problema con la programmazione delle porte seriali, mi spiego meglio: ho un bus dati collegato alla com0 e devo leggere e inviare dei dati tramite questa. Il problema nasce dal fatto che con una vecchia knoppix con kernel 2.6.7 riuscivo tramite il terminale ad inviare dei dati e questi venivano interpretati correttamente, adesso invece questa cosa non riesco più a farla. Ho fatto qualche ricerca tramite google e mi sono scontrato con oltre 20 anni di storia di collegamenti seriali, programmi differenti e metodi di invio dei dati anch'essi differenti arrivando al punto che non so come quali parti siano ancora attuali e quali si riferiscano ad implementazioni non più utilizzate. qualcuno di voi può darmi una mano o inviarmi sulla giusta via per capire come inviare correttamente i dati?Last edited by Ic3M4n on Wed May 09, 2007 12:17 pm; edited 1 time in total

----------

## djinnZ

 :Shocked:  Non ci ho capito niente.

In che senso non funziona?

è un programma che ti crea problemi o è un script dell'applicazione terminale?

cmq non sono 20 ma 30 anni.

la modalità qual'è?

----------

## Ic3M4n

oltre 20 anni = anche 30  :Wink: 

mi spiego meglio: 

redirigendo una stringa di inizializzazione formattata correttamente con la knoppix vecchia riuscivo a comandare un plc collegato alla seriale del pc, ora ci ho riprovato e non funziona, i procedimenti sono gli stessi, le uniche differenze che mi balzano all'occhio sono la codifica dei caratteri, prima iso8859.1 ora unicode, anche se i caratteri sono dei semplici ascii e la versione del kernel ora un 2.6.19 e prima un 2.6.7

io volevo scrivere un piccoo programmino per permettere di inviare queste stringhe di comandi e leggere le risposte fornite dal plc solo che non riesco ad ottenere alcun risultato.

Dato che la documentazione presente è immensa ma anche molto datata a volte volevo sapere se qualcuno può darmi qualche dritta per orientarmi.

----------

## djinnZ

Ancora non hai detto come. Mi pare di capire che stai tentando una pipe su una seriale cosa che in genere non funziona mai bene (e c'è il problema della codifica di sicuro). In ogni caso hai usato setserial per impostare la porta? Se ti colleghi con minicom che succede?

Da quando hanno cambiato il driver nel kernel ho trovato qualche piccolo problema con la stampante seriale ed ora uso solo il pnp (disabilitando gli altri).

L'esempio più facile è nel serial programming howto e non dovrebbe essere cambiato nulla rispetto a quello. La documentazione è datata perchè le seriali sono quelle e non è cambiato nulla.

----------

## Ic3M4n

esempio, non ricordo attualmente la stringa, non l'ho a portata di mano:

```
echo "*0100EE" >> /dev/ttyS0
```

 un tempo eseguiva l'operazione sul plc ed avevo una risposta.

adesso non più. L'idea era di aprire il file /dev/ttyS0 in un programma e leggere e scrivere quello che mi serve. Solo che in un tutorial leggo che per leggere si utilizza /dev/tty0 e per scrivere /dev/cua0 (che logicamente non ho) e quindi mi viene il dubbio che un po' di documentazione sia oltremodo datata.

minicom e cose del genere non li ho mai provati. non ho ancora avuto tempo per approfondire.

----------

## Onip

Io ho trovato utile net-dialup/gtkterm, mooolto simile all'HyperTerminal di windows.

----------

## falko

Io avevo scaricato un esempio scritto in C al seguente link

http://www.comptechdoc.org/os/linux/programming/c/linux_pgcserial.html

non ho mai avuto tempo di provarlo.... se lo fai tu te ne sarei grato  :Wink:   :Wink:   :Wink: 

Comuque, per curiosità che tipo di PLC stai usando?

In questo momento sto facendo proprio un progetto per PLC, pù precisamente PLC siemens

----------

## djinnZ

 *Ic3M4n wrote:*   

> esempio, non ricordo attualmente la stringa, non l'ho a portata di mano:
> 
> ```
> echo "*0100EE" >> /dev/ttyS0
> ```
> ...

 

mi pareva!   :Wink:  la pipe sulle seriali non ha mai funzionato bene.

Al più potresti pensare di adattare un dialer a tal proposito. In pratica l'echo ... funziona ma una volta terminato il file viene chiuso e ti perdi la risposta, più o meno, se il plc (nel mio caso era un modem) rileva che non c'è nulla ad attendere la risposta può anche essere che si resetti a zero.

In più ti conviene pensare di usare un comando 

```
echo -e "*0100EE\n\r"
```

.

 *Ic3M4n wrote:*   

> adesso non più. L'idea era di aprire il file /dev/ttyS0 in un programma e leggere e scrivere quello che mi serve. Solo che in un tutorial leggo che per leggere si utilizza /dev/tty0 e per scrivere /dev/cua0 (che logicamente non ho) e quindi mi viene il dubbio che un po' di documentazione sia oltremodo datata.

 

In questo si, la doc è un tantino datata. Adesso si usa solo ttyS0 sia per l'input che per l'output. Dai uno sguardo qui per cominciare se il c non è problema, da linea di comando avevo trovato un modo (volevo crearmi un mio programma per gestire la dannata centralina telefonica ma sono passati quasi dieci anni quindi dispero di trovare qualcosa).

Per prima cosa però installa minicom/gtkterm/seyon o che altro per fare delle prove a manina e verificare che la connessione funzioni poi inizi a pasticciare sulla programmazione.

Ti ripeto che ho notato qualche problemino di convivenza tra SERIAL_8250_PCI e SERIAL_8250_PNP (nel caso usi un adattatore usb potrebbe anche essere lì il prblema).

----------

## knefas

Io uso minicom, mai avuto successo inviando via bash a /dev/ttyxx.

----------

## Ic3M4n

ok, ho emerso gtkterm e finalmente sono riuscito a tornare al punto di partenza, ovvero ad ottenere quanto ottenevo prima con la knoppix.

adesso mi informo per bene su quanto riguarda la configurazione della com. Ringrazio tutti per la disponibilità.

PS: il PLC è di una marca sconosciuta, sono riuscito ad ottenere un po' di codici tramite un'opzione di debug e nulla più quindi non posso rispondere alla domanda di falko. diciamo che attualmente è tutta curiosità personale riguardo ad un'applicativo che utilizzo tutti i giorni senza sapere come funziona ed in puro spirito hacking voglio scoprire cosa effettivamente fa.

PS2: non centra nulla con il thread ma questo è il mio 3millesimo post in questa comunità. WOW! oops, no non si può più dire.   :Confused: 

----------

## djinnZ

Mi sono ricordato che cortocircuitando o il pin di paper out o il select a ground (verificare attentamente sono ricordi molto remoti di quando avevo tanti capelli lunghi e pesavo una decina di chili in più, senza pancetta) mi pare che si possa ovviare al problema della chiusura del device ad ogni operazione di scrittura o lettura via bash (ovviamente dipende molto dal dispositivo).

Altrimenti se termios.h ti torna complicato c'è il perl, il ruby o il tcl che hanno le proprie librerie specifiche.

----------

## Frez

oppure c'è l'accoppiata python + pyserial che è una figata  :Smile: 

e se ti piace lavorare da shell, lo chef consiglia ipython

----------

## Ic3M4n

allora: ringrazio tutti per le valide alternative, alla fine ho optato per una cosa leggermente differente in quanto mi trovavo molta pappa già pronta e non avevo voglia di dover reinventare la ruota.

spiego quanto ho fatto: 

con gtkterm ho trovato i settaggi corretti da dover utilizzare, parità, timeout, etc etc.

il linguaggio di programmazione che devo utilizzare è java, dopo una ricerca in internet ho scoperto che ci sono un paio di progetti che rendono disponibili le risorse relative alla com, uno specialmente fornito da sun ed un'implementazione esterna di alcune classi che nel pacchetto sun fanno schifo. Ovvero io ho letto un "il supporto da parte di java alle seriali fa schifo" e quindi mi sono cercato un'altra soluzione che vi spiego:

```
 eix ser2net

* net-misc/ser2net

     Available versions:  2.3 {tcpd}

     Homepage:            http://sourceforge.net/projects/ser2net

     Description:         Serial To Network Proxy

```

Ovvero trasmette le informazioni dalla seriale ad un socket e viceversa. La connessione verso un socket in java è una vaccata da fare e quindi ho risolto il mio problema dialogando direttamente con ser2net che ripassa le informazioni tramite la seriale. Cosa ancora più importante, ser2net può viaggiare su un pc ed il mio programma in java su un'altro senza problemi.

----------

## lucapost

l'altro giorno mi sono esaltato un pò quando con screen e la combinazione C-a H sono riuscito facilemente a ricavare un log dalla porta seriale   :Razz: 

----------

## mrfree

Grande Ic3M4n, servirà anche a me come soluzione  :Wink: 

----------

