O que acontece sob o capô quando alguns dados são enviados / recebidos em um uart (ou similar)?

2

Estou tentando entender como os computadores funcionam e eu estava pensando em periféricos. Aqui está o que eu entendi até agora, mas algumas partes estão faltando.

Usando um Arduino, eu envio algum texto a cada segundo (a, depois b, c, ...) via UART para um Pandaboard. Eu acho que há um chip especial no Pandaboard ou em seu microprocessador que está sempre ouvindo o pino rx. Quando ele vê alguma mudança de voltagem, ele começa a gravar o byte e envia uma interrupção para o sistema Linux. O sistema pára tudo, pede ao chip o novo byte e o grava em /dev/ttyUSB3 , por exemplo.

A primeira coisa que eu não entendo: se eu faço cat /dev/ttyUSB3 , vejo os caracteres aparecendo a cada segundo ( a..b..c ). Se eu parar cat , esperar 5 segundos e fazer cat novamente, vejo ( i..j..k... ), mas espero ver os caracteres ausentes ( d..e..f..g..h ) que foram enviados, mas não foram exibidos, mas não vejo eles. Como funciona o gato? O que há nesse arquivo /dev/ttyUSB3 ?

Por outro lado, se eu fizer echo "hello" > /dev/ttyUSB3 , o sistema irá de alguma forma dizer ao chip para enviar sinais elétricos no pino tx. Ele envia byte para o chip? Ou todos juntos?

    
por Thomas 15.12.2013 / 23:37

1 resposta

4

Os arquivos em /dev são arquivos de dispositivos, não são arquivos reais. Eles normalmente não têm conteúdo no disco (alguns deles representam discos brutos). Não há nada no arquivo. Se você fizer ls -l /dev , verá tudo o que existe nesses "arquivos": Um nome, alguns bits especiais, veja o primeiro caractere do modo (não é d = diretório, - = arquivo regular, l = symlink, é c = character device ou b = block device), então existem 2 números onde o tamanho dos arquivos deve ser. Estes mapeiam para tabelas no kernel, são números maiores e menores do dispositivo.

Quando um processo lê um dispositivo serial, os dados são transmitidos para o processo, o mesmo que um arquivo é transmitido quando você o lê sequencialmente ou o fluxo de um canal. O sistema operacional não vai lembrar o que chega na porta quando nenhum processo está interessado, isso exigiria uma quantidade enorme (infinita) de armazenamento. Se você quiser, precisa de um processo para registrá-lo.

Quando os dados são enviados, pode ser enviado um byte por vez ou um bloco de vários bytes depende do hardware, e não é uma coisa específica do UNIX.

    
por 15.12.2013 / 23:50