Suponha que eu esteja transmitindo dados por FM, onde 0 é 2Hz e 1 é 4Hz. O transmissor está transmitindo 2Hz quando não há entrada. Se eu alimentasse o binário recebido na porta UART de um microcontrolador, como o microcontrolador diferenciaria entre nenhum dado e 0?
Isso se torna relevante ao transmitir caracteres ASCII, por exemplo. Suponha a seguinte sequência:
01000110 01101111 01101111 01100010 01100001 01110010
Como adicionei espaços, podemos traduzir isso para:
Foobar
Mas para uma máquina, a string ficaria assim:
010001100110111101101111011000100110000101110010
Como você criaria esses "espaços" para não confundir os caracteres ASCII ao receber o binário?
digital-logic
data
binary
Allenph
fonte
fonte
Respostas:
Se você alimentar alguma coisa na porta UART de um microprocessador, deverá seguir o protocolo de comunicação UART se desejar que o microprocessador entenda o que está sendo alimentado. Você precisa incorporar cada caractere ASCI em um pacote UART que contenha um bit de início, um bit de parada e possivelmente um bit de paridade; muito mais informações estão disponíveis na página da Wikipedia do UART .
Quando você não está enviando, o barramento fica ocioso e é mantido em um estado logicamente alto. Quando você inicia a transmissão de um pacote, o primeiro bit é sempre logicamente baixo. Este é o bit inicial. Em seguida, segue oito bits de dados e, em seguida, um bit de parada logicamente alto. O microprocessador sabe quando o próximo bit está chegando, pois sabe a velocidade do barramento que você configurou. Portanto, é possível transmitir, por exemplo, dois zeros um ao lado do outro. Tanto o microprocessador quanto a unidade que está transmitindo ao microprocessador precisam ser configurados com a mesma velocidade de transmissão, paridade e número de bits de parada.
fonte
Existem muitas técnicas para isso. Você pode querer olhar para a codificação Manchester ou códigos NRZ. Ou codificação 8b / 10b , que mapeia a cada 8 bits de dados para uma sequência de 10 bits que permite recuperação do relógio, correção de erros e símbolos especiais de "vírgula" que podem ser usados para detectar o início e o fim de uma transmissão.
fonte
Todos os caracteres ASCII têm 8 bits de largura, é possível ver isso em uma tabela ASCII. Os valores HEX dos caracteres ASCII não vão além de FF (1111 1111)
O UART não pode receber mais de um byte de dados (8 bits) por vez, também, além dos dados de 8 bits, existem os bits STOP e START, PARITY e mais alguns, que você pode ver na figura abaixo e que juntos formam o pacote de comunicação UART.
Então, quando você envia caracteres ASCII para o UART, envia-os um por um e é assim que a string é criada. Você já sabe que a string é apenas uma matriz de caracteres.
fonte
O protocolo UART, como Mattias explicou, é um protocolo assíncrono baseado em tempo. O que define os limites entre os bits é o tempo gasto desde o início do bit inicial. Portanto, o microcontrolador "amostrará" os bits
(N+half)/baudrate
segundos após o início do bit. O meio bit é apenas para amostrar no meio dos bits, para que possa haver uma diferença de meio bit no tempo entre o receptor e o transmissor (lembre-se de que as diferenças são cumulativas e o pior caso ocorre no último bit de cada quadro, o que geralmente é, mas nem sempre, com largura de 8 bits, dependendo da configuração). A chave para fazê-lo funcionar é ter o receptor e o transceptor com taxas de transmissão o mais próximo possível.Portanto, o microcontrolador conta o tempo entre cada bit para saber onde cada bit está dentro de um quadro. O próximo caractere entrará no próximo quadro. Quando cada quadro termina, o microcontrolador começa a ouvir o próximo quadro automaticamente; assim, quando o próximo bit inicial chegar, ele já sabe que deve iniciar um novo quadro. É assim que os caracteres são separados.
Além disso, acrescentarei que você não precisa de duas frequências para transmitir a um microcontrolador que recebe UART. Você pode usar uma única frequência como OOK em vez de duas frequências como FSK . Possui maior eficiência espectral e os circuitos são muito mais simples, já que você só precisa de um comutador de ondas portadoras como transmissor e um único detector de frequência como receptor, praticamente como código morse. Lembre-se de geralmente usar portadoras com frequências muito maiores que a taxa de transmissão, caso contrário, os circuitos mais simples não funcionarão corretamente.
fonte