Quelle est la différence entre Serial.write et Serial.print? Et quand sont-ils utilisés?

26

Quelle est la différence entre Serial.write et Serial.print? Et quand sont-ils utilisés?
Les deux ont été utilisés pour imprimer sur un moniteur série, quelles sont leurs différences réelles?

shadab
la source
Excellente explication bpinhosilva! Vous m'avez aidé à comprendre quelque chose avec lequel je me débattais très clairement maintenant.
Rory

Réponses:

19

Depuis le site Arduino pour Serial.write et Serial.print :

Serial.write ()

Écrit des données binaires sur le port série. Ces données sont envoyées sous la forme d'un octet ou d'une série d'octets; pour envoyer les caractères représentant les chiffres d'un nombre, utilisez plutôt la fonction print ().

Serial.print ()

Imprime les données sur le port série sous forme de texte ASCII lisible par l'homme.

LoganBlades
la source
17

Serial.write est plus terre à terre, c'est simple et rapide, il est fait pour parler binaire, un octet à la fois. Exemple:

Serial.write(0x45);   // will write 0100 0101 to the cable

Serial.print d'autre part est plus polyvalent, il fera la conversion pour vous de ASCII en binaire, il peut également convertir en BIN / HEX / OCT / DEC mais vous devez spécifier un deuxième argument comme ça

Serial.print(76, BIN) gives "0100 1100"
Serial.print(76, OCT) gives "114"
Serial.print("L", DEC) gives "76"
Serial.print(76, HEX) gives "4C" 

plus d'exemples avec sortie série visuelle:

Code:

  Serial.write(0x48);   // H
  Serial.write(0x45);   // E
  Serial.write(0x4C);   // L
  Serial.write(0x4C);   // L
  Serial.write(0x4F);   // O

SORTIE EN SÉRIE: entrez la description de l'image ici

Code:

  Serial.print("HELLO");

SORTIE EN SÉRIE: entrez la description de l'image ici

Serial.println () d'autre part va ajouter la fin de la ligne 2 octets 0x0D et 0x0A comme vous pouvez le voir dans le cadre

Code:

  Serial.println("HELLO");

SORTIE EN SÉRIE:

entrez la description de l'image ici

Nassim
la source
7

Serial.writeenvoie des octets au port série tout en Serial.printenvoie des caractères ASCII pour que les gens puissent lire facilement.

Certains appareils fonctionnent à l'aide d'octets pour définir des configurations, utilisent généralement des paquets de données et vous devez utiliser la fonction d'écriture pour communiquer avec eux. Finalement, ils enverront des octets via l'interface série, puis vous pourrez interpréter en parcourant chaque octet.

bpinhosilva
la source
5

Tous les exemples ci-dessus sont corrects, mais peut-être plus clairement .... Toutes les données envoyées via le port série sont envoyées sous forme de 1 et de 0. (évident .... j'espère) ... La différence entre les deux commandes est de savoir comment tout ce qui est envoyé est réellement traduit / interprété vers / depuis ces 1 et 0. L'exemple le plus clair concerne la transmission de nombres.

Disons que vous devez envoyer le nombre 217. La représentation binaire (1 et 0) de ce nombre est 11011001. L'utilisation de la commande Serial.write(217)enverra littéralement 11011001 sur toute la ligne. La représentation hexadécimale du même nombre est 0xD9, et la commande Serial.write(0xD9)enverra la même chose ... 11011001.

Voici où cela devient intéressant ... Si vous Serial.write("217")utilisiez la commande, vous obtiendriez plutôt ceci: 00110010 00110001 00110111 ... QUOI?!?!?
Lorsqu'une chaîne est passée comme argument, elle est décomposée en caractères individuels, convertie en ASCII, puis envoyée sous forme d'octet pour chaque caractère. Vous obtiendriez exactement la même sortie si vous utilisiez ce qui suit:

Serial.write(50);
Serial.write(51);
Serial.write(55);

(00110010 00110001 00110111)

Voyons maintenant Serial.print(). Les commandes Serial.print(217)ou Serial.print("217")imprimeront toutes les deux la même chose: 00110010 00110001 00110111. En effet, la commande d'impression convertit d'abord n'importe quel nombre en une représentation sous forme de chaîne, puis utilise la commande Serial.write()pour envoyer chaque caractère sous forme de bits ASCII individuels.

Bien que ce ne soit pas une description COMPLÈTE, j'espère que cela vous aidera à réfléchir dans la bonne direction ...

Jerimiah
la source
3

Encore une autre façon de répondre à cela est d'indiquer que Serial.write accepte des caractères uniques alors que Serial.print accepte les chaînes. Il peut y avoir quelques différences mais c'est la principale.

linhartr22
la source