PDA

View Full Version : [c linux] inviare e ricevere dati esadecimali da seriale


sandro76
09-11-2009, 10:20
sto scrivendo un programma che deve inviare e ricevere dati in esadecimale su seriale
definisco due buffer come variabili globali

//fd della seriale
extern int fd;
/*buffer della seriale*/
extern char buffer_ingresso[10]; /*ingresso*/
extern char buffer_uscita[10]; /*uscita*/

le variabili globali sono in un altro file quindi sono extern.

setto i parametri della seriale


/*apro la seriale*/
fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY | O_NONBLOCK); //non bloccante comunicazione asincrona
if (fd==0)

{
fprintf(spy_knx_err, "problemi nell'apertura della seriale\n\r");
exit(-1);
}

//installo il signal hander che scattera' quando ci sono dati sulla seriale
saio.sa_handler = signal_handler_IO; //nome della funzione che gestira' il segnale
//saio.sa_mask = 0; //maschera degli altri segnali 0 default
sigemptyset(&saio.sa_mask);
saio.sa_flags = 0;
saio.sa_restorer = NULL;
sigaction(SIGIO,&saio,NULL);

fcntl(fd, F_SETOWN, getpid()); //registro il pid del processo che si deve occupare del segnale (questo)
fcntl(fd, F_SETFL, FASYNC); //abilito il segnale

//setto la seriale
tcgetattr(fd,&newtio); //salvo le vecchie impostazioni della seriale
//setto le nuove impostazioni

cfsetispeed(&newtio, BAUDRATE); //NUOVA FUNZIONE PER SETTARE LA VELOCITA' POSSO SCEGLIERE INGRESSO E USCITA, NON PIU' IN C_CFLAG
cfsetospeed(&newtio, BAUDRATE);


newtio.c_cflag |= (CLOCAL | CREAD);
newtio.c_cflag |= PARENB;

newtio.c_cflag &= ~PARODD;
newtio.c_cflag &= ~CSTOPB;
newtio.c_cflag &= ~CSIZE;
newtio.c_cflag |= CS8;
//newtio.c_cflag &= ~CNEW_RTSCTS;
newtio.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
newtio.c_iflag |= (INPCK | ISTRIP);
newtio.c_iflag &= ~(IXON | IXOFF | IXANY);



tcflush(fd, TCIFLUSH);
tcsetattr(fd,TCSANOW,&newtio); //applico le impostazioni subito
}


provo a inviare dati

buffer_uscita[0]=(char)8;
buffer_uscita[1]=(char)sc;
buffer_uscita[2]=(char)0xB1;
buffer_uscita[3]=(char)address.int_stat_sist_sup;
buffer_uscita[4]=(char)address.int_stat_sist_inf;
buffer_uscita[5]=(char)0;
buffer_uscita[6]=(char)stato_polling;
buffer_uscita[7]=(char)(0xA5+buffer_uscita[0]+buffer_uscita[1]+buffer_uscita[2]+buffer_uscita[3]+buffer_uscita[4]+buffer_uscita[5]+buffer_uscita[6])%256;

write(fd, buffer_uscita, 8);
tcdrain(fd);

leggendo sulla seriale ottengo 9 byte

80 00 02 0A 06 00 04 0A F8

in lettura ho ho lo stesso problema, leggo valori diversi, tipo
invio FF e ottengo 127
dove sbaglio?
grazie