Forum: PC-Programmierung RS232 Logdatei schreiben auf PC


von M. D. (derdiek)


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:
1
#include <stdio.h>
2
3
int main (void)
4
{
5
   int dauer, i=0, temperatur;
6
   FILE * logtemp;
7
   FILE * serialtemp;
8
   
9
   logtemp = fopen ("rs232log.txt","w");
10
   if (logtemp == NULL) 
11
   {
12
      printf("Fehler beim Erstellen der Logdatei");
13
      return 1;
14
   }
15
   
16
   printf("Bitte Aufzeichnungszeitraum in Minuten angeben: \n");
17
   scanf("%i", &dauer);
18
   
19
   while (i <= dauer)
20
   {
21
      serialtemp = fopen ("com3:","r");
22
      if (serialtemp == NULL)
23
      {
24
         printf("Fehler beim Oeffnen der Com-Schnittstelle");
25
         return 1;               
26
      }
27
      fscanf(serialtemp,"%i",&temperatur);
28
      fprintf(logtemp,"%i. Temperaturwert: %i\n",i+1, temperatur);
29
      sleep(1000);
30
      fclose (serialtemp);
31
      i++;
32
   }
33
   fclose(logtemp);
34
   return 0;    
35
}

von Peter (Gast)


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

von M. D. (derdiek)


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.

von Peter (Gast)


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.

von Oliver K. (okraits)


Lesenswert?

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

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

von Juergen R. (stumpjumper)


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.

von Thomas E. (thomase)


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.

von Karl H. (kbuchegg)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.