2009-02-03 16 views
5

Il mio unico modo di comunicazione con il mio dispositivo incorporato è una porta seriale. Di default, Linux incorporato usa questa porta come terminale. Come disattivare questo terminale e utilizzare il collegamento seriale per trasferire dati binari? Ho sentito parlare di comandi come rx e tx ma non riesco a trovarli.Dati binari su terminale seriale

Penso di poter solo leggere() da e scrivere() cose su/dev/tty ma voglio essere sicuro che nessun messaggio di errore o qualsiasi altro pasticcio con il mio flusso di dati.

risposta

3

È possibile utilizzare un'applicazione come xmodem per trasferire file su qualsiasi terminale. La porta seriale di cui parli è un terminale o è anche la console del kernel.

Se il kernel non è rumoroso, è possibile utilizzare la connessione corrente per effettuare il trasferimento di xmodem. Dal lato host, puoi usare kermit, che è bello e con script.

Se si vuole fare la vostra porta seriale prime, e si dispone di descrittore di file ttyfd aperto, Ecco un modo per farlo:

struct termios tty, orig_tty; 

... 

if(tcgetattr(ttyfd, &tty) < 0) 
{ 
    // error checking 
} 
// backup tty, make it raw and apply changes 
orig_tty = tty; 
cfmakeraw(&tty); 
if(tcsetattr(ttyfd, TCSAFLUSH, &tty) < 0) 
{ 
    // error checking 
} 

... 
//end of program or error path : 
tcsetattr(ttyfd, TCSAFLUSH, &orig_tty) 

Non dimenticare di ripristinare l'impostazione alla fine del il tuo programma se vuoi ancora un buon terminale.

3

Non puoi semplicemente impostare il terminale su raw?

Dai un'occhiata allo this tutorial.

2

È possibile eseguire sul terminale un comando che trasferirà i dati tramite un protocollo a livello di applicazione. I comandi rx e tx che si riferiscono implementano lo XMODEM file transfer protocol. Potrebbe essere una soluzione, se i dati binari che vuoi trasferire consistono di file, le richieste di throughput sono basse e non ti interessa il sovraccarico amministrativo nell'esecuzione dei comandi. In alternativa, potrebbe essere necessario multiplexare la porta seriale per gestire sia il trasferimento dei dati che il terminale. Disabilitare il comando del driver del terminale seriale (getty) ed eseguire il protocoll PPP sulla linea seriale per stabilire una connessione IP al dispositivo. È quindi possibile accedere al dispositivo tramite ssh o telnet e trasferire i dati tramite un socket IP.

1

Sì, tutte le porte seriali sono in /dev/ttyxx. Notare che /dev/tty è una scorciatoia che rappresenta il terminale corrente, non una porta seriale specifica. Spesso, questi sono di proprietà di root e richiedono di disporre dei privilegi o essere nel gruppo adm per accedere al dispositivo direttamente dalla propria applicazione.

Si consiglia di chown il dispositivo in modo che sia possibile accedervi. Non sono sicuro di quale sia la conseguenza della modifica della proprietà del dispositivo; IIRC, è facile da fare e funziona bene. L'alternativa è usare setuid per elevare il tuo programma a uno stato privilegiato.

C'è un programma chiamato getty che consente agli utenti di accedere da una porta seriale. Il tuo inittab inizierà getty sulle porte seriali in modo che le persone possano accedere.

Si desidera disabilitare getty. In alcuni casi, esiste un gestore di porta che aiuta a farlo.

In alcuni casi, è possibile modificare inittab per utilizzare mgetty, che è una versione più intelligente e più semplice da controllare di getty.

3

Per disabilitare la console di Linux è necessario modificare la riga di comando di Linux creata dal bootloader da: console =/dev/ttyS? a: console = null

2

Come le altre note hanno implicato, ci sono diverse cose da controllare, qui raccolti:

  1. Assicurarsi che il kernel Linux non sta usando la porta seriale. Assicurati che non ci sia nessuna opzione console = nel comando bootload nel tuo file grub. Di solito non è lì per impostazione predefinita.
  2. Assicurarsi che non ci sia getty in esecuzione sulla porta seriale. Cerca in/etc/inittab una voce per/dev/ttyS0 (porta seriale A) e commentala se è presente.
  3. Assicurarsi che/dev/ttyS0 sia leggibile e scrivibile dal processo. È possibile creare un utente specifico con il quale viene eseguito il programma di controllo e che possiede/dev/ttyS0, quindi chmod 700/dev/ttyS0. Ciò contribuirà ad assicurare che anche altri utenti/programmi non tentino di utilizzare la porta seriale.
  4. Utilizzare open() su ttyS0 per ottenere un fd, quindi utilizzare la famiglia di routine tcsetattr per impostare la velocità della linea e la disciplina.

I programmi di terminale probabilmente non saranno utili se non è possibile eseguire lo stesso programma sul dispositivo incorporato per gestire l'altra estremità della connessione.