Newsgroup: it.comp.os.linux.development
Titolo: Porta seriale

Ciao a tutti avrei bisongo di una mano perche non riesco ad usare in
maniera corretta la porta seriale, ho una stringa di byte da mandare
sulla porta seriale ma usando la funzione write ogni qual volta nella
stringa viene trovato come carattere un 0x0a viene aggiunto in
precedenza un 0x0d
la stringa che devo inviare è questa:
2_0_18_22_4_1_0_0_0_0_6_6_0_8_b_0_4_a_0_0_b_0_a_0_0_0_31_
e la invio cosi
write(fd,TX,27);
02 00 18 22 04 01 00 00 00 00 06 06 00 08 0B 00 04 0D 0A 00 00 0B 00
0D 0A 00 00 00 31
Cosi facendo non riesco a comunicare con il dispositivo sulla seriale
Qualcuno ha qualche idea sul come risolvere questo piccolo problema??

 0D 0A 00 00 00 31
questo sopra sarebbe TX ? 
pensi che aggiungere quegli zeri davanti ad ogni carattere non cambi le
cose? mica stai sommando degli interi eh...
 
un esempio bovino:
strcpy(buffer,"2018224100006608b04a00b0a00031");
a = write(fd,buffer, strlen(buffer));
if (a == strlen(buffer))
	printf("OK\n");
ah, come l'hai apetra la seriale?

gli under scor li avevo messi in fase di stampa per vedere realmente
cosa mandavo...
quello sotto la write è quello che viene ricevuto sulla seriale.... la
seriale è aperta cosi
tty_fd = open(tty_dev,O_RDWR| O_NOCTTY | O_NONBLOCK);   //non si
blocca in attesa di risposte dalla seriale
  	if (tty_fd<0)
	{
  		return -1;
  	}
	else
	{
		// settagi porta seriale
		tcgetattr(tty_fd,&tty_saved_attributes);
		tcgetattr(tty_fd,&new_attributes);
		// c_cflag
	  	new_attributes.c_cflag |= B9600;		 	// Set baud rate
		new_attributes.c_cflag &= ~PARENB;
    		new_attributes.c_cflag &= ~CSTOPB;
        	new_attributes.c_cflag &= ~CSIZE;
        	new_attributes.c_cflag |= CS8;
					 	// 8 data bit
		new_attributes.c_cflag |=CLOCAL;
		new_attributes.c_cflag &= ~CRTSCTS;
		new_attributes.c_iflag &= ~(IXON | IXOFF);
		// c_iflag
	  	new_attributes.c_iflag |= IGNPAR;	// Ignore framing errors and
parity errors.
		// c_lflag
  		new_attributes.c_lflag &= ~(ICANON); 	// DISABLE canonical mode.
  																		// Disables the special characters EOF, EOL,
EOL2,
  																		// ERASE, KILL, LNEXT, REPRINT, STATUS, and
WERASE, and buffers by lines.
	  	new_attributes.c_lflag &= ~(ECHO);// DISABLE this: Echo input
characters.
	  	new_attributes.c_lflag &= ~(ECHOE);//DISABLE this: If ICANON is
also set,the ERASE character erases the preceding input
  																		// character, and WERASE erases the preceding
word.
	  	new_attributes.c_lflag &= ~(ISIG);// DISABLE this: When any of the
characters INTR, QUIT, SUSP,
  		// or DSUSP are received, generate the corresponding signal.
 		  new_attributes.c_cc[VMIN]=1;		// Minimum number of characters for
non-canonical read.
		  new_attributes.c_cc[VTIME]=0;		// Timeout in deciseconds for non-
canonical read.
		  tcsetattr(tty_fd, TCSANOW, &new_attributes);// salvataggio nuovi
settaggi
	}

 cose? mica stai sommando degli interi eh...
quello è quanto è stato ricevuto sulla seriale... l'ho copiato ed
incollato da un programmino che spermette di visualizzare i dati della
seriale... quello che invio io come TX è questo :
2_0_18_22_4_1_0_0_0_0_6_6_0_8_b_0_4_a_0_0_b_0_a_0_0_0_31 (gli _ gli ho
aggiunti per separee i byte in fase di stampa con la printf....)

 seriale... 
interssante, non è che i dati li legge *SOLO* il programmino? (è una
seriale, mica un file di testo :)


ho usato il programmini xke stramente inviando questi dati non
ricevevo risposta dal dispositivo seriale con il quale dovrei
comunicare, mentre inviando altri dati aveva sempre funzionato, ho
voluto quindi verificare se i dati che inviavo erano realmente quelli
volevo.
Il protocollo di comunicazione che viene utilizzato con questo
dispositivo non prevede un fine messaggio ma solo uno start il numero
di byte che seguono ed infine un  dato di check, il comando mi viene
quindi ignorato se mi vengono aggiunti dei caratteri che io non voglio
inviare... casualmente viene aggiunto uno 0x0D prima i uno 0x0A che
formando cosi un CR LF... in ascii cioe un a capo con ritorno a inizio
riga....

 seriale, mica un file di testo :)
-rima non ho risp a questa domanda.... si ora li legge solo il
programmino xke lo sto usando per capire come mai non ricevevo alcuna
risposta dal dispositivo seriale... ovviamente se io gli scrivo che
deve aspettarsi 27 caratteri e che l'ultimo è il check per verificare
i dati se in mezzo a questi 27 ne vengono inseriti altri ovviamente
ingora il messaggio dato che il 27 carattere non puo piu essere il
check

 riga....
Verifica bene come sono settate le tty.  È probabilmente necessario 
configurarli in raw mode oppure in modo da non generare il CR ogni 
volta che riconosce LF.  Da shell è necessario usare 'stty', da 
programma ci sono le ioctl (o la flag adatta per tcsetattr()).
Ciao
Giovanni
-- 
   A computer is like an air conditioner,
   it stops working when you open Windows.
   Registered Linux user #337974  < 
http://giovanni.homelinux.net/
 >

 Giovanni
immaginavo dipendesse da qualche settaggio della porta,non so xo dove
e come andare a cercare i settaggi sai darmi qualche dritta a qualche
messaggio fa ho meso come ho settato la porta....

 configurarli in raw 
stavo giusto per dirglielo, io sulle seriali ci scrivo cosě:
sf = B9600;
cfsetospeed(&new_attributes, sf);
cfsetispeed(&new_attributes, sf);
cfmakeraw(&new_attributes);
dopo.c_lflag & ~ECHO;
a = tcsetattr(ttyfd, TCSANOW, &new_attributes);	

 a = tcsetattr(ttyfd, TCSANOW, &new_attributes);    
funziona grazie a tutti