da diego » ven lug 29, 2005 15:03
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