Kérdés:
Miért nyomtatja a Serial.print csak 0-84 értéket egy 100 egész tömbre?
Anurag
2018-04-19 16:00:14 UTC
view on stackexchange narkive permalink
  int a [100], i; void setup () {Serial.begin (9600);} void loop () {for (i = 0; i<100; i ++) {a [i] = i; Serial.println (a [i]); } exit (0);}  
Egy válasz:
Majenko
2018-04-19 16:16:40 UTC
view on stackexchange narkive permalink

Ez azért van, mert a exit (0) parancsot használja. Ez kikapcsolja a megszakítást és végtelen ciklusba kerül. A soros nyomtatást azonban először egy pufferbe helyezik, majd minden karaktert soronként eltávolítanak a pufferből, és a soros porton keresztül küldik el.

Ez minden rendben van, egészen a végéig, amikor exit (0); , és ami a soros pufferben maradt, hogy elküldje, azt soha nem küldik el, mert a megszakítások le vannak tiltva.

A exit () használatának soha nincs oka. egy mikrokontrolleren - végül is hova tud "kilépni"? Nincs operációs rendszer, ahonnan kiléphetne. Tehát megteszi a következő legjobb dolgot, amely a lehető legközelebb áll a semmittevéshez.

Ehelyett, ha "le akarja állítani" a programot, használjon egy egyszerű while (1); parancsot, amely lehetővé teszi a megszakítások kiváltását.

Alternatív megoldásként, ha valóban a exit () -t akarja használni, akkor először öblítse le a sorozatot:

  Serial.flush ();  

Ez a funkció mindaddig blokkol, amíg az átviteli puffert a megszakítás teljesen ki nem üríti, és az utolsó bájt elhagyja az UART TX shift regiszterét.

És [ebből a válaszból] (https://arduino.stackexchange.com/a/1727/45942) (több mint 1000 bájt RAM-ot feltételezve) az UART puffere 64 bájt lesz, ami éppen elég a maradék 15 szám megtartásához (két bájt + CR + LF egyenként), négy bájt maradt.
Nem mondanám, hogy nem szabad meghívni az `exit () '-t egy mikrovezérlőn. Inkább nem szabad egyszerű végtelen ciklust meghívni az `exit () 'kifejezésre, ami arra utal, hogy ez egy megfelelő POSIX funkció.


Ezt a kérdést és választ automatikusan lefordították angol nyelvről.Az eredeti tartalom elérhető a stackexchange oldalon, amelyet köszönünk az cc by-sa 3.0 licencért, amely alatt terjesztik.
Loading...