Ciao, sto realizzando un'applicazione che permetta a un dispositivo di comunicare, attraverso la porta seriale, con una macchina linux. Il produttore del dispositivo mi ha fornito anche della documentazione in cui e' specificato il protocollo di comunicazione. La porta dovrebbe essere impostata con una velocita' di 9600, senza bit di parita', 8 bit dati, 2 bit di stop, no crc.
E fin qui dovrei esserci...
Poi viene specificato che il formato deve essere binario e qui sono un po' in difficolta'. Infatti dovrei spedire sulla porta seriale dei dati numeri, ma con il comando
write riesco a spedire caratteri.
Mi spiego meglio, con un esempio. Dovrei inviare la sequenza 0, 1 invece invio 48 e 49 (codice ascii corrispondente).
Ho trovato del codice gia' pronto per la gestione della seriale e l'ho modificato un po'
apertura seriale:
Codice:
int init(char *comname)
{
int com; // Il file per la seriale
struct termios tattr; // Struttura per impostare le caratteristiche della seriale
com = open (comname,O_RDWR | O_SYNC); // Apre il dispositivo (Lettura/scrittura, sincrono)
if (com == -1) // Open ritorna errore
{
perror ("Non posso aprire la seriale"); // Stampa il messaggio di errore
exit (2); // E termina drasticamente con errore
}
/* Impostazione della seriale
* fonte info libc->"Low-Level Terminal Interface"->"Noncanonical Mode Example" */
tcgetattr (com, &tattr); // Recupera gli attributi correnti della seriale
// Modi di ingresso - spegne i flag indicati
tattr.c_iflag &= ~(INLCR|IGNCR|ICRNL|IXON | IXOFF | IXANY);
// Modi di uscita - spegne i flag indicati
tattr.c_oflag &= ~(OPOST|ONLCR|OCRNL|ONLRET);
/* Modi di controllo - imposta 8 bit (CS8), abilita ricezione (CREAD),
*ignora segnali di controllo (CLOCAL) */
tattr.c_cflag = CS8 | CREAD | CLOCAL | CSTOPB;
tattr.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); // elimina traduzioni di carateri (ICANON) ed ECHO.
tattr.c_cc[VMIN] = 1; // restituisce dati dopo aver ricevuto 1 carattere
tattr.c_cc[VTIME] = 0; // nessun timeout
cfsetispeed (&tattr, B9600); // Imposta la velocita' di ricezione
cfsetospeed (&tattr, B9600); // Imposta la velocita' di trasmissione
tcsetattr (com, TCSAFLUSH, &tattr); // Imposta i nuovo attributi
return com; // Ritrona l'handle del file aperto
}
e ci scrivo banalmente con write(com,ZERO,1) (Ho definito ZERO come 00)
avete suggerimenti?