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
intmain(void)
4
{
5
intdauer,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
return1;
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");
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
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.
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.
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.
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.
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.