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!
Ciao,
Touch.
Inviato: ven 8 lug 2005, 9:04
da touchstyle
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