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:
Saída de cupins para o mesmo sinal exibido no osciloscópio.
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.
1
sí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 sã desse sinal.Respostas:
Você perdeu um detalhe importante do RS232. Os níveis lógicos são os seguintes:
Figura 1. Níveis de sinal RS232. Fonte: Wikimedia Commons .
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.
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.
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.
fonte
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.
fonte