Pourquoi ne puis-je pas envoyer de messages avec succès via RS232?

9

Donc, la semaine dernière, j'ai travaillé à obtenir des messages UART envoyés à partir d'un STM32F407 et à les lire sur mon ordinateur portable via un câble ugreen RS232 vers USB à l'aide de termites.

J'ai utilisé STMCube pour générer du code et y ajouter en lisant les instructions pertinentes en haut du fichier "stm32f4xx_hal_uart.c" (et en regardant beaucoup de vidéos et en lisant en ligne).

J'ai vérifié le message transmis sur un oscilloscope et il correspond à sa représentation ASCII.

Par exemple, j'envoie 'Q' qui est 0101 0001, je reçois 'W' qui est 0101 0111. La lecture sur la portée montre:

entrez la description de l'image ici

Sortie de termites pour le même signal que celui affiché sur l'oscilloscope. entrez la description de l'image ici

J'ai confirmé que les taux de transmission / parité / HWcontrol correspondent sur les termites et dans mon code.

Pour recevoir un caractère correct, j'ai essayé d'abaisser et d'augmenter les vitesses de transmission.
J'ai essayé différents jeux de caractères pour essayer de trouver un motif qui provoque l'affichage de mauvais caractères.
De plus, j'ai essayé différents terminaux tels que Putty ou Teraterm.

FeraTaTa
la source
8
Votre «câble RS232 vers USB» fonctionne-t-il avec des niveaux de tension RS232 ou des niveaux de tension «TTL», et votre carte STM32F407 utilise-t-elle le pilote / récepteur approprié pour ces niveaux? Je suis presque certain que la réponse à la question 2 est "Non", car si j'interprète votre trace de portée à travers un filtre "mauvais niveaux et polarité", je vois aussi un "W". Selon toute probabilité, votre carte n'a pas de matériel pilote / récepteur (utilise donc des niveaux TTL) et votre "câble RS232 vers USB" a un matériel pilote / récepteur RS232 (utilise donc des niveaux RS232).
brhans
3
Essayer quelques caractères différents confirmerait instantanément l'hypothèse de @brhans. Envoyer le même personnage encore et encore en attendant un résultat différent est l'une des définitions de la folie ...
Dave Tweed
3
FeraTaTa - Juste un point qui, je pense, n'a pas été mentionné jusqu'à présent: à première vue, votre trace de portée montre un signal qui semble tourner au ralenti à 0 V (regardez le 1symbole avec le fond jaune à gauche de la trace - c'est le niveau 0V) puis des impulsions en dessous de 0V. Ce ne serait pas vrai pour un signal logique provenant directement d'un STM32 et, en effet, ce n'est pas vrai. En regardant dans le coin inférieur gauche, vous avez défini le canal 1 sur le couplage AC (c'est le ~symbole que vous voyez là-bas). Le signal tourne vraiment au ralenti haut et bat autour de 0V. Utilisez le couplage CC pour une vue saine de ce signal.
SamGibson

Réponses:

22

Vous avez manqué un détail majeur de RS232. Les niveaux logiques sont les suivants:

entrez la description de l'image ici

Figure 1. Niveaux de signal RS232. Source: Wikimedia Commons .

  • Logique 1 = -3 à -12 V.
  • Logique 0 = +3 à +12 V.
  • Entre -3 et +3, le niveau logique n'est pas défini.
  • Le bit de démarrage RS232 est un 0 logique.

Pour convertir de la logique TTL (5 V) en RS232, un pilote est requis. Les puces telles que le MAX232 font l'inversion du niveau logique et l'augmentation de tension pour vous.

Il est parfois possible de "tricher" et d'introduire un signal TTL dans une entrée RS232 à condition que le niveau logique soit inversé. La fiabilité de cette méthode dépend de la puce utilisée sur l'entrée RS232.

entrez la description de l'image ici

Figure 2. La forme d'onde transmise. En haut se trouve la configuration binaire du «Q» que vous avez transmis. En bas se trouve la lecture de l'entrée RS232.

Notez que l'entrée RS232 recherche un front positif pour indiquer le bit de départ. Cela ne se produit pas avant le deuxième bit de vos données, donc tout ce qui suit est un bit vers la droite et inversé comme le récepteur le voit. Par chance, votre MSB est le niveau logique correct pour le bit d'arrêt, donc le récepteur l'a interprété comme une trame valide, l'a décodé et a affiché un «W».

À des fins de test, vous pouvez inverser votre sortie TTL. Cela fonctionnera probablement car il "fonctionne" en ce moment.

entrez la description de l'image ici

Figure 3. Le MAX232 puce utilise des condensateurs dans les circuits de pompe de charge pour augmenter l'alimentation 5 V pour les niveaux RS232.

Pour plus de fiabilité, ajoutez une puce MAX232 pour transmettre et recevoir un signal de niveau RS232 approprié.

Transistor
la source
3
Comme peut-être une meilleure alternative, des câbles USB à TTL UART sont disponibles. Si l'OP utilise un adaptateur USB de toute façon, il n'y a pas tant d'intérêt à ajouter une puce supplémentaire pour le changement de niveau.
Graham
1
RS-232 est un 0 logique = V + bipolaire qui est n'importe quoi> 2V et un seuil équivalent TTL de 1,5V typ. en CMOS comme 74HCTxx avec petite hystérésis (50mV ??)
Tony Stewart Sunnyskyguy EE75
6
En anglais, s'il vous plaît, Tony?
Transistor
3
C'est de l'anglais aux EE, quelle partie ne comprenez-vous pas? RS232 est -V au repos et> + 2V au démarrage mais est une logique négative à la tension (0 = V +, 1 = V-) pour les données et s'arrête sur V-. Je parie que vous ne saviez pas que le seuil RS-232 est de 1,4 ~ 1,5 V
Tony Stewart Sunnyskyguy EE75
8
Merci, Tony. C'est beaucoup plus lisible et sensé. Vous omettez la ponctuation, les mots clés et les conjonctifs sur un trop grand nombre de vos réponses rapides. Je suis un vieux garçon comme toi avec près de quatre décennies d'EE. Ma figure 1 montre les tensions de seuil pour RX. Voir aussi Omega , Analog , Wikipedia et Maxim . Tous les états ± 5 V pour TX et ± 3 V pour RX.
Transistor
7

Compte tenu du court courrier et du faible débit binaire de 9600, les niveaux TTL et CMOS fonctionnent bien. Le problème éloquemment détaillé par @Transistor est que les données UART sont de logique négative 0 ~ 5V et RS-232 est de logique positive +/- V f entre +/- 3 et +/- 15V (?)

Par conséquent, comme il le suggère également, un onduleur fonctionnera.

Le problème n'est pas un problème de taux d'erreur binaire (BER) ou d'intégrité du signal, mais une logique inversée.

De plus, la "zone grise" est pour la marge de bruit longue distance. Elle n'est pas <+/- 3V pour vous car votre câble est court. Le seuil logique réel du RS-232 Rx est exactement le même que l'ancienne tolérance TTL (deux gouttes Vbe) ou 1,4 V +/- 20% (?).

Ils appellent cela une zone grise afin de répondre à toutes les spécifications de distance et de débit en bauds en raison des parasites de bruit et de la sonnerie des bords.

Pour des câbles plus longs, achetez n'importe quel MAX232. Les variations peuvent dépendre de la vitesse et des caractéristiques de la tension.

Tony Stewart Sunnyskyguy EE75
la source