Pytanie:
Serial.write i Serial.println zwracają różne wartości? Nie można użyć poprawnych
user3151828
2015-01-18 09:49:03 UTC
view on stackexchange narkive permalink

Mam plik tekstowy na karcie SD i próbuję wydrukować wiersze na monitorze szeregowym.

Ten kod działa:

  #include <SPI .h> # zawiera <SD.h>File myFile; void setup () {Serial.begin (9600); Serial.print ("Inicjalizacja karty SD ..."); pinMode (10, WYJŚCIE); if (! SD.begin (4)) {Serial.println ("inicjalizacja nie powiodła się!"); powrót; } Serial.println ("inicjalizacja zakończona."); myFile = SD.open ("c.txt"); if (myFile) {Serial.println ("c.txt:"); while (myFile.available ()) {Serial.write (myFile.read ()); // TUTAJ PRAWO TEN WIERSZ} myFile.close (); } else {// jeśli plik nie został otwarty, wyświetla błąd: Serial.println ("błąd podczas otwierania c.txt"); }} void loop () {}  

Jednak jeśli zamienię wiersz Serial.write (myFile.read ()); na Serial. println (myFile.read ()); , to kod nie zwraca prawidłowych wierszy.

Powinien zwrócić liczby podobne do tej (aczkolwiek 3000):

564564564564564564564464564664564

Jeśli używam Serial.println , zwraca takie liczby (i nie zatrzymuje się na 3000 liniach):

  13105454521310535452  

A jeśli spróbuję wykonać int (myFile.read ()) , to liczba całkowita stanie się błędną liczbą (zwrócona przez println ), a nie te właściwe (zwrócone przez write).\

Jak uzyskać numer zwracany przez Serial.write (myFile.read ()); ma być liczbą całkowitą?

Jeden odpowiedź:
BrettAM
2015-01-18 10:38:12 UTC
view on stackexchange narkive permalink

Plik tekstowy zawiera sekwencyjne wartości ascii, które opisują dane, a nie dane binarne. println przy drukowaniu wartości liczbowej każdego bajtu. Na przykład, wydruki dziesiątek println to znaki „\ n”. write wypisuje znak ascii powiązany z wartością binarną (nowa linia). Musisz przeanalizować znaki ascii na liczby.

Na szczęście biblioteka SD dziedziczy po klasie Stream , więc będzie miała ten sam parametr parseInt funkcja najczęściej używana do parsowania int z monitora szeregowego.

Prawdopodobnie chcesz najpierw ustawić myFile.setTimeout (0) , ponieważ plik nie pobiera powoli znaków z magistrali szeregowej, więc przekroczenie limitu czasu po prostu spowolniłoby Cię.

Następnie powinieneś być w stanie przeanalizować i wydrukować liczby całkowite ascii w następujący sposób:

  int val = myFile.parseInt (); Serial.println (val);  
Nie mogłem prosić o lepszą odpowiedź!


To pytanie i odpowiedź zostało automatycznie przetłumaczone z języka angielskiego.Oryginalna treść jest dostępna na stackexchange, za co dziękujemy za licencję cc by-sa 3.0, w ramach której jest rozpowszechniana.
Loading...