Qu'est-ce que Serial.begin (9600)?

22

Je sais que c'est pour initialiser quelque chose:

Serial.begin(9600);

Mais je veux savoir ce que cela signifie vraiment?

shajib0o
la source
3
La documentation en a une bonne description. arduino.cc/en/Serial/begin
sachleen

Réponses:

22

Serial.begin(9600)n'imprime rien. Pour cela, vous souhaitez utiliser Serial.print("Hello world!")pour imprimer le texte "Bonjour tout le monde!" à la console série. Il initialise plutôt la connexion série à 9600 bits par seconde.

Les deux côtés de la connexion série (c'est-à-dire l'Arduino et votre ordinateur) doivent être configurés pour utiliser la même connexion série à vitesse afin d'obtenir toute sorte de données intelligibles. S'il y a un décalage entre ce que les deux systèmes pensent de la vitesse, les données seront tronquées.

9600 bits par seconde est la valeur par défaut pour l'Arduino, et est parfaitement adapté à la majorité des utilisateurs, mais vous pouvez le changer à d'autres vitesses: Serial.begin(57600)définirait l'Arduino pour transmettre à 57600 bits par seconde. Vous devez définir le logiciel que vous utilisez sur votre ordinateur (comme le moniteur série de l'Arduino IDE) à la même vitesse afin de voir les données envoyées.

heypete
la source
2
Baud et BPS sont deux choses différentes ... je ne trouve pas le lien que je cherchais maintenant.
Pingouin anonyme
et si je mets "Serial.begin (0);" ou "Serial.begin (4000);". Je veux dire que je veux savoir quelle est la différence entre les chiffres?
shajib0o
3
Serial.begin est utilisé pour définir la vitesse de communication, en bits par seconde. Un octet est égal à 8 bits, mais les connexions série envoient un bit de démarrage et d'arrêt pour identifier le début et la fin d'un octet particulier au système récepteur. Ainsi, 10 bits sont nécessaires pour envoyer un caractère. L'utilisation Serial.begin(0)indique à l'Arduino qu'il doit communiquer avec la série à 0 bits par seconde. Comme vous pouvez vous y attendre, cela signifie que l'Arduino n'enverra jamais de données du tout. Serial.begin(4000)entraînera l'Arduino à envoyer des données à 4000 bits par seconde. Ce n'est pas standard, mais sinon c'est bien.
heypete
2
En bref: changer le nombre change la vitesse. En réduisant le nombre (par exemple Serial.begin(300)), l'Arduino envoie les données plus lentement. L'augmenter, disons que 57600 enverra des données plus rapidement. Le système d'envoi et le système de réception doivent tous deux s'entendre sur la vitesse à utiliser: le programme série de votre ordinateur, comme la fenêtre Arduino Serial Monitor, vous permettra de définir la vitesse à laquelle votre ordinateur recevra les données, mais vous ne pouvez sélectionner vitesses: 300, 1200, 2400, 4800, 9600, 19200, 38400, 57600 et 11520 bit / sec. Vous ne pouvez pas entrer dans d'autres vitesses, comme 4000. 9600 est généralement bon.
heypete
Baud and BPS are two different things... can't find the link I was looking for now.- Voici une explication: Annexe C: "baud" vs "bps"
Nick Gammon
21

Une image vaut 1000 mots, alors ils disent, (1024 mots si vous travaillez avec des ordinateurs) donc je vais poster quelques photos ...

J'ai configuré mon Uno pour envoyer "Fab" à 9600 bauds et capturé les résultats sur un analyseur logique.

Communications série - 3 lettres

Les parties grisées en rouge correspondent à la période "inactive" entre les octets.

D'après le graphique ci-dessus, notez que la ligne de données Tx (émission) est normalement élevée (1) jusqu'à ce qu'elle descende bas pour indiquer le début d'un caractère (octet). Ceci est le bit de départ . Ensuite, les 8 bits de données (indiqués par des points blancs) apparaissent à la vitesse de transmission (9600 échantillons par seconde). Après cela, la ligne est de nouveau élevée. Il s'agit du bit d'arrêt (la partie rouge). Ensuite, nous voyons le bit de départ pour le caractère suivant, et ainsi de suite. La partie "stop" peut être indéfiniment longue, mais elle doit être d'au moins une longueur de bit.


Plus de détails pour le premier caractère (la lettre "F" ou 0x46 ou 0b01000110) peuvent être vus ici:

