Pages: 1 [2] 3   Go Down
Author Topic: Erhaltene Daten über Serialport auf SD-karte schreiben und auslesen  (Read 2747 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Sr. Member
****
Karma: 2
Posts: 272
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Auf die Karte würde natürlich nicht der geschrieben, den du über Serial gelesen hast, aber das ist mir erstmal egal,
solange mir nicht klar ist, warum du 80 Zeilen mit je einem Buchstaben '0' schreibst.

Ja das mit der 0 soll ja das ende verdeutlichen, dass da nichts mehr kommt.

Hmm, geht nicht. Muss es wieder probieren, sitzt da schon eine weile dran, aber naja muss es hinbekommen
Logged

Germany
Offline Offline
Faraday Member
**
Karma: 56
Posts: 2983
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Hmm, geht nicht. Muss es wieder probieren

Ich würde jede Menge Testausgaben einbauen und im VB Programm in einer Listbox anzeigen.

Das mit chr(2) bzw. chr(1) in deinem VB Teil wusste ich nicht, sorry. (Dann kann man auch schlecht den SerialMonitor zum Testen nehmen)
Aber blinken rot/gelb tut es, oder ?
Logged

Offline Offline
Sr. Member
****
Karma: 2
Posts: 272
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Hmm, geht nicht. Muss es wieder probieren

Ich würde jede Menge Testausgaben einbauen und im VB Programm in einer Listbox anzeigen.

Das mit chr(2) bzw. chr(1) in deinem VB Teil wusste ich nicht, sorry. (Dann kann man auch schlecht den SerialMonitor zum Testen nehmen)
Aber blinken rot/gelb tut es, oder ?

Hi ist kein Problem smiley-grin,ja das mit dem Blinken geht.
Habe moemtan nur das Problem die Daten die ich von der gui sende in auf die sd karte in die commands.txt zu schreiben bzw auszulesen(da kein inhalt da ist) smiley-sad

du hast gesagt warum 80 Zeilen, aber char buffer[80] sind doch keine zeilen sondern zeichen, oder täusche ich mich?
« Last Edit: April 11, 2013, 10:59:27 am by milito » Logged

Germany
Offline Offline
Faraday Member
**
Karma: 56
Posts: 2983
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

char buffer[80] sind max. 80 Zeichen, meist weniger.
Hier willst du dass es 8079 Zeilen werden:
Code:
for (int i=0; i < 79; i++){
     
   //dataString=String(Serial.read());
   Datei.println(buffer[i]); //Schreibe inhalt in SD-Karte
   //delay(500);
   }

Eine Alternative wäre:
Code:
Datei.println(buffer); // schreibt den ganzen Puffer ( 7 Zeichen ) plus ein Zeilenende
Logged

Offline Offline
Sr. Member
****
Karma: 2
Posts: 272
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi also habe ihn abgeändert, aber irgendwie ist noch der wurm drinne.
Mit der For-schleife hast du recht, mit dem kompletten buffer ist es besser.Habe die zeichenfolge auf 15 festgesetzt, da ich nicht mehr als 15 brauche.

Die commands.txt wird erstellt, aber irgendwie , wird das empfangene nicht reingeschrieben.

Habe mir auch einen Serial monitor installiert: Sample for MFC und die zeichen, die vom arduino gesendet werden, werde auch richtig in dem port gesendet.
Aber irgendwie, bleibt die txt leer.
Code:
/*Code zum Empfangen und Senden von Daten über Serialport (GUI<-> Arduino) */
/*Die Daten werden in eine SD-Karte innerhalb von commands.txt abgespeichert*/


//Globale Variablen
/*----------Varaiblen fürs Senden---------------------------------------*/
int ist_senden= 1; //Falls Arduino an GUI sendet
const int ledPin1= 22;  //Mit Digital PIN 22 verbundene Led  (senden)-(rote led)
/*----------------------------------------------------------------------*/



/*----------Variablen fürs Empfangen------------------------------------*/
const int ledPin2= 23; /*MIt Digital PIN 23 verbundene Led (empfangen)-(gelbe led) */
int ist_receive=2; //Falls Arduino von GUI empfangen soll


/*-----------SD Card-----------------------------------------------------*/
/* Verbindung - SPI an Mega2560
**MISO - pin 51
**MOSI - pin 50
**CLK - pin 52
**SS/CS (Chipselect) - pin 4  -> Standard chipselect pin 53
!!-----pin 53 somit als OUTPUT legen , da nicht verwendet-----*/

#include <SD.h>
int const chipSelect=53; //pin 4 für CS/SS-pin
String dataString;  //Variable zum SpeiSern von Serialport-Daten
File Datei; //um file zu öffnen bzw. auch zu

/*----------------------------------------------------------------------*/
/*-----------Auswahlvariable für Swtich-Case----------------------------*/
int inByte=0; //Variable wo das Empfangene kontrollbit abgespeichert wird(als Byte)
/*----------------------------------------------------------------------*/

//*----------- Hier beginnt das Programm---------------------------------*//

//*------Standard einstellung, die konstant sind in void setup()---------*//

void setup()
{
  Serial.begin(9600); //Serialport öffnen mit baudrate 9600
  //pinMode(ledPin1, OUTPUT); //ledPin1(senden LED), wird als Output gesetzt
  //pinMode(ledPin2, OUTPUT); //ledPin2 (empf. LED), wird als Output gesetzt
 
  pinMode(53, OUTPUT); //da standard-Pin CS/SS nicht verwendet diesen als OUTPUT legen
 
}
/*------------------------------------------------------------------------*/


/*-------Diese Funktionen werden ständig abgefragt in loop----------------*/
void loop()
{
    if (Serial.available() > 0) //Prüfen , ob mindestens ein Zeichen im Port vorhanden ist (Hier prüfe ich , ob senden oder EMpfangen)
  {
    inByte = Serial.read(); //lese zeichen au und speichere in chr vom typ char
     
 
  switch (inByte)
  {

    /*Senden der Daten von Arduino zur GUI*/   
    case 1:
   
              blink_send();
              //Aufruf der Funktion zum auslesen von SD
              read_SD();
             
             
             
              break; //beende case 1
   
    /* Von GUI empfangen*/         
    case 2:
              if (Serial.available() > 0 )
             
              {
               
                byte pos= 0;
                char buffer[15];
                delay(10);
                while (Serial.available() && pos < 15){
                  buffer [pos++] = Serial.read();
                 
                }
             
                write_SD(buffer);
               
              }
                blink_receive();
               
               break;
           
   }
  }
}
//############################################################################################################################################################//
//++++++++++++++++++++++++++++++++++++Funktionenbereich: Alle Funktionen, die innerhalb des Programms aufgerufen werden+++++++++++++++++++++++++++++++++++++++//
//############################################################################################################################################################//

/*---------------------funktion für das Blinken beim senden an GUI----------------------*/
/*---------------------Blink funktion 0,5sek an und 0,5sek aus--------------------------*/

/*Rote LED*/

void blink_send()
{
 
  digitalWrite(ledPin1, HIGH); //leuchtet
  delay(500); //leuchtet 0,5 sek
  digitalWrite(ledPin1, LOW); //aus
  delay(500);
 
}
/*-------------------------------------------------------------------------------------*/


/*----------Funktion die in Case 2 aufegrufen wird, damit LED blinkt-------------------*/

/*gelbe LED*/

void blink_receive()
{
  digitalWrite(ledPin2, HIGH); //leuchtet
  delay(500); // 0,5sek an
  digitalWrite(ledPin2,LOW); //aus
  delay(500); //0,5sek aus
 

 
/*-------------------------------------------------------------------------------------*/

 //---------------------Funktion, die in SD-Karte speichert-----------------------------//     
void write_SD(char* buffer)
{
 
   Serial.print("Initializing SD Card.....");
   if(!SD.begin(chipSelect)){
     Serial.println("Initialization failed, card not present!");
     return;
   }
   Serial.println("card initialized.");
   Datei= SD.open("commands.txt", FILE_WRITE);
   if (!Datei){
     Serial.println("Error to open commands.txt");
   }
     
   Datei.println(buffer); //Schreibe inhalt in SD-Karte
   Datei.flush(); //Schliessen damit daten in SD gespeichert werden
 
}
   
//------------------------------------Funktion zum Auslesen der SD-Card-------------------------------------//
void read_SD(){
  Serial.print("Initializing SD Card.......");
  Serial.write(13); //Carriage_Return Line feed
  /*if (card.init(SPI_HALF_SPEED, chipSelect)){
    Serial.println("SD Card detected");
  }
  else{
    Serial.println(" No SD Card detected ");
  }
  delay(1000); */
  if (!SD.begin(chipSelect)){
    Serial.println("Initialization failed, card not present!");
    return;  //tue nichts
   
  }
  Serial.println("Card was detected");
  //Öffne Datei commands.txt
  Datei=SD.open("COMMANDS.txt");
 
  //wenn File/Datei vorhanden
  if(Datei){
    //lese solange file aus bis nichts mehr zu lesen ist
    while (Datei.available()){
      Serial.write(Datei.read()); //Schreibe an port Inhalt , das von Sd ausgelesne wird
    }
   
    //Nach lesen Datei schliessen
    Datei.close();
  }
    else
    //falls Datei nicht geöfnet werden konnte
    Serial.println("error opening commands.txt");
    Serial.write(13); //Carriage return line feed
    Serial.print("It is not possible to read out the file");
   
    //Serial.print("Testausgabe :"); Serial.println(inByte);
   
}     
//-------------------------------------------------------------------------------------------------------//


Logged

Germany
Offline Offline
Faraday Member
**
Karma: 56
Posts: 2983
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Tja, sieht schonmal besser aus.

Statt
   Datei.flush(); //Schliessen damit daten in SD gespeichert werden

würde
   Datei.close(); //Schliessen damit daten in SD gespeichert werden

eher zum Kommentar-Text passen.
Zu jedem open() gehört auch ein close(). Eigentlich.
Würde mich aber wundern, wenns das ist.

Mit SerialMonitor meinte ich übrigens das Tool in der Arduino-IDE , aber was anderes schadet auch nicht...
Kann der sogar mitlesen, wenn ein anderes Programm den Serial Port benutzt... SoSo, interessant.

Logged

Offline Offline
Sr. Member
****
Karma: 2
Posts: 272
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ok ,d.h. eventuell leigt es an meinem flush liegen?.
Aber auch bei Char müsste doch flush abspeichern und schliessen, oder täusche ich mich?
oder muss man wenn man char abspeichern möchte, das mit close beenden?

hmm mich eigentlich auch. ich wüsste nicht mehr, wo der wurm hängt smiley-sad.
nur komischerweise sehe ich mit dem arduino monitor den serial verlauf nicht.
Habe in meiner GUI, eine richttextbox, in der die ergbnisse angezeigt werden. und wenn er die sd ausliest, kommt halt ein leerfehlt.
Und habe auch die txt aufgemacht nd sie ist leer.
« Last Edit: April 11, 2013, 03:13:31 pm by milito » Logged

Germany
Offline Offline
Faraday Member
**
Karma: 56
Posts: 2983
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Das hat jetzt nichts mit char zu tun, sondern mit der SD library.
Nicht jedes write ( d.h. auch print ) landet tatsächlich sofort auf der Speicherkarte.
Ausserdem muss noch die Dateiverwaltung ( Länge, Sektoren ) aktualisiert werden.

Datei.close() ist nie verkehrt, wenn man danach wieder SD.open oder wie du sogar SD.begin() macht.
Logged

Offline Offline
Sr. Member
****
Karma: 2
Posts: 272
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ok und wie macht man das,?
ich dachte das write /print landet direkt auf die sd karte.
Kann es vllt sein, ich habe noch andere dateien auf der sd, dass es deswegen nicht klappt? Aber warum klappt dann das ReadWrite sketch von Arduino. Der schreibt direkt rein anhand von print /write?
sorry für die frage, bin noch ein neuling,außerdem habe ich mich bei der arduino page über die sd lib informaiert und da stand dazu nichts smiley-sad
« Last Edit: April 11, 2013, 03:25:11 pm by milito » Logged

Offline Offline
Sr. Member
****
Karma: 2
Posts: 272
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

HI habe jetzt gelesen, dass wenn du den inhalt von einem Buffer auf SD karte schreiben möchtest du den write anstatt println nehmen sollst, siehe
http://arduino.cc/en/Reference/FileWrite.
Die syntax wäre : file.write(buf, len)-> meintest du das mit länge und sektoren?
Problem ist, wie finde ich die länge heraus?

Meinst du könnte es das Problem sein?
Logged

Germany
Offline Offline
Faraday Member
**
Karma: 56
Posts: 2983
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
ok und wie macht man das,?

Ich wollte dich nicht unnötig verwirren. 

Das macht close() und sollte eigentlich auch flush() machen, dachte ich.

write(buffer,len) wird von gebraucht, wenn buffer kein Endezeichen hat.
write(buffer)  schreibt bis zum Endezeichen.

print(buffer) geht genauso, print enthält nur zusätzliche Möglichkeiten, um direkt Zahlen in Text zu wandeln und dann zu schreiben.
(Genau wie bei Serial, übrigens) Ruft, nach dem Wandeln der Zahl in Text, write auf.

write schreibt allerdings erst in den internen Puffer der library, in sogenannte Blöcke ( die heissen nur bei Festplatten Sektoren, sorry )
und nur ganze Blöcke werden auf die Speicherkarte geschrieben. Das erledigt bei Bedarf die SD Library für uns. Soll sie zumindest.

Quote
Aber warum klappt dann das ReadWrite sketch von Arduino
Hat bestimmt ein close()  smiley-wink





Logged

Offline Offline
Sr. Member
****
Karma: 2
Posts: 272
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ok, also sozusagen, anstatt flush(), close. werde es auch mit write und print versuchen.
Werde dir bescheid geben, ob es klappt.

Logged

Offline Offline
Sr. Member
****
Karma: 2
Posts: 272
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi michael,

habe es mit close versucht und auch mit print und write, es geht leider immer noch nicht.

hmm hättest du eine andere idee?
So auf anhieb wüsste ich auch nichts mehr. Der inhalt vom buffer wird einfach nicht in die txt.geschrieben. smiley-sad
Logged

Germany
Offline Offline
Faraday Member
**
Karma: 56
Posts: 2983
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hmm, Wo ist der Unterschied zum funktionerenden ReadWrite Example  ?

Mit der normalen SD Library wird

   if(!SD.begin(chipSelect)){

beim zweiten Versuch einen Fehler liefern.

Was sagt denn der Text," Initializing SD Card....." ?
Die Meldung muss auf jeden Fall kommen, danach entweder "card initialized." oder "Initialization failed, card not present!"
da du ja den Example Code brutal geklont hast.

Wenn du die Karte immer drin lässt, mach das SD.begin() nur einmal im Setup...

Sonst schau dir den SD Card HotSwap thread an.
Aber erst, wenn das grundsätzliche Problem gelöst ist.


Diagnose-Meldungen sind prima, machen aber mehr Sinn wenn man sich auch um sie kümmert. Zumindest bei Problemen.
Logged

Offline Offline
Sr. Member
****
Karma: 2
Posts: 272
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

hi wie in den ersten threds von mir habe ich das problem mit dem mehrfach initialisieren beseitig anhand des links.
Am Anfang hatte ich nämlich das Problem, dass ich die SD nur einmal initialisieren konnte.
Das anzeige was nicht funktioniert, ist das mit dem Schrieben auf der SD karte smiley-sad.
Leider finde ich dazu nichts
Logged

Pages: 1 [2] 3   Go Up
Jump to: