Spørgsmål:
Er det OK at Serial.print (meddelelse), når USB-kablet ikke er tilsluttet en værts-pc?
David Cary
2016-02-21 02:09:09 UTC
view on stackexchange narkive permalink

Ofte lægger jeg en masse Serial.print (F ("debugging messages")) i min Arduino-skitse.

Normalt går disse meddelelser op med et USB-kabel til en værts-pc, så disse meddelelser kan ses på den serielle skærm.

Jeg vil installere denne Arduino som en del af et enkeltstående system langt fra enhver pc og sæt USB-kablet "vært" i USB-kablet i en væg-vorte USB-oplader.

Uden noget at acceptere disse beskeder, fyldes bufferen på Arduino til sidst op, ikke? Har jeg brug for at gøre noget for at forhindre Arduino i at løbe over og gå ned, når den ikke er tilsluttet til en værts-pc?

Gør det nogen forskel, hvis jeg bruger en (1) "single-chip" Arduino-kompatibel, hvor processoren inkluderer on-chip USB, versus (2) en Arduino -kompatibel med separat "USB interface chip" og "processor chip"? (Med "single-chip Arduino-kompatibel" mener jeg ting som Arduino Leonardo, Arduino Yún, LilyPad Arduino USB, Arduino Micro, Teensy-LC osv. .)

En svar:
BrettAM
2016-02-21 02:41:43 UTC
view on stackexchange narkive permalink

Det er OK at skrive serielle data uden noget tilsluttet.

I tilfælde (2) "Arduino + USB-interface-chip", har arduino ingen idé om noget er tilsluttet eller lytter til den serielle port . Koden transmitterer byte og fungerer nøjagtigt den samme, uanset om den er tilsluttet til noget eller ej.

I tilfælde (1) "arduino med indbygget USB" har den en idé, men bare dropper bytes, der går skal sendes, når USB-porten ikke er tilsluttet.

Hardwareserie (sag 2) har en outputbuffer, men det gør bare programmet lidt hurtigere. Når bufferen er tom, placerer et opkald til seriel. {Print, skriv} bytes i bufferen og fortsætter. Når den er fuld, Seriel. {Udskriv, skriv} venter, indtil der er plads nok til at lægge resten af ​​meddelelsen i bufferen og gå videre. Hardware-UART og afbrydelser, den genererer, fortsætter med at tage bytes ud af bufferen og transmittere dem med en konstant hastighed, uanset om noget er tilsluttet eller ej. Under alle omstændigheder er bufferen i en fast størrelse og vil aldrig løbe over.

Så vidt jeg kan fortælle, at USB-Serial (sag 1) kun buffrer indgående data. Da opkaldene til Serial. {Print, skriv} ikke gør noget, når de ikke er tilsluttet, kan det tage kortere tid, end de ellers ville have gjort. Hvis din kode virkelig er usikker med hensyn til timing, kan det forårsage et problem, men jeg tvivler på, at det vil.

Mange eksempler, der følger med Arduino IDE, har følgende kode kode, der stopper native USB Arduino-kompatible indtil USB-forbindelsen initialiseres:

  mens (! Serial) {; // vent på, at seriel port opretter forbindelse. Kun nødvendigt til native USB-port}  

Denne kode forhindrer Arduino i at gøre noget, indtil USB-kablet er tilsluttet. Kommenter eller slet disse 3 linjer, hvis du vil have Arduino til at køre "stand- alene "uden USB-kabelforbindelse ( Arduino Cookbook s. 117) - efter at du har slettet disse linjer, hvis du senere tilslutter et USB-kabel, initialiseres USB korrekt, og derefter vil du se alt på din serielle skærm, der er udskrevet af enhver senere Serial .print () kommandoer, der kører. (Testet på en Teensy LC).

"Når den er fuld, seriel. {Udskriv, skriv} venter" - for at afklare, fyldes den op på grund af hastighed (dvs. du udskriver for hurtigt) ikke fordi der ikke er noget forbundet.
I tilfælde (1), når du siger "drop bytes, der skal transmitteres, når USB-porten ikke er tilsluttet", mener du, at den sender dem (måske til ingenting) gennem hardware TX?
Undskyld, @NickGammon,, men det ser ud til, at jeg i det mindste på et Leonardo-baseret kort (med in-CPU USB-understøttelse) uploader en ret kompleks skitse med masser af Serial.print (testet på både 9600 og 115200), se at: 1) hvis jeg tænder for kortet med ekstern USB tilsluttet en pc; alt fungerer perfekt. Og fungerer stadig, hvis jeg "afbryder" kablet; 2) hvis jeg tænder for kortet _ UDEN_ ethvert tilsluttet kabel, går kortet aldrig ind i hovedsløjfen ()! - Det ser ud til, at alt hænger, når buffer "fyldes". Er dette en forventet adfærd (... som jeg skal omgå på app-niveau)?
Skitser med Leonardo-stilchips med indbygget USB har ofte en loop i opsætningen: `while (! Serial.available ()) {}` som løkker på ubestemt tid, indtil den serielle forbindelse oprettes via USB. Det vil være denne sløjfe, der får det til at se ud til at hænge. På de andre tavler, der ringer, vender straks tilbage, og alle sendte data forsvinder bare "fra enden af ​​ledningen", hvis der ikke er tilsluttet noget. Du kan altid få den løkke til at gå ud efter (siger) 10.000 iterationer eller efter et par sekunder er gået .


Denne spørgsmål og svar blev automatisk oversat fra det engelske sprog.Det originale indhold er tilgængeligt på stackexchange, som vi takker for den cc by-sa 3.0-licens, den distribueres under.
Loading...