Por que não consigo enviar mensagens com sucesso pelo RS232?

9

Então, na semana passada, estive trabalhando para receber as mensagens UART enviadas de um STM32F407 e lê-las no meu laptop através de um cabo verde RS232 para USB usando cupins.

Eu usei o STMCube para gerar código e adicioná-lo lendo as instruções relevantes na parte superior do arquivo "stm32f4xx_hal_uart.c" (e assistindo a vários vídeos e lendo on-line).

Verifiquei a mensagem transmitida em um osciloscópio e ela corresponde à sua representação ASCII.

Por exemplo, envio 'Q', que é 0101 0001, recebo 'W', que é 0101 0111. A leitura no escopo mostra:

insira a descrição da imagem aqui

Saída de cupins para o mesmo sinal exibido no osciloscópio. insira a descrição da imagem aqui

Confirmei que as taxas de transmissão / paridade / HWcontrol estão correspondentes no cupim e no meu código.

Para receber o caráter correto, tentei diminuir e aumentar as taxas de transmissão.
Tentei conjuntos de caracteres diferentes para tentar encontrar um padrão que faz com que caracteres incorretos sejam exibidos.
Além disso, eu tentei diferentes terminais, como no Putty ou Teraterm.

FeraTaTa
fonte
8
Seu "cabo RS232 para USB" funciona com níveis de tensão RS232 ou "TTL" e sua placa STM32F407 está usando o driver / receptor apropriado para esses níveis? Estou quase certo de que a resposta à pergunta 2 é "Não", porque se eu interpretar o rastreamento do seu escopo através de um filtro "níveis errados e polaridade", também vejo um "W". Provavelmente, sua placa não possui hardware driver / receptor (usa níveis TTL) e seu "cabo RS232 para USB" possui hardware driver / receptor RS232 (usa níveis RS232).
brhans
3
Tentar alguns personagens diferentes confirmaria a hipótese de @brhans instantaneamente. Enviando o mesmo personagem uma e outra vez, enquanto esperava um resultado diferente é uma das definições de insanidade ...
Dave Tweed
3
FeraTaTa - Apenas um ponto que acho que não foi mencionado até agora: À primeira vista, o rastreamento do seu osciloscópio mostra um sinal que parece estar ocioso em 0V (veja o 1símbolo com o fundo amarelo à esquerda do rastreamento - isso é 0V) e depois pulsa abaixo de 0V. Isso não seria verdade para um sinal lógico direto de um STM32 e, de fato, não é verdade. Olhando no canto inferior esquerdo, você definiu o canal 1 como acoplamento CA (esse é o ~símbolo que você vê lá). O sinal é realmente em marcha lenta alta e pulsante para cerca de 0V. Use o acoplamento DC para obter uma visão desse sinal.
SamGibson

Respostas:

22

Você perdeu um detalhe importante do RS232. Os níveis lógicos são os seguintes:

insira a descrição da imagem aqui

Figura 1. Níveis de sinal RS232. Fonte: Wikimedia Commons .

  • Lógica 1 = -3 a -12 V.
  • Lógica 0 = +3 a +12 V.
  • Entre -3 e +3, o nível lógico é indefinido.
  • O bit inicial RS232 é um 0 lógico.

Para converter da lógica TTL (5 V) para RS232, é necessário um driver. Chips como o MAX232 fazem a inversão do nível lógico e o aumento da tensão para você.

Às vezes, é possível "trapacear" e alimentar um sinal TTL em uma entrada RS232, desde que o nível lógico seja invertido. A confiabilidade desse método depende do chip usado na entrada RS232.

insira a descrição da imagem aqui

Figura 2. A forma de onda transmitida. No topo está o padrão de bits do 'Q' que você transmitiu. Na parte inferior, está a leitura da entrada RS232.

Observe que a entrada RS232 está procurando uma borda positiva para indicar o bit inicial. Isso não acontece até o segundo bit de seus dados, então tudo a seguir é um pouco para a direita e invertido conforme o receptor o vê. Por sorte, seu MSB é o nível lógico correto para o bit de parada, de modo que o receptor o interpretou como um quadro válido, decodificou e exibiu um 'W'.

Para fins de teste, você pode inverter sua saída TTL. Isso provavelmente funcionará, pois está "funcionando" no momento.

insira a descrição da imagem aqui

Figura 3. O chip MAX232 usa capacitores nos circuitos da bomba de carga para aumentar o fornecimento de 5 V para os níveis RS232.

Para maior confiabilidade, adicione um chip MAX232 para transmitir e receber um sinal de nível RS232 adequado.

Transistor
fonte
3
Como talvez uma alternativa melhor, existem cabos USB para TTL UART disponíveis. Se o OP estiver usando um adaptador USB de qualquer maneira, não faz muito sentido adicionar um chip extra para a mudança de nível.
Graham
1
RS-232 é uma lógica 0 = bipolar V + que é qualquer coisa> 2V e um limiar equivalente TTL de 1,5V tipo. no CMOS como 74HCTxx com pequena histerese (50 mV ??)
Tony Stewart Sunnyskyguy EE75
6
Em inglês, por favor, Tony?
Transistor
3
Isso é inglês para os EE, que parte você não entende? O RS232 é -V em marcha lenta e> + 2V na partida, mas é lógico negativo para a tensão (0 = V +, 1 = V-) para dados e para em V-. Eu aposto que você não sabia RS-232 limiar é de 1,4 ~ 1.5V
Tony Stewart Sunnyskyguy EE75
8
Obrigado, Tony. Isso é muito mais legível e sensato. Você deixa de fora a pontuação, as palavras-chave e os conjetivos em muitas das suas respostas rápidas. Sou um garoto velho como você, com quase quatro décadas de EE. Minha Figura 1 mostra as tensões limite para o RX. Veja também Omega , Analog , Wikipedia e Maxim . Todos os estados ± 5 V para TX e ± 3 V para RX.
Transistor
7

Considerando o curto curso e a baixa taxa de bits de 9600, os níveis TTL e CMOS funcionam bem. O problema eloquentemente detalhado por @Transistor é que os dados UART são lógicos negativos 0 ~ 5V e RS-232 é lógicos positivos +/- V f entre +/- 3 e +/- 15V (?)

Portanto, como * ele também sugere, um inversor funcionará.

O problema não é um problema da taxa de erros de bits (BER) ou a integridade do sinal, mas a lógica invertida.

Além disso, a "zona cinza" é para margem de ruído de longo curso. Não é <+/- 3V para você porque seu cabo é curto. O limite lógico real do RS-232 Rx é exatamente o mesmo que o TTL antigo (duas quedas de Vbe) ou a tolerância de 1,4V +/- 20% (?).

Eles chamam de zona cinza para atender a todas as especificações de distância e taxa de transmissão devido a falhas de ruído e toque nas bordas.

Para cabos mais longos, adquira qualquer MAX232. As variações podem depender da velocidade e dos recursos da tensão.

Tony Stewart Sunnyskyguy EE75
fonte