www.mikrocontroller.net

Forum: PC-Programmierung RS232 Logdatei schreiben auf PC


Autor: M. D. (derdiek)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo..

Habe vor Temperaturwerte, die von einem 8051 Controller (verbunden mit 
einem LM75) gesendet werden, auf dem Rechner in eine Datei zu speichern.

Das Problem was ich habe ist, das fscanf nicht auf die eingehenden Daten 
vom Controller reagiert, und das C-Programm stehen bleibt.

Die eingehenden Daten werden als Ascii-Wert ständig in einer Schleife 
gesendet. (z.B. "+00025.0")

Habe jetzt schon jede Menge probiert, komme aber nicht so recht weiter.
Der Temperaturwert wird im Hyperterminal korrekt angezeigt, Daten zum 
Controller senden kann ich ebenfalls, somit sollte die Baudrate stimmen.

Zudem kann ich mit dem mode-Befehl die Einstellungen der 
COM-Schnittstelle nicht ändern, nur anzeigen. Verwendet wird ein 
Keyspan-USB-Seriell-Wandler, und Windows XP Home.

Hier mein Code:
#include <stdio.h>

int main (void)
{
   int dauer, i=0, temperatur;
   FILE * logtemp;
   FILE * serialtemp;
   
   logtemp = fopen ("rs232log.txt","w");
   if (logtemp == NULL) 
   {
      printf("Fehler beim Erstellen der Logdatei");
      return 1;
   }
   
   printf("Bitte Aufzeichnungszeitraum in Minuten angeben: \n");
   scanf("%i", &dauer);
   
   while (i <= dauer)
   {
      serialtemp = fopen ("com3:","r");
      if (serialtemp == NULL)
      {
         printf("Fehler beim Oeffnen der Com-Schnittstelle");
         return 1;               
      }
      fscanf(serialtemp,"%i",&temperatur);
      fprintf(logtemp,"%i. Temperaturwert: %i\n",i+1, temperatur);
      sleep(1000);
      fclose (serialtemp);
      i++;
   }
   fclose(logtemp);
   return 0;    
}

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
denn verwende doch nicht scanf!

Man sollte die Schnittestelle mit read auslesen, dann am besten das 
gelesen in die logdatei schreiben, wenn du es als int brauchst dann 
sollte man es selber in ein puffer einlesen und dann atoi o.ä. 
Umwandlen.

Auserdem sollte man immer noch die Baudrate einstellen und zwar nicht 
mit mode sondern mit passende api Funktionen
http://msdn.microsoft.com/en-us/library/aa363436(VS.85).aspx

Autor: M. D. (derdiek)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm, ich dachte fscanf wäre genau richtig für sowas.
Oder reagiert das wirklich nur auf Inhalte in Dateien und nicht auf 
einen eintreffenden Datenstream via Schnittstelle?

Für read muss ich aber die Werte in ein Array einlesen oder?
Habe serialtemp ja mit FILE* erzeugt, kann ich das auch mit einem Array 
und fopen verlinken?

Wenn ich jetzt
read (temperatur, serialtemp, sizeof(serialtemp));
schreibe, kommt nur eine sich wiederholende Zahlenkombination in der 
Datei an.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
M. D. schrieb:
> Für read muss ich aber die Werte in ein Array einlesen oder?
ja

> read (temperatur, serialtemp, sizeof(serialtemp));
du musst das return auswerten dort bekommt du gesagt wieviel gelesen 
wurde.

> Habe serialtemp ja mit FILE* erzeugt, kann ich das auch mit einem Array
> und fopen verlinken?
versteht ich niht, was du damit sagen willst.

Ich programmiere schon eine weile in C, bis jetzt habe ich noch nie 
scanf verwendet.

leg ein puffer der so gross ist wie die maximale länge der Daten die du 
verarbeiten möchtest.
Lies mit read alle daten bis zum Datenende ein( es kommt doch bestimmt 
nach der Zahl ein enter oder \0).

Danach werte den Puffer aus.

Autor: Oliver K. (okraits)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht hilft der Portmonitor, der kann das Log auch in eine Datei 
speichern (unter Export):

http://www.serial-port-monitor.com/

Autor: Juergen Roeck (stumpjumper)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo derdiek,
nur mal ein Tip in welche Richtung Du Dich belesen solltest/könntest.
Das lesen mit "read" haben ja schon einige Vorredner erwähnt. Eine 
andere Möglichkeit wäre mittels "select" das die meisten nur zur 
Netzwerkprogrammierung kennen, es eignet sich aber auch sehr gut zur 
Überwachung anderer Geräte.

Autor: Thomas Eckmann (Firma: Thomas Eckmann Informationst.) (thomase)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab' mal vor etlichen Jahren eine DLL dafür mit Visual Studio 6.0 aus 
einigen Codefetzen zusammengebaut und für meine Bedürfnisse angepasst. 
Komplett asynchron, also kein Polling. Stichwort "&overlapped". Kann ich 
dir per Email schicken, wenn du damit klar kommst. Ist aber eher was für 
alte Hasen.

mfg.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
M. D. schrieb:
> Hmm, ich dachte fscanf wäre genau richtig für sowas.
> Oder reagiert das wirklich nur auf Inhalte in Dateien und nicht auf
> einen eintreffenden Datenstream via Schnittstelle?

Müsste auch auf die Schnittstelle gehen. Die präsentiert sich ja 
schliesslich als Datei.

> Die eingehenden Daten werden als Ascii-Wert ständig in einer
> Schleife gesendet. (z.B. "+00025.0")

fscanf wartet aber auf einen \n
Wenn du daher keinen sendest, wird fscanf niemals aufhören auf eine 
Zeile zu warten.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.