Question:
Est-il OK pour Serial.print (message), lorsque le câble USB n'est pas connecté à un PC hôte?
David Cary
2016-02-21 02:09:09 UTC
view on stackexchange narkive permalink

Souvent, je mets un tas de Serial.print (F ("debugging messages")) dans mon croquis Arduino.

Normalement, ces messages remontent d'un câble USB à un PC hôte afin que ces messages puissent être vus sur le moniteur série.

Je souhaite installer cet Arduino dans le cadre d'un système autonome loin de tout PC et brancher l'extrémité "hôte" du câble USB dans un chargeur USB de verrue murale.

Sans quoi que ce soit pour accepter ces messages, la mémoire tampon de l'Arduino finit par se remplir, n'est-ce pas? Dois-je faire quelque chose pour empêcher l'Arduino de déborder et de planter lorsqu'il n'est pas connecté à un PC hôte?

Est-ce que ça fait une différence si j'utilise un (1) "single-chip" compatible Arduino où le processeur inclut USB sur puce, contre (2) un Arduino -compatible avec une "puce d'interface USB" et une "puce de processeur" séparées? (Par "compatible Arduino mono-puce", je veux dire des choses comme l'Arduino Leonardo, Arduino Yún, LilyPad Arduino USB, Arduino Micro, le Teensy-LC, etc. .)

Un répondre:
BrettAM
2016-02-21 02:41:43 UTC
view on stackexchange narkive permalink

Il est possible d'écrire des données série sans rien de connecté.

Dans le cas (2) "Puce d'interface Arduino + USB", l'arduino n'a aucune idée si quelque chose est connecté ou écoute le port série . Le code transmettra les octets et agira exactement de la même manière, qu'il soit branché sur quoi que ce soit ou non.

Dans le cas (1) "arduino avec USB intégré", il a une idée, mais laisse tomber les octets qui vont à transmettre lorsque le port USB n'est pas connecté.

Le matériel série (cas 2) a un tampon de sortie, mais cela rend juste le programme un peu plus rapide. Lorsque le tampon est vide, un appel à serial. {Print, write} placera des octets dans le tampon et passera à autre chose. Lorsqu'il est plein, Serial. {Print, write} attendra qu'il y ait suffisamment de place pour mettre le reste du message dans la mémoire tampon et continuer. L'UART matériel et les interruptions qu'il génère continueront à extraire des octets du tampon et à les transmettre à un débit constant, que quelque chose soit branché ou non. Dans tous les cas, le tampon a une taille fixe et ne débordera jamais.

Pour autant que je sache, USB-Serial (cas 1) ne met en mémoire tampon que les données entrantes. Comme les appels à Serial. {Print, write} ne font rien lorsqu'ils ne sont pas connectés, ils peuvent prendre moins de temps qu'ils ne le feraient autrement. Si votre code n'est vraiment pas sûr sur le timing, cela pourrait poser un problème, mais je doute que ce soit le cas.

De nombreux exemples fournis avec l'IDE Arduino contiennent le bit de code suivant qui met en pause les compatibles USB natifs Arduino jusqu'à la connexion USB est initialisée:

  while (! Serial) {; // attend que le port série se connecte. Nécessaire uniquement pour le port USB natif}  

Ce code empêche l'Arduino de faire quoi que ce soit jusqu'à ce que le câble USB soit connecté. Remémorez ou supprimez ces 3 lignes si vous voulez que l'Arduino fonctionne "stand- seul "sans connexion par câble USB ( Arduino Cookbook p. 117) - après avoir supprimé ces lignes, si vous branchez plus tard un câble USB, l'USB s'initialise correctement, et alors vous verrez sur votre moniteur série tout ce qui est imprimé par n'importe quel plus tard Série Commandes .print () qui s'exécutent. (Testé sur un Teensy LC).

`Quand il est plein, Serial. {Print, write} attendra` - pour clarifier, il se remplit à cause de la vitesse (c'est-à-dire que vous imprimez trop vite) pas parce qu'il n'y a rien de connecté.
Dans le cas (1), lorsque vous dites «abandonne les octets qui vont être transmis lorsque le port USB n'est pas connecté», voulez-vous dire qu'il les transmet (peut-être en rien) via le TX matériel?
Désolé, @NickGammon, mais il me semble que, au moins sur une carte basée sur Leonardo (avec prise en charge USB dans le processeur), si je télécharge un croquis assez complexe avec beaucoup de Serial.print (testé à la fois à 9600 et 115200), je voir que: 1) si j'allume la carte, avec un USB externe connecté à un PC; tout fonctionne parfaitement. Et fonctionne toujours si je "déconnecte" le câble; 2) si j'allume la carte _SANS_ aucun câble connecté, la carte n'entre jamais même dans la boucle principale ()! - Il me semble que lorsque le tampon "se remplit", tout se bloque. Est-ce un comportement attendu (... que je devrais contourner au niveau de l'application)?
Les croquis avec les puces de style Leonardo avec USB embarqué ont souvent une boucle dans la configuration: `while (! Serial.available ()) {}` qui boucle indéfiniment jusqu'à ce que la connexion série soit établie via l'USB. Ce sera cette boucle qui fera apparaître son blocage. Sur les autres cartes qui appellent les retours immédiatement et toutes les données envoyées disparaissent simplement "au bout du fil" si rien n'est branché. Vous pouvez toujours faire sortir cette boucle après (disons) 10 000 itérations, ou après quelques secondes. .


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é.
Loading...