Communications série - un seul octet

  • A - pas de données (Tx est élevé)

  • B - Le "bit de départ". La ligne est prise bas pour indiquer au récepteur qu'un caractère (octet) commence à être envoyé. Le récepteur attend une heure et demie avant d'échantillonner la ligne.

  • C - Le premier caractère arrive (la lettre "F" ou 0x46 ou 0b01000110). Il n'y a pas de bit d'horloge en tant que tel, les données entrantes sont simplement échantillonnées à la vitesse de transmission (transmission). Contrairement à la communication SPI, les données arrivent en premier sur le bit le moins significatif (au cas où vous n'enverriez pas 8 bits par octet). Ainsi, nous voyons 01100010 (plutôt que 01000110).

  • D - Le bit d'arrêt. Cette valeur est toujours élevée, pour garantir que nous pouvons faire la distinction entre la fin de cet octet et le début du suivant. Puisque le bit de début est un zéro et le bit d'arrêt est un, il y a toujours une transition claire d'un octet au suivant.

  • E - Le bit de départ pour le caractère suivant.


Vous pouvez voir à partir de la capture de l'analyseur logique qui T1 - T2est de 0,1041667 ms, et en l'occurrence, c'est 1/9600:

1 / 9600 = 0.00010416666 seconds

Ainsi, le taux de 9600 vous donne le nombre de bits par seconde et l'inverse est l' intervalle de temps entre les bits .


Autres considérations

  • Les communications série ne sont pas auto-synchronisées (contrairement à SPI ou I2C et autres), donc l'expéditeur et le récepteur doivent s'entendre sur une fréquence d'horloge.

  • La fréquence d'horloge n'est pas exacte sur l'Arduino, car le matériel doit diviser l'horloge système pour obtenir une horloge série, et la division n'est pas toujours exacte. Il y a presque toujours une erreur, le montant est indiqué dans la fiche technique (chiffres cités pour une horloge système 16 MHz, comme sur l'Uno):

    Erreur de débit en bauds série

  • Vous pouvez varier le nombre de bits de données, vous n'avez pas à en envoyer 8, en fait vous pouvez envoyer 5 à 9 bits.

  • Il peut éventuellement y avoir un bit de parité envoyé après les bits de données.

    • Si vous spécifiez la parité "impaire", le bit de parité est défini de telle manière que le nombre total de 1 bits est impair.
    • Si vous spécifiez la parité "paire", le bit de parité est défini de telle sorte que le nombre total de 1 bits soit pair.
    • Si vous ne spécifiez aucune parité, le bit de parité est omis.

    Cela peut aider le récepteur à détecter si les données sont arrivées correctement ou non.

  • Le bit de parité est envoyé avant le bit d'arrêt.

  • Dans le cas de 9 bits de données (tels qu'utilisés dans le protocole SeaTalk), le bit de parité est redéfini comme 9e bit de données. Par conséquent, vous ne pouvez pas avoir à la fois 9 bits de données et un bit de parité.

  • Vous pouvez également avoir deux bits d'arrêt. Cela rallonge simplement le temps entre les octets. Dans les temps anciens, c'était pour que les équipements électromécaniques lents puissent traiter l'octet précédent (par exemple pour l'imprimer).


Corruption possible

Si vous commencez à écouter des données série au milieu d'un flux, il est tout à fait possible qu'un 0 bit au milieu du flux soit interprété comme un bit de démarrage, puis le récepteur interprétera tout par la suite de manière incorrecte.

Le seul moyen réel de s'en remettre est d'avoir un espace suffisamment grand, de temps en temps, (par exemple 10 bits de long) pour que cela ne puisse pas se produire.


Logique inversée

Les bits représentés ici (niveau logique) ne sont pas inversés. C'est-à-dire qu'un bit 1 est HAUT et un bit 0 est BAS. Si vous avez un équipement RS232 qui enverra probablement quelque chose comme -12 V pour 1 bit et +12 V pour 0 bit. Ceci est inversé car un est inférieur à zéro, en termes de tension.

Si vous avez de tels appareils, vous devez effectuer une conversion de tension et une inversion logique. Des puces comme le MAX232 feront les deux pour vous. Ils peuvent également fournir les -12 V nécessaires pour piloter un tel équipement en le générant en interne à l'aide de quelques condensateurs fournis par l'utilisateur.


Règle générale de vitesse

Puisque, avec un bit de début, 8 bits de données et un bit d'arrêt, nous avons un total de 10 bits, en règle générale, vous pouvez calculer le nombre d' octets vous pouvez transmettre en une seconde en divisant le débit binaire par 10 .

Par exemple. À 9600 BPS, vous pouvez envoyer 960 octets par seconde.


Code à reproduire:

void setup() 
  { 
  Serial.begin(9600); 
  Serial.print("Fab"); 
  } 

void loop ()
  {
  }
Nick Gammon
la source
1

; TLDR; Il initialise le port de communication série et définit le débit en bauds. L'appareil avec lequel vous communiquez (ou Arduino IDE Serial Monitor) doit être réglé sur une vitesse de transmission correspondante. Une fois que vous avez initialisé le port, vous pouvez commencer à envoyer ou recevoir des caractères. Référence série Arduino

linhartr22
la source
Ne pas diminuer ou manquer de respect à l'excellente couverture de Nick-Gammon sur ce sujet.
linhartr22