Frage:
Serial.write und Serial.println geben unterschiedliche Werte zurück? Kann keine richtigen verwenden
user3151828
2015-01-18 09:49:03 UTC
view on stackexchange narkive permalink

Ich habe eine Textdatei auf einer SD-Karte und versuche, die Zeilen auf dem seriellen Monitor zu drucken.

Dieser Code funktioniert:

  #include <SPI .h> # include <SD.h>File myFile; void setup () {Serial.begin (9600); Serial.print ("SD-Karte initialisieren ..."); PinMode (10, OUTPUT); if (! SD.begin (4)) {Serial.println ("Initialisierung fehlgeschlagen!"); Rückkehr; } Serial.println ("Initialisierung abgeschlossen."); myFile = SD.open ("c.txt"); if (myFile) {Serial.println ("c.txt:"); while (myFile.available ()) {Serial.write (myFile.read ()); // DIESE LINIE HIER} myFile.close (); } else {// Wenn die Datei nicht geöffnet wurde, drucken Sie einen Fehler: Serial.println ("Fehler beim Öffnen von c.txt"); }} void loop () {}  

Wenn ich jedoch die Zeile Serial.write (myFile.read ()) ersetze, durch Serial. println (myFile.read ()); , dann gibt der Code nicht die richtigen Zeilen zurück.

Er sollte ähnliche Zahlen zurückgeben (wenn auch 3000):

  564564564564564564564464564664564  

Wenn ich Serial.println verwende, werden Zahlen wie diese zurückgegeben (und es hört nicht bei 3000 Zeilen auf):

  13105454521310535452  

Und wenn ich versuche, int (myFile.read ()) auszuführen, wird die Ganzzahl zu den falschen Zahlen (zurückgegeben) von println ), nicht die richtigen (zurückgegeben von write ) .\

Wie erhalte ich eine von Serial.write zurückgegebene Nummer? (myFile.read ()); eine ganze Zahl sein?

Einer antworten:
BrettAM
2015-01-18 10:38:12 UTC
view on stackexchange narkive permalink

Die Textdatei enthält die sequentiellen ASCII-Werte, die die Daten buchstabieren, nicht die Binärdaten. println beim Drucken des numerischen Werts jedes Bytes. Zum Beispiel sind die println -Drucke der 10 '\ n' Zeichen. write druckt das dem Binärwert (der neuen Zeile) zugeordnete ASCII-Zeichen. Sie müssen die ASCII-Zeichen in Zahlen analysieren.

Glücklicherweise erbt die SD-Bibliothek von der Klasse Stream , sodass sie dieselbe parseInt hat Funktion, die am häufigsten zum Parsen von Ints vom seriellen Monitor verwendet wird.

Sie möchten wahrscheinlich zuerst myFile.setTimeout (0) festlegen, da die Datei nicht langsam Zeichen vom seriellen Bus erhält, sodass das Timeout Sie nur verlangsamen würde.

Dann sollten Sie in der Lage sein, die ASCII-Ganzzahlen folgendermaßen zu analysieren und auszudrucken:

  int val = myFile.parseInt (); Serial.println (val);  
Ich könnte mir keine bessere Antwort wünschen!


Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 3.0-Lizenz, unter der er vertrieben wird.
Loading...