Éviter la confusion entre aucune entrée et un zéro en binaire?

10

Supposons que je transmets des données par FM où 0 est 2Hz et 1 est 4Hz. L'émetteur transmet 2 Hz lorsqu'il n'y a pas d'entrée. Si j'alimentais le binaire reçu sur un port UART d'un microcontrôleur, comment le microcontrôleur ferait-il la différence entre aucune donnée et 0?

Cela devient pertinent lors de la transmission de caractères ASCII par exemple. Supposons la chaîne suivante:

01000110 01101111 01101111 01100010 01100001 01110010

Parce que j'ai ajouté des espaces, nous pourrions traduire cela en:

Foobar

Mais pour une machine, la chaîne ressemblerait à ceci:

010001100110111101101111011000100110000101110010

Comment créeriez-vous ces "espaces" pour ne pas gâcher les caractères ASCII lorsque vous recevez du binaire?

Allenph
la source
5
Voici comment UART le résout, lien . Arrêtez et démarrez les bits, car zou les envoie à un port UART zou devrait également les transmettre.
Bence Kaulics
J'ai bien peur de ne pas bien comprendre votre diagramme. Il semble que le "bit de départ" soit simplement nul, ce qui renforce mon problème. Par exemple, comment connaîtrait-il la différence entre 01111000 et 00111100 si la chaîne était 000 01111000 000?
Allenph
2
@Allenph, lorsque vous n'envoyez pas le bus est inactif et il est maintenu dans un état logiquement élevé. Lorsque vous démarrez la transmission d'un paquet, le premier bit est toujours logiquement bas. Ceci est le bit de départ. Suit ensuite huit bits de données puis un bit d'arrêt qui est logiquement élevé. Le microprocesseur sait quand le bit suivant arrive car il connaît la vitesse du bus que vous avez configurée. Le microprocesseur et l'unité transmettant au microprocesseur doivent être configurés avec la même vitesse de transmission.
Mattias Johansson

Réponses:

16

Si vous alimentez quelque chose vers un port UART d'un microprocesseur, vous devez suivre le protocole de communication UART si vous voulez que le microprocesseur comprenne ce que vous l'alimentez. Vous devez incorporer chaque caractère ASCI dans un package UART qui contient un bit de début, un bit d'arrêt et éventuellement un bit de parité, beaucoup plus d'informations sont disponibles sur la page Wikipedia UART .

Lorsque vous n'envoyez pas le bus est inactif et il est maintenu dans un état logiquement élevé. Lorsque vous démarrez la transmission d'un paquet, le premier bit est toujours logiquement bas. Ceci est le bit de départ. Suit ensuite huit bits de données puis un bit d'arrêt qui est logiquement élevé. Le microprocesseur sait quand le bit suivant arrive car il connaît la vitesse du bus que vous avez configurée. Par conséquent, il est possible de transmettre par exemple deux zéros côte à côte. Le microprocesseur et l'unité transmettant au microprocesseur doivent être configurés avec la même vitesse de transmission, la même parité et le même nombre de bits d'arrêt.

Mattias Johansson
la source
2
Un point clé est que le nombre configuré de bits d'arrêt est un minimum, pas un maximum. L'état inactif de la ligne série asynchrone est un bit d'arrêt étendu. Donc, si la radio doit tourner au ralenti à 0, la réponse facile est d'inverser la sortie UART avant de conduire la radio avec elle afin qu'elle tourne au ralenti à 0, et 1 est un début. Inversez ensuite les données reçues avant de les manipuler avec un UART.
RBerteig
6

Il existe de nombreuses techniques pour cela. Vous voudrez peut-être regarder le codage Manchester ou les codes NRZ. Ou le codage 8b / 10b , qui mappe tous les 8 bits de données à une séquence de 10 bits qui permet la récupération d'horloge, la correction d'erreurs et les symboles spéciaux "virgule" qui peuvent être utilisés pour détecter le début et la fin d'une transmission.

pjc50
la source
5

Tous les caractères ASCII ont une largeur de 8 bits, vous pouvez le voir dans un tableau ASCII. Les valeurs HEX des caractères ASCII ne dépassent pas FF (1111 1111)

UART ne peut pas recevoir plus d'un octet de données (8 bits) à la fois, également à côté de ces données 8 bits, il y a des bits STOP et START, PARITY et quelques autres, que vous pouvez voir sur l'image ci-dessous et qui forment ensemble le paquet de communication UART.

entrez la description de l'image ici

Ainsi, lorsque vous envoyez des caractères ASCII à UART, vous les envoyez un par un, et c'est ainsi que la chaîne est créée. Vous savez déjà que la chaîne n'est qu'un tableau de caractères.

Lazar
la source
4
ascii est 7 bits, pas 8, mais il est courant de le mettre dans une morsure 8 bits pour rendre l'alignement trivial. Il permet également d'autres jeux de caractères et utf8.
hildred
0

Le protocole UART, comme Mattias l'a expliqué, est un protocole asynchrone basé sur le temps. Ce qui définit les limites entre les bits est le temps pris depuis le début du bit de départ. Ainsi, le microcontrôleur "échantillonnera" le bit (N+half)/baudratesecondes après le début du bit de démarrage. Le demi-bit est juste pour échantillonner au milieu des bits afin qu'il puisse y avoir une différence d'un demi-bit dans le timing entre le récepteur et l'émetteur (rappelez-vous que les différences sont cumulatives et que le pire des cas se produit dans le dernier bit de chaque trame, qui est généralement, mais pas toujours, 8 bits de large, selon la configuration). La clé pour le faire fonctionner est d'avoir le récepteur et l'émetteur-récepteur avec des vitesses de transmission aussi proches que possible.

Ainsi, le microcontrôleur compte le temps entre chaque bit pour savoir où chaque bit se trouve dans une trame. Le personnage suivant ira dans le cadre suivant. Lorsque chaque trame se termine, le microcontrôleur commence à écouter automatiquement la trame suivante, donc lorsque le bit de démarrage suivant arrive, il sait déjà qu'il doit démarrer une nouvelle trame. Voilà comment les personnages sont séparés.

De plus, j'ajouterai que vous n'avez pas réellement besoin de deux fréquences pour transmettre à un microcontrôleur récepteur UART. Vous pouvez utiliser une seule fréquence comme OOK au lieu de deux fréquences comme FSK . Il a une efficacité spectrale plus élevée et les circuits sont beaucoup plus simples, car vous n'avez besoin que d'un commutateur d'ondes porteuses comme émetteur et d'un détecteur à fréquence unique comme récepteur, un peu comme le code morse. N'oubliez pas d'utiliser généralement des porteuses dont les fréquences sont beaucoup plus élevées que la vitesse de transmission, sinon les circuits plus simples ne fonctionneront pas correctement.

Ronan Paixão
la source