Serial Monitor

Fra HTX-Arduino
Skift til: navigering, søgning

USB-forbindelsen mellem computeren og Arduinoen bliver brugt til upload af kode, men den kan også fungere som seriel kommunikation mellem Arduinoen og computeren, hvilket kan bruges i program-afviklingen, så man kan udskrive resultater til computeren, og man kan indtaste noget på computeren der sendes til Arduinoen.

Den serielle monitor startes ved at klikke på den markerede ikon i figur 1:

Markering af ikonen der starter den serielle monitor
Figur 1 Markering af ikonen der starter den serielle monitor.

Når man gør det kommer følgende vindue op som vist i figur 2

Den serielle monitor med BaudRate markeret
Figur 2 Den serielle monitor med BaudRate markeret.

I den serielle monitor skal kommunikationshastigheden (BaudRate) angives, så den svarer til den BaudRate som Arduinoen kommunikerer med - til normale programmer et 9600 fint.

Simpel udskrift fra Arduino

For at vise hvordan den simple udskrift fungerer, så tages der udgangspunkt i blink-eksemplet, hvor der skrives ud hver gang udgangen er ændret. Dette kan se ud som følger:

void setup() {
  pinMode(13, OUTPUT);
  Serial.begin(9600);
  delay(100);
  Serial.println("Test af Serial Monitor");
}

void loop() {
  digitalWrite(13, HIGH);
  Serial.println("Output ON");
  delay(1000);
  digitalWrite(13, LOW);
  Serial.println("Output OFF");
  delay(1000);
}

I seriel Monitor vil det give resultatet som vist i figur 3:

Visning fra testprogrammet lige efter reset
Figur 3 Visning fra testprogrammet lige efter reset.

Der udskrives en start-besked en gang, og herefter udskrives ON/OFF hver gang der er gået et sekund.

Kodeeksempler

Eksemplerne på denne side kan findes i en ZIP-fil.

Indlæsning i Arduino fra Computeren

Man kan også sende tekst fra computeren ned i Arduinoen, så man kan rette på noget i Arduinoen. Det gør man ved at indtaste noget i det øverste indtastningsfelt og klikke Send.

For at illustrere dette laves følgende tilføjelse i loop():

boolean blink = true;

void loop() {
  if (Serial.available() > 0) {
    char ch = Serial.read();
    if (ch == 'A') {
      blink = true;
    } else if (ch == 'D') {
      blink = false;
    }
  }
  if (blink) {
    digitalWrite(13, HIGH);
    Serial.println("Output ON");
    delay(1000);
  }
  digitalWrite(13, LOW);
  Serial.println("Output OFF");
  delay(1000);
}

Ved at taste D og klikke Send så vil koden kun give OFF indtil man taster A og klikker Send. Dette er vist i figur 4:

Visning af hvor et D har slået blink fra, og der skal sendes A for at slå til igen
Figur 4 Visning af hvor et D har slået blink fra, og der skal sendes A for at slå til igen.

Reaktionen kan ses både i den serielle monitor, og ved at LED’en på Arduinoen holder op med at blinke.

Indlæse værdier i Arduino

I mange tilfælde er det ikke nok med en enkelt karakter, men i stedet ønskeligt at kunne sende tal til Arduinoen - dette kræver noget type-konvertering, hvor man kan konvertere den serielt modtagne streng til et tal[1], så det kan anvendes.

Her illustreres et eksempel hvor der kan indtastes et tal, så delayet i blink-eksemplet kan indstilles til det man ønsker:

int tal = 1000;

void loop() {
  if (Serial.available() > 0) {
    String str = Serial.readStringUntil('\n');
    str.trim();
    tal = str.toInt();
    Serial.print("Delay: ");
    Serial.println(tal);
  }
  digitalWrite(13, HIGH);
  Serial.println("Output ON");
  delay(tal);
  digitalWrite(13, LOW);
  Serial.println("Output OFF");
  delay(tal);
}

Der bliver lige udskrevet det nye delay i den serielle monitor, som det kan ses i figur 5

Visning af hvordan den nye delay udskrives i serial monitor
Figur 5 Visning af hvordan den nye delay udskrives i serial monitor.

Det mest markante at ser er at hastigheden ændrer sig, specielt hvis man indtaster en lav værdi. Det kan også ses på lysdioden.

Anvendelser af Seriel Monitor

Der serielle monitor kan anvendes til forskelligt - umiddelbart, så er den rigtig god til test, når man udvikler programmer - at man lige kan se indholdet af en variabel, og at man kan spore om programkoden kommer ind i en betingelse.

Den serielle monitor kan også, som det er illustreret her, anvendes til betjening af et program i Arduinoen, hvor man kan have sit output til at komme på computeren, og man har mulighed for at sende kommandoer til Arduinoen fra computeren, så hele betjeningen af programmet sker via den serielle monitor. Det er måske ikke det mest brugervenlige, men det er relativt enkelt at opbygge.

En anden relateret anvendelse er at man kan sende og modtage værdier på den serielle port. Det kan være til anden elektronik (fx simple RFID-moduler sender en tekststreng med ID’et) eller det kan være til at kommunikere med med et program på computeren som det er beskrevet i Arduino kombineret med Processing.

I nogle anvendelser kan det også være en fordel hvis man ikke bruger den serielle hardware-port (ben 0 og 1), men i stedet anvender SoftwareSerial[2], så man stadig kan anvende den serielle monitor (virker ikke med SoftwareSerial) til fejlfinding. Software Serial kan fungere på alle digitale ben på Arduinoen - der er begrænsninger på andre processorer - se dokumentationen.

Specielle forhold omkring Serial Monitor Svaert.png

Den serielle forbindelse er angivet i Baud, hvilket er bit pr. sekund, så for hver karakter går der 10 bit[3], så det tager ca. et millisekund for hver karakter. Det gør at man ikke bare kan sende ubegrænset datamængde uden at det sløver processen. Umiddelbart så sinker det ikke processen voldsomt at man sender en streng på 20 karakterer, da der ikke ventes til de 20 karakterer er sendt inden der returneres. Der sker i praksis det at de 20 karakterer lægges i en buffer, og så sørger kernen i Arduinoen for at karaktererne sendes, så længe der er noget i bufferen.

Arduinoen har dog kun 64 karakter i sin buffer (både sending og modtagelse), så hvis man hurtigt bliver ved at fylde i bufferen, så vil den løbe fuld.

For afsending af karakterer vil det betyde at der ventes til karaktererne er sendt, inden der returneres, så det kan sløve koden ret voldsomt, hvis man skriver for meget.

For modtagelse af karakterer, så vil det betyde at man mister karakterer hvis bufferen bliver fyldt (hvis koden ikke kan nå at læse det der modtages) - det er der ikke meget at gøre ved - man kan ændre størrelsen med Serial.buffer(size), men med den begrænsede hukommelse Arduinoen har, så er det begrænset hvor meget man kan udvide (realistisk set ikke over 1024).

En hjælp kan være at arbejde med en højere BaudRate, men det kan gøre kommunika- tionen mere støjfølsom. Det har dog også sine begrænsninger, da det også tager noget processortid at håndtere bufferen og at sende karaktererne ud af bufferen igen (sker i interrupt).

En anden indstilling man skal være opmærksom på er hvordan Enter sendes - det kan være “Carriage return”, “Newline” eller begge (CR & NL). Det kan også undlades, men det kan så være svært at skille tingene ad.

Referencer