Küsimus:
Kuidas see koodirida tuvastab, kui jadaliides on ühendatud?
Cybergibbons
2014-02-26 04:48:32 UTC
view on stackexchange narkive permalink

Töötan temperatuuri anduri kaugsõlmede koodiga. Nad lülitavad silumisliidese sisse ja välja sõltuvalt sellest, kas jadapordiga on midagi ühendatud või mitte.

Kood on Githubis siin. Rida 111 on huvipakkuv rida:

  if (Serial) silumine = 1; muu silumine = 0; // kui seeria UART USB-ga on ühendatud, kuvatakse silumine O / P..  

Nii et lihtne küsimus: kuidas see riistvara ja tarkvara tasemel töötab? Ma ei näe riistvaraseriaalis ega voos midagi sellist, mis oleks tõene / väär, kui midagi oleks ühendatud või mitte.

Pange tähele, et ma pole kindel, et see tegelikult töötab. See lihtne test näitab, et see ei tööta, kuna valgusdiood vilgub sõltumata jadiadapteri või ühenduse olemasolust:

  boolean debug; const int toggle = 6; void setup () {if ( Jada) silumine = 1; muu silumine = 0; pinMode (ümberlülitamine, OUTPUT); digitalWrite (ümberlülitamine, LOW); if (silumine) {Serial.begin (9600); Serial.println ("Seadistamine"); digitalWrite (ümberlülitus, HIGH); viivitus (1000); digitalWrite (ümberlülitamine, LOW); }} void loop () {if (silumine) {Serial.println ("Loop"); digitalWrite (ümberlülitus, HIGH); viivitus (1000); digitalWrite (ümberlülitamine, LOW); viivitus (1000); }}  
Sidenote: traditsioonilise RS232 puhul on ainus viis tõepoolest kindlaks teha, kas midagi on ühendatud, andmete saatmine ja vastuse saamine. Muud universaalset ühenduse tuvastamise mehhanismi pole. Seetõttu tuvastatakse Windowsi seeriaseadmeid mõnikord ka hiirena. OS eeldab, et teatud tähemärkide komplekt tähendab, et kohal on hiir, kuna tal pole muud võimalust seda oletust kinnitada, see lihtsalt töötab koos sellega.
Kaks vastused:
#1
+12
Peter Bloomfield
2014-02-26 07:19:05 UTC
view on stackexchange narkive permalink

Teil on õigus - see ei tööta enamikul juhtudel ja see vastab peaaegu alati tõele. Üks pardal, kus see tegelikult töötab, on Leonardo. ametliku dokumentatsiooni kohaselt:

Leonardos näitab if (Serial) , kas USB CDC jadaühendus on avatud või mitte. Kõigi teiste eksemplaride puhul, sealhulgas Leonardo if (Serial1) , tagastab see alati tõene.

Põhilised jadaliitmikud (mida kasutab enamik Arduinosid) tavaliselt ei ' ei huvita, kas midagi tegelikult kuulab. Pole haruldane, et manustatud seadmed saadavad silumisinfot jadadena ka siis, kui miski seda ei saa. Selle eeliseks on, et silumisel ei muutu koodi ajastus ja käitumine, mis võib tekitada igasuguseid probleeme, kui proovite diagnoosida väljal teatatud probleemi.

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

Kuigi ei pruugi olla võimalik tuvastada, kas seade on ühendatud Arduino jadaühendusega või mitte, on seadme olemasolul võimalik lubada silumisõnumeid seeriaühenduse kaudu jadaühenduse kohta.

Arvestades, et te kasutate oma eskiisi silumisliidest ainult siis, kui olete ühendatud jadasidet pakkuva arvutiga, on visandisse võimalik lisada lihtne test, mille silumise alusel režiim on lubatud või mitte.

Kui visand algab, saate kontrollida, kas seeriaühenduse kohta on andmeid saadaval või mitte. Kui on, on seade olemas ja silumist saab lubada. Iga kord, kui soovite Arduinos silumisrežiimi käivitada, saatke arvuti setup faasi ajal jadaühenduse kaudu lihtsalt bait ja istuge.

Siin on sama näidisjoonis:

  int debug = 0; void setup () {pinMode (13, OUTPUT); Seeria algus (9600); // Oodake neli sekundit või seni, kuni andmed on järjestikus saadaval, olenevalt sellest, kumb toimub varem. samas (Serial.available () == 0 && millis () <4000); // Aegumise või andmete kättesaadavuse korral tuleme siia. if (Serial.available () >0) {// Kui andmed on saadaval, sisestame siia. int test = Serial.read (); // Seejärel tühjendame sisendpuhvri Serial.println ("DEBUG"); // Anna tagasisidet, mis näitab režiimi silumist = 1; // lubage silumine}} void loop () {if (silumine == 1) Serial.println ("ON"); digitalWrite (13, HIGH); viivitus (1000); if (silumine == 0) Serial.println ("OFF"); // Lülita välja, kui jadavood pole saadaval digitalWrite (13, LOW); viivitus (1000); }  
See on üsna palju tehnika, mida ma oma koodis kasutan.
Imho, võite ka seeriaväljundi lubada kohe, kui see saab märgi. Või kasutage erinevaid koostamisrežiime (täiustatud IDE-s) või kontrollige isegi, kas sisendpinge pärineb USB-st.


See küsimus ja vastus tõlgiti automaatselt inglise keelest.Algne sisu on saadaval stackexchange-is, mida täname cc by-sa 3.0-litsentsi eest, mille all seda levitatakse.
Loading...