Vraag:
Hoe detecteert deze coderegel of er een seriële interface is aangesloten?
Cybergibbons
2014-02-26 04:48:32 UTC
view on stackexchange narkive permalink

Ik werk met een code voor externe temperatuursensorknooppunten. Ze schakelen de debug-interface aan en uit, afhankelijk van of er iets is aangesloten op de seriële poort of niet.

De code staat hier op Github. Regel 111 is de gewenste regel:

  if (Serial) debug = 1; anders debug = 0; // als seriële UART naar USB is aangesloten, toon debug O / P.  

Dus, een simpele vraag: op hardware- en softwareniveau, hoe werkt dit? Ik zie niets in HardwareSerial of Stream dat true / false zou retourneren als er iets was aangesloten of niet.

Merk op dat ik er niet zeker van ben dat het echt werkt. Deze eenvoudige test geeft aan dat het niet werkt omdat de LED knippert, ongeacht de aanwezigheid van een seriële adapter of verbinding:

  boolean debug; const int toggle = 6; void setup () {if ( Serieel) debug = 1; anders debug = 0; pinMode (schakelen, OUTPUT); digitalWrite (toggle, LOW); if (debug) {Serial.begin (9600); Serial.println ("Setup"); digitalWrite (schakelen, HIGH); vertraging (1000); digitalWrite (toggle, LOW); }} void loop () {if (debug) {Serial.println ("Loop"); digitalWrite (schakelen, HIGH); vertraging (1000); digitalWrite (toggle, LOW); vertraging (1000); }}  
Sidenote: voor traditionele RS232 is de enige manier om echt te bepalen of iets is verbonden, gegevens te verzenden en te kijken of u een antwoord krijgt. Er is geen ander universeel verbindingsdetectiemechanisme. Dit is de reden waarom seriële apparaten op Windows nog steeds soms als muis worden herkend. Het besturingssysteem gaat ervan uit dat een bepaalde set tekens betekent dat er een muis aanwezig is, aangezien het geen andere manier heeft om deze aanname te bevestigen, het werkt er gewoon mee.
Twee antwoorden:
#1
+12
Peter Bloomfield
2014-02-26 07:19:05 UTC
view on stackexchange narkive permalink

Je hebt gelijk - het werkt in de meeste gevallen niet en zal bijna altijd waar terugkeren. Het enige bord waar het echt functioneel is, is de Leonardo. Volgens de officiële documentatie:

Op de Leonardo geeft if (Serial) aan of de seriële USB CDC-verbinding open is. Voor alle andere gevallen, inclusief if (Serial1) op de Leonardo, zal dit altijd true retourneren.

Standaard seriële verbindingen (gebruikt door de meeste Arduino's) don ' Het maakt niet uit of er daadwerkelijk iets luistert. Het is niet ongebruikelijk dat embedded apparaten foutopsporingsinformatie per serie verzenden, zelfs als niets deze ontvangt. Dit heeft het voordeel dat de timing en het gedrag van de code niet veranderen tijdens het debuggen, wat allerlei problemen kan veroorzaken als je probeert een diagnose te stellen van een probleem dat in het veld is gemeld.

#2
+4
asheeshr
2014-02-26 21:08:50 UTC
view on stackexchange narkive permalink

Hoewel het misschien niet mogelijk is om te detecteren of een apparaat al dan niet is aangesloten op de Arduino seriële verbinding, is het mogelijk om de foutopsporingsberichten via de seriële verbinding in te schakelen op basis van de aanwezigheid van een apparaat op de seriële verbinding.

Gezien het feit dat je de debug-interface van je sketch alleen gebruikt wanneer je verbonden bent met een computer die in staat is tot seriële communicatie, is het mogelijk om een ​​eenvoudige test in de sketch op te nemen op basis van welke modus is ingeschakeld of niet.

Wanneer de schets start, kunt u controleren of er gegevens beschikbaar zijn op de seriële verbinding of niet. Als dat het geval is, is er een apparaat aanwezig en kan foutopsporing worden ingeschakeld. Aan de computerzijde, elke keer dat u de foutopsporingsmodus op de Arduino wilt starten, stuurt u gewoon een byte over de seriële verbinding tijdens de setup -fase en leunt u achterover.

Hier is een voorbeeldschets die hetzelfde laat zien:

  int debug = 0; void setup () {pinMode (13, OUTPUT); Serial.begin (9600); // Wacht vier seconden of tot gegevens beschikbaar zijn op serieel, // wat zich het eerst voordoet. while (Serial.available () == 0 && millis () <4000); // Over time-out of beschikbaarheid van gegevens, we komen hier. if (Serial.available () >0) {// Als er gegevens beschikbaar zijn, voeren we hier in. int test = Serial.read (); // We wissen vervolgens de invoerbuffer Serial.println ("DEBUG"); // Geef feedback met vermelding van modus debug = 1; // Debug inschakelen}} void loop () {if (debug == 1) Serial.println ("ON"); digitalWrite (13, HIGH); vertraging (1000); if (debug == 0) Serial.println ("OFF"); // Schakel uit als serieel niet beschikbaar is digitalWrite (13, LOW); vertraging (1000); }  
Dit is vrijwel de techniek die ik gebruik in mijn eigen code.
Imho, je zou ook seriële uitvoer kunnen inschakelen zodra het een teken ontvangt. Of gebruik verschillende build-modi (in een geavanceerde IDE), of controleer misschien zelfs of de ingangsspanning van de USB komt.


Deze Q&A is automatisch vertaald vanuit de Engelse taal.De originele inhoud is beschikbaar op stackexchange, waarvoor we bedanken voor de cc by-sa 3.0-licentie waaronder het wordt gedistribueerd.
Loading...