Question:
Pourquoi le bit de démarrage et le (s) bit (s) d'arrêt sont-ils nécessaires?
Tom
2017-10-22 03:24:39 UTC
view on stackexchange narkive permalink

J'apprends la communication série et je ne comprends tout simplement pas pourquoi le bit de démarrage et le ou les bits d'arrêt sont nécessaires.

Je veux dire que j'ai deux appareils connectés via des ports série, et le bit 1 est représenté par + 15V et le bit 0 est représenté par -15V.

Donc, pour que périphérique 1 envoie les 4 bits 0110 à périphérique 2 , périphérique 1 doit envoyer letensions suivantes: -15V + 15V + 15V -15V.

Ce qui me manque ici, car il semble que cela puisse fonctionner sans le bit de démarrage et le (s) bit (s) d'arrêt!

Vous avez oublié de spécifier l'état d'inactivité.
Cinq réponses:
Tom Carpenter
2017-10-22 04:01:30 UTC
view on stackexchange narkive permalink

Le scénario dont vous semblez parler (avec les bits de démarrage et d'arrêt) est probablement UART (dont RS232 est un type de). UART signifie Universal Asynchronous Receive Transmit, dont la partie clé est Asynchronous . Il n'y a pas de ligne d'horloge, seulement des données.

Dans ce type de système, vous avez deux périphériques (TX et RX) qui ne partagent pas nécessairement une horloge commune. Les deux systèmes peuvent par exemple être d'accord sur 9600 bauds, mais sans horloge commune, l'un peut produire 9601 bauds tandis que l'autre obtient 9599 bauds. Les horloges ne sont pas parfaitement précises, ce qui signifie qu'avec le temps, les deux dériveront de l'alignement.

De plus, comme la communication est asynchrone, elle peut démarrer à chaque fois que l'émetteur en a envie (en ignorant le contrôle de flux). L'émetteur et le récepteur pourraient s'allumer à des moments différents, et le récepteur n'a aucun moyen de savoir quand il commence à émettre.

L'exigence clé est alors connue sous le nom de synchronisation. Le protocole doit inclure un moyen pour l'émetteur de signaler au récepteur qu'il vient de commencer à émettre. De plus, il doit y avoir un moyen de synchroniser les horloges aux deux extrémités.

Dans le cas de l'UART, cette synchronisation se fait sous la forme d'une transition haut vers bas sur la ligne de données. La ligne passera au repos haut, puis tombera bas au début de la transmission. Cette transition agit pour synchroniser la synchronisation entre les deux appareils. Le récepteur sait alors synchroniser suffisamment de cycles de données en fonction de son horloge en bauds. Il y a cependant deux problèmes avec ce schéma:

  1. La seule transition de haut en bas ne suffit pas pour synchroniser le temps sur une longue période. N'oubliez pas que les deux appareils auront des fréquences d'horloge interne légèrement différentes. Tant que ces deux horloges sont à un certain% l'une de l'autre, la transition fournira suffisamment d'informations pour synchroniser les appareils pendant au plus quelques cycles d'horloge. Cela signifie que vous avez besoin d'une resynchronisation périodique.

  2. Si votre ligne tourne au ralenti et que le premier bit de données que vous souhaitez envoyer est également représenté par un niveau élevé, vous n'avez pas de transition. Si votre ligne tourne au ralenti et que le premier bit que vous souhaitez envoyer est bas, vous rencontrez le même problème. Cela signifie que vous avez besoin d'un moyen de distinguer le premier bit.

Ces deux problèmes sont résolus dans le cas d'UART en utilisant les bits de démarrage et d'arrêt. Les données envoyées sont divisées en paquets de quelques bits (par exemple 8 bits). Chaque paquet est précédé d'un bit de début de «bas» et suivi d'un bit d'arrêt de «haut». Cela signifie qu'entre tous les quelques bits, il y a une transition connue de haut en bas - le bit d'arrêt du dernier paquet et le bit de début du paquet actuel. Vous pouvez maintenant resynchroniser chaque paquet.


Ce n'est en aucun cas la seule façon de résoudre le problème. Il existe de nombreux autres schémas - le codage Manchester en est un exemple. Dans ce schéma, une transition de bas en haut signifie un 1 logique tandis qu'une transition de haut en bas signale un 0 logique. Cela signifie que chaque bit que vous envoyez code les informations d'horloge en son sein, ce qui signifie que vous pouvez resynchroniser chaque bit que vous envoyez.

Vous pourriez avoir d'autres méthodes de signalisation telles que l'utilisation ternaire - trois niveaux de tension. Par exemple, vous pouvez utiliser + 5V pour un 2, 0V pour un 1 et -5V pour un 0. Vous pouvez envoyer un binaire via ce système en utilisant l'un de ces états pour signifier inactif. Cependant, dans cet exemple, vous avez simplement remplacé un bit de démarrage et d'arrêt par une période de temps à une troisième tension. Vous ne modifierez pas le besoin de resynchronisation périodique, donc cela ne vous économise vraiment rien, et cela ajoute simplement une complication au circuit.

Trevor_G
2017-10-22 04:00:28 UTC
view on stackexchange narkive permalink

Vous dites -15V + 15V + 15V -15V. qui est 0110, vous avez raison, un récepteur pourrait recevoir cela correctement.

Mais que faire si vous envoyez 15V 15V 15V -15V comment sauriez-vous ce que c'est. En tant qu'auditeur, la première chose que vous entendez est le premier -15V, vous n'auriez aucune idée du nombre de signaux 15V avant cela.

L'auditeur entendrait la même chose, peu importe si l'expéditeur a envoyé 1110, 1101, 1011 ou 0111.

enter image description here

Sans aucune référence temporelle, ils se ressemblent tous en tant que signal de tension.

Parce que le temps compte avec les signaux asynchrones, vous devez envoyer un signal "LISTEN UP". En RS232, ce signal d'écoute est une transition de haut en bas sur la ligne. Il indique au récepteur "Je suis sur le point d'envoyer N bits de données à ma vitesse de transmission, en commençant MAINTENANT!"

enter image description here

Remarquez, dans cet exemple UART 4 ​​bits, chaque modèle a maintenant une signature unique.

Le bit d'arrêt garantit que la ligne retourne à l'état inactif à la fin de la transmission et donne également au récepteur une fenêtre de temps pour gérer les octets qui viennent d'être reçus, réinitialisés et se préparer à écouter le bit de démarrage suivant.

Dans l'image ci-dessous, la première trace n'a pas de bit d'arrêt. Remarquez que le dernier bit des premières données étant à zéro, la ligne est déjà au niveau bas lorsque le bit de début suivant arrive et il n'y a pas de transition pour démarrer l'UART. Dans la deuxième trace qui a un bit d'arrêt, vous êtes garanti haut avant bas.

enter image description here

En fait, la plupart des UARTS vous donnent la possibilité d'envoyer plus d'un bit d'arrêt pour ouvrir davantage cette fenêtre pour le récepteur. C'était plus important dans les premiers jours de la transmission série où le signal RS232 entraînait en fait directement les moteurs mécaniques et les relais, mais il peut toujours être utilisé aujourd'hui.

De plus, la plupart des UARTS vérifient en fait que le bit d'arrêt est haut au moment du bit approprié. Si ce n'est pas le cas, une erreur de cadrage est signalée au récepteur.

user287001
2017-10-22 04:03:31 UTC
view on stackexchange narkive permalink

Startbit est un réveil à la fin de l'état d'inactivité.Stopbit garantit qu'il existe une transition connue au début du nouvel octet.Le système a été développé à une époque où il n'y avait aucune possibilité de s'assurer que les moteurs des dispositifs de transmission de données mécaniques (= téléimprimeurs) fonctionnent de manière synchronisée aux deux extrémités.Les bits de démarrage et d'arrêt étaient la méthode de resynchronisation.

Aujourd'hui, des séquences de bits beaucoup plus longues qu'un octet peuvent être transmises sans avoir besoin de resynchronisation.Mais finalement, toutes les horloges s'éloignent et la synchronisation est nécessaire.Il existe de nombreux systèmes de codage développés qui transportent les données de synchronisation nécessaires beaucoup plus efficacement que start&stopbits qui nécessitaient + 25% de capacité supplémentaire.

JonRB
2017-10-22 03:29:06 UTC
view on stackexchange narkive permalink

Pour une charge utile bien sûr ... peut-être ... peut-être.Mais que faire si vous envoyez un flux de données.Comment le récepteur peut-il être sûr de la fin de la dernière charge utile et du démarrage de la nouvelle charge utile?

L'état inactif d'un bus RS232 est -12V.Comment le récepteur saura-t-il qu'il doit recevoir un flux de 0 ou quand la transmission doit commencer?

Une telle communication série est également asynchrone.Le récepteur a besoin de voir un bord pour déterminer les aspects de la transmission

* "Comment le récepteur peut-il être sûr de la fin de la dernière charge utile et du démarrage de la nouvelle charge utile?" * N'y a-t-il pas un accord sur la taille de la charge utile, par exemple chaque charge utile est de 8 bits?
@Tom vrai, je voulais juste souligner le point.Comme "Over" dans la radio 2 voies
-1
@Tom Carpenter * "mais comment le récepteur sait-il où commence la charge utile" * Il saura quand il sentira que la tension a changé (désolé je ne sais rien sur l'électricité, donc je ne sais pas si une telle chose existecomme * "sens que la tension a changé" *).
Pour qu'il détecte que la tension a changé, la tension doit changer.Considérez que la ligne tourne au ralenti comme un «1».Disons maintenant que le premier bit de la charge utile 8 bits est un «1».Comment le récepteur détecte-t-il que la tension est passée de «1» à «1» (indice: il ne peut pas).Pour garantir qu'il y a un changement de tension pour qu'il détecte, UART utilise un 1 à la fin (bit d'arrêt) et un 0 au début (bit de démarrage).Vous avez maintenant une transition 1> 0 garantie chaque fois qu'un paquet démarre.
@Tom il a encore besoin de se synchroniser.L'horloge n'est pas transmise dans toutes les communications série (pour certains types, elle est codée dans la transmission, codage Manchester).
@Tom Carpenter Que faire si le ralenti est de 10 V, il peut maintenant détecter quand la tension change (à + 15 V ou -15 V).
@Tom, mais vous n'avez plus de système de signalisation binaire, ce qui dans le cas de UART n'est pas la façon dont il a été conçu.Considérez également que sur une distance, le signal s'atténuera, donc si l'émetteur peut envoyer + 15V, le récepteur peut ne recevoir que + 10V.
RS232 a une plage de tension de + 3V à + 15V pour un "0" et de -3V à -15V pour un "1".tout changement de tension dans cette plage qui ne bascule pas n'est pas traité comme un bord
Le seuil binaire réel est de 1,3 à 1,5 V identique à TTL.
@Tony: De quel seuil de spécification faites-vous référence?
Les spécifications Vth pour toutes les puces RS232 et les familles TTL, normalement non données comme telles, mais je le sais par expérience.Vous pouvez également le dériver de Avg of Vil, Vih
old_timer
2017-10-22 08:18:42 UTC
view on stackexchange narkive permalink

Vous confondez les niveaux de tension (RS-232 nous supposons) et le protocole série (disons simplement uart comme il venait d'une époque où tout le monde était obsédé par le nom des choses).

En utilisant votre exemple, vous ne pouvez pas distinguer 0110 de 001100 par exemple. Avec le protocole uart, vous devez échantillonner idéalement le milieu de la cellule binaire, afin que le récepteur sache où se trouve le milieu, étant sur différentes sources de temps et pas exactement le même, le premier bord de l'inactivité vous donne une référence pour pouvoir pour atteindre le milieu des N bits suivants, la taille de N dépend de la précision de chaque côté, environ 8 bits de données, vous pouvez être assez bâclé, et si vous le souhaitez, vous pouvez resynchroniser sur tous les bords que vous trouvez (dans votre exemple comment recevriez-vous 00000000? ou 11111111?)

Le bit de départ nous donne une arête à distinguer du ralenti, à savoir quand le message commence et une référence pour échantillonner les bits. Le bit d'arrêt garantit que nous retournons au ralenti au moins pour une cellule de bit ou deux. Lorsqu'il est saturé de données, pas de lacunes, pas d'inactivité autre que le bit d'arrêt, alors vous avez un autre problème que le protocole uart ne résout pas nécessairement (bien la parité aide) si vous entrez au milieu (quelqu'un se branche alors que les données se déplacent , ou pour toute autre raison) les bits de démarrage et d'arrêt aident à encadrer les données sans parité, vous pourrez peut-être encore déterminer où vous êtes, avec la parité, vous avez une chance encore meilleure mais pas parfaite.

Il existe maintenant d'autres protocoles. De nombreux autres protocoles. allez chercher irig-106, au lieu d'un bit de départ, vous avez un motif de synchronisation qui peut être suivi de centaines de bits avant un autre motif, pas de périodes mortes. Le document irig a un joli graphique de divers encodages où NRZ-L est ce à quoi nous sommes habitués avec un simple uart (non retour au niveau zéro) un intéressant est bi-phase-l où il y a une cellule de changement d'état au milieu du bit donc votre 0110 serait transmis à 2x la fréquence des données et serait 01101001, dans le pire des cas, vous ne pouvez jamais avoir plus de deux demi-cellules de bits d'affilée au même niveau, de nombreux bords avec lesquels la synchronisation des bits.

Un autre intéressant est mil-std-1553, où ils utilisent bi-phase-L (qui est un encodage populaire avec de nombreux noms différents juste biphase ou manchester, etc.) mais ce ne sont pas des données continues, c'est une rafale de un à plusieurs mots. ils utilisent une erreur biphase-1 intentionnelle de trois demi-cellules binaires et trois demi-cellules binaires comme motif de synchronisation puis entrent dans le message codé en biphase-l.

Aucune raison pour laquelle vous ne pourriez pas utiliser les niveaux de tension RS-232, RS-422, etc. avec un protocole différent de uart. Mais vous avez toujours besoin de bords de temps en temps dans les données afin de synchroniser les horloges (si vous transportez l'horloge, alors c'est une autre histoire) et vous avez besoin d'un moyen de savoir où se trouvent les groupes de bits qui font des octets ou des mots. vous devez donc avoir un motif de synchronisation ou un bit de démarrage ou autre. ou faites quelque chose comme spi ou i2c pour marquer le début. ethernet classique utilisait une longue onde carrée avec quelques bits pour indiquer la fin et le début du paquet. MDIO a quelque chose de similaire.

À la fin de la journée, vous ne pouvez pas avoir un protocole série à signal unique fiable sans un moyen de savoir où se trouvent les limites mot / message dans le flux binaire, de même que vous ne pouvez pas le faire sans savoir où / quand échantillonner pour chaque bit.Même si un train de bits continu et peut-être vous pensez que vous saviez quand le temps zéro était et que vous pouvez simplement compter jusqu'à 8 et marquer un autre octet, vous pourriez avoir de la chance, mais vous devez toujours vous synchroniser avec l'horloge d'envoi car votre horloge est basée sur un autreréférence et dérivera par rapport à l'horloge de l'expéditeur.Vous pouvez donc essayer de réussir à condition de regarder périodiquement les arêtes que vous trouvez et de vous assurer qu'il y a une arête tous les N bits en fonction des mathématiques liées à la précision des horloges.



Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 3.0 sous laquelle il est distribué.
Continuer la lecture sur narkive:
Loading...