Kysymys:
Kuinka tämä koodirivi havaitsee, onko sarjaportti kytketty?
Cybergibbons
2014-02-26 04:48:32 UTC
view on stackexchange narkive permalink

Työskentelen jonkin verran koodia etälämpötila-anturisolmuille. He ottavat virheenkorjausliittymän käyttöön ja pois käytöstä riippuen siitä, onko jotain kytketty sarjaporttiin vai ei.

Koodi on Githubissa täällä. Rivi 111 on kiinnostava rivi:

  if (Serial) debug = 1; muu virheenkorjaus = 0; // jos sarja UART USB: hen on kytketty, näytä virheenkorjaus O / P.  

Joten yksinkertainen kysymys: Kuinka tämä toimii laitteisto- ja ohjelmistotasolla? En näe HardwareSerialissa tai Streamissa mitään sellaista, joka palauttaisi true / false, jos jotain on kytketty tai ei.

Huomaa, etten ole varma, että se todella toimii. Tämä yksinkertainen testi osoittaa, että se ei toimi, koska LED vilkkuu sarjaportin tai yhteyden läsnäolosta riippumatta:

  boolean debug; const int toggle = 6; void setup () {if ( Sarja) virheenkorjaus = 1; muu virheenkorjaus = 0; pinMode (vaihda, OUTPUT); digitalWrite (vaihda, LOW); if (virheenkorjaus) {Serial.begin (9600); Serial.println ("Asennus"); digitalWrite (vaihda, HIGH); viive (1000); digitalWrite (vaihda, LOW); }} void loop () {if (virheenkorjaus) {Serial.println ("Loop"); digitalWrite (vaihda, HIGH); viive (1000); digitalWrite (vaihda, LOW); viive (1000); }}  
Sidenote: Perinteisen RS232: n ainoa tapa todentaa, onko jotain kytketty, on lähettää tietoja ja nähdä, saatko vastauksen. Ei ole muuta yleistä yhteyden tunnistusmekanismia. Siksi Windows-sarjaliitännät tunnistetaan joskus hiirenä. Käyttöjärjestelmä olettaa tietyn merkkisarjan merkitsevän hiiren läsnäoloa, koska sillä ei ole muuta tapaa vahvistaa tätä oletusta, se vain toimii sen kanssa.
Kaksi vastused:
#1
+12
Peter Bloomfield
2014-02-26 07:19:05 UTC
view on stackexchange narkive permalink

Olet oikeassa - se ei toimi useimmissa tapauksissa ja palaa melkein aina totta. Yksi levy, jossa se todella toimii, on Leonardo. virallisen dokumentaation mukaan:

Leonardossa jos (Sarja) osoittaa, onko USB CDC-sarjayhteys auki. Kaikilla muilla instansseilla, mukaan lukien if (Serial1) Leonardolla, tämä palauttaa aina tosi.

Perus sarjayhteydet (useimpien Arduinojen käyttämät) eivät yleensä ' Ei väliä, jos jotain todella kuuntelee. Ei ole harvinaista, että sulautetut laitteet lähettävät virheenkorjaustietoja sarjana, vaikka mikään ei vastaanottaisi niitä. Tällä on se etu, että koodin ajoitus ja käyttäytyminen eivät muutu virheenkorjauksessa, mikä voi aiheuttaa kaikenlaisia ​​ongelmia, jos yrität diagnosoida kentässä ilmoitetun ongelman.

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

Vaikka ei ehkä ole mahdollista havaita, onko laite kytketty Arduino-sarjayhteyteen vai ei, on mahdollista ottaa virheenkorjausviestit sarjayhteyden kautta laitteen läsnäolon perusteella sarjaliitännässä.

Ottaen huomioon, että käytät luonnoksen virheenkorjausrajapintaa vain, kun se on kytketty sarjatietoliikennettä tukevaan tietokoneeseen, on mahdollista sisällyttää luonnokseen yksinkertainen testi, minkä debugin perusteella -tila on käytössä tai ei.

Kun luonnos alkaa, voit tarkistaa, onko sarjaliitännässä tietoja käytettävissä. Jos on, laite on läsnä ja virheenkorjaus voidaan ottaa käyttöön. Tietokoneen puolella, aina kun haluat käynnistää virheenkorjaustilan Arduinossa, lähetä tavu sarjayhteyden kautta setup -vaiheen aikana ja istu alas.

Tässä on esimerkkiluonnos, joka näyttää saman:

  int debug = 0; void setup () {pinMode (13, OUTPUT); Sarjan alku (9600); // Odota neljä sekuntia tai kunnes tiedot ovat saatavana sarjassa, // kumpi tapahtuu ensin. kun taas (Sarja.käytettävissä () == 0 && millis () <4000); // Aikakatkaisun tai tietojen saatavuuden suhteen tulemme tänne. if (Serial.available () >0) {// Jos tietoja on saatavilla, kirjoitamme tähän. int-testi = Sarjalukema (); // Tyhjennämme sitten syöttöpuskurin Serial.println ("DEBUG"); // Anna palautetta osoittaen tilan virheenkorjaus = 1; // Ota debug käyttöön}} void loop () {if (debug == 1) Serial.println ("ON"); digitalWrite (13, HIGH); viive (1000); if (virheenkorjaus == 0) Serial.println ("OFF"); // Sammuta, jos sarja ei ole käytettävissä digitalWrite (13, LOW); viive (1000); }  
Tämä on melkein tekniikka, jota käytän omassa koodissani.
Imho, voit myös ottaa sarjaliitännän käyttöön heti, kun se saa merkin. Tai käytä erilaisia ​​rakennustiloja (edistyneessä IDE: ssä) tai voi jopa tarkistaa, tuleeko tulojännite USB: ltä.


Tämä Q & A käännettiin automaattisesti englanniksi.Alkuperäinen sisältö on saatavilla stackexchange-palvelussa, jota kiitämme cc by-sa 3.0-lisenssistä, jolla sitä jaetaan.
Loading...