Visualizza messaggio singolo
Vecchio 13-03-2008, 19.01.05   #1
Gergio
Gold Member
 
Registrato: 14-06-2001
Loc.: LC
Messaggi: 2.415
Gergio promette bene
[c] inviare interi alla porta seriale

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?
___________________________________

Gergio non รจ collegato   Rispondi citando