Pagina 1 di 1

Controllo hw via seriale

Inviato: gio 7 lug 2005, 22:50
da diego
Ciao,
sono alle prese con un'interfaccia a rele' da pilotare via seriale.
Da m$ e' semplice in qualto basta redirigere l' echo di una striga
sulla com1 a 9600, 8N1, in Linux c'e' un sistema senza dover
scomodare gcc?
Ho provato un echo "stinga" > /dev/ttyS0 e con minicom,
ma niente.
Ringrazio chiunque possa darmi qualche suggerimento.

Inviato: ven 8 lug 2005, 0:30
da useless
dovrebbero funzionare, io uso minicom correntemente. hai provato da root?

Inviato: ven 8 lug 2005, 9:00
da touchstyle
Ho trovato in rete :

http://www.linuxfocus.org/Italiano/July ... e239.shtml
http://www.ontrak.net/linux.htm
http://howtos.linux.com/howtos/IO-Port- ... ming.shtml

Mi ricordo di aver trovato un how-to su come pilotare un relè, cerco sui backup perchè google non ne vuole sapere...

Mi raccomando, bufferizza! :o

Ciao,
Touch.

Inviato: ven 8 lug 2005, 9:04
da touchstyle
TROVATO!

Fa morire dal ridere... : http://www.sandlab.org/linux/howto/inde ... ini/Coffee

:D :) :wink: :) 8O :D :o

Ciao,
Touch.

Inviato: lun 11 lug 2005, 13:39
da diego
Grazie a tutti per i link (figo quello del caffe')
ho deciso per scomodare il Perl con uno script
che si appoggia al modulo Device::SerialPort.

Ciao

Inviato: lun 11 lug 2005, 13:57
da touchstyle
Bene!
Tienici informati. La doc sull'uso delle periferiche con Linux scarseggia...!

Ciao e grazie!

Inviato: ven 29 lug 2005, 15:03
da diego
Ho avuto qualche problemino col perl, quindi sono passato a c.
Questo e' il sorgente che ho utilizzato:

----------------------------------------------------
#include <termios.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <ctype.h>
#include <sys/signal.h>
#include <sys/types.h>

#define BAUDRATE B9600
#define MODEMDEVICE "/dev/ttyS0"
#define _POSIX_SOURCE 1 /* POSIX compliant source */
#define FALSE 0
#define TRUE 1


main()
{
int fd, c, res;
struct termios oldtio,newtio;
char buf[255];

/* Apro /edv/ttyS0 in modalita' non-blocking
(la read ritorna immediatamente) */
fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY | O_NONBLOCK);
if (fd <0) {perror(MODEMDEVICE); exit(-1); }

tcgetattr(fd,&oldtio); /* Salvo il settaggio corrente */

/* e ne faccio una stampa */
printf("Control Mode (cflag) = %x\n", oldtio.c_cflag);
printf("Input Mode (iflag) = %x\n", oldtio.c_iflag);
printf("Output Mode (oflag) = %x\n", oldtio.c_oflag);
printf("Local Mode (lflag) = %x\n", oldtio.c_lflag);


/* nuove impostazioni: 9600 8N1 */
newtio.c_cflag = BAUDRATE | CS8;
newtio.c_iflag = 0;
newtio.c_oflag = 0;
newtio.c_lflag = 0;
tcflush(fd, TCIFLUSH);
tcsetattr(fd,TCSANOW,&newtio);

/* Questo riguarda la scheda con cui mi interfacciavo:
la sequenza era composta da 2 "*" seguiti da un byte
per il pilotaggio dei rele e chiudevo con un "#"
*/

// reset
write(fd,"**",2);
write(fd,"",1);
write(fd,"#",1);

sleep(1);

// si attivano alcuni rele
write(fd,"**",2);
write(fd,"a",1);
write(fd,"#",1);

/* ripristino vecchi settaggi */
tcsetattr(fd,TCSANOW,&oldtio);
}

---------------------------------------------

Questo programma funziona, ma su un pc con
non riuscivo a farlo funzionare, dopo la stampa
dei settaggi mi andava in timeout nell'impostazione
dei nuovi parametri: i permessi su ttyS0 erano gli stessi
boh.
Spero possa essere utile a qualcuno per iniziare,
consiglio pure una approfondita lettura del
"man termios" e dell' "howto prgramming-serial"

Ciao