PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Com1 auslesen



Sachse
01-03-2003, 18:11
Hi

Wer kann mir mit einfachen Worten erklären , wie ich Com1 auslese und die Daten in eine Text Datei bringe.
Bin absoluter Neuling in C/C++ . Hab es jetzt schon so weit gebracht eine Datei zu öffnen und das Datum welches für die Daten wichtig ist einschreiben zu lassen.

anda_skoa
01-03-2003, 19:10
Ich hab leider kein serielles Gerät zum Testen, aber wenn du nichts besonderes einstellen musst, könntest du versuchen, /dev/ttyS0 wie ein normales File zu öffnen.

In Unix ist fast alles ein File :)

Ciao,
_

Sachse
01-03-2003, 21:01
dann brauche ich root Rechte oder.
Spreche ich es dann mit /dev/ttyS1 an . Oder wie ?



Hab einfach mal : datei = fopen ( "/dev/ttyS" , "r+" ); in meine Prog eingesetzt.
wenn ich /dev/ttyS33 eingebe schreit er es gibt die "Datei" nicht. Schon mal gut oder ?

Es kommt erst mal keine Fehlermeldung.

Mein Testgerät steht in der Firma und ich habe deshalb auch keine Möglichkeit das so endgültig zu testen.

Sachse
01-03-2003, 21:27
Hier mal meine Idee



__________________________________________________ _______


#include <iostream>//I-O Header
#include <unistd.h>
#include <time.h> //Zeit Header


using namespace std;



int main()
{
int n1,wert;
FILE *datei,*cadas;


cout << "\n\nTestprogramm zum auslesen des Cadas 100 \n";
cout << "\n Ralf Pilling ralfpilling@yahoo.de \n\n\n";
cout.flush();
sleep(0);
time_t now = time((time_t *)NULL);
printf("\nDatum / Uhrzeit : %.24s.\n", ctime(&now));

{

//Datei wird geönnet
datei = fopen ( "cadas.txt" , "a+" );
cadas = fopen ( "/dev/ttyS0" , "r" );
if (datei == NULL )
{

/*
Da ist wohl ein Fehler aufgetreten!
*/

printf ("\nDie Datei konnte nicht geöffnet werden.!\nBitte überprüfen sie die Rechte der Datei cadas.txt \n");

}
else
{
/*
Alles lief wie geplant - es kann losgehen
*/
fprintf (datei, "Autor : Ralf Pilling \n e-mail: ralfpilling@yahoo.de %.24s.\n\n", ctime(&now));
printf ("\nCadas100.txt konnte geöffnet werden.\n\n");
fprintf (datei, "Analyse\t\t\tKüvetten-test\t\t\tAnalysenwert\t\t\tDatum\n", ctime(&now));
//cadas.txt ist offen und wird beschrieben

// Test --- Erzeugung der Dateieinträge start
for(n1=1 ;n1<=10 ;n1++)
{
fprintf (datei, "Nickel\t\t\tLCK 337\t\t\t\t0,057mg/l\t\t\t%.24s.\n", ctime(&now));
cout << "Schreib in cadas.txt Ihre Analysen-Daten \n\a";
}

// Test --- Erzeugung der Dateieinträge ende

//cadas.txt wird geschlossen

}
}

if (cadas == NULL )
{
cout << "Com-Port konnte nicht gelesen werden";
}
else
{
cout << "Com-Port konnte gelesen werden";
}




fclose (datei);
printf ("\nProgramm wurde beendet,und die Datei cadas.txt wieder geschlossen.\n");

sleep(0);
cout << "\n\nProgramm bendet \n\a";
cout << cadas << "\n" ;


return 0;
}

______________________________________________
cout << cadas << "\n" ; zeigt 0 an ,weil nix angeschlossen ist.
cout << datei << "\n" ; zeigt 0x804a508 an .


Denke das könnte ich am Montag in der Firma mal so laufen lassen.


Ist das alles soweit richtig ?

Noch die Ausgabe am Bildschirm :
ralf@linux:/SCSI-2GB/Cadas> c++ cadas.c && a.out


Testprogramm zum auslesen des Cadas 100

Ralf Pilling ralfpilling@yahoo.de



Datum / Uhrzeit : Sat Mar 1 22:49:16 2003.

cadas.txt konnte geöffnet werden.

Schreib in cadas.txt Ihre Analysen-Daten
Schreib in cadas.txt Ihre Analysen-Daten
Schreib in cadas.txt Ihre Analysen-Daten
Schreib in cadas.txt Ihre Analysen-Daten
Schreib in cadas.txt Ihre Analysen-Daten
Schreib in cadas.txt Ihre Analysen-Daten
Schreib in cadas.txt Ihre Analysen-Daten
Schreib in cadas.txt Ihre Analysen-Daten
Schreib in cadas.txt Ihre Analysen-Daten
Schreib in cadas.txt Ihre Analysen-Daten
Com-Port konnte nicht gelesen werden
Programm wurde beendet,und die Datei cadas.txt wieder geschlossen.


Programm bendet
0

anda_skoa
02-03-2003, 11:09
Bitte code Tags um deinen Code setzen.
Auf Bearbeiten klicken und vor dem Code
[ code ] und nach dem Code [ /code ] (Jeweils ohne Leerzeichen)

Was du noch prüfen könntest:
Hast du Leserechte an /dev/ttyS0?
Bei mir muss man dazu zB in der Gruppe dialout sein.

Ansonsten hätte ich so etwas ähnliches versucht.

Aber vielleicht C++ Stream statt File Handles verwendet :)



# include <fstream>

ofstream datei;
datei.open("cadas.txt", ios:append);
if (datei.fail())
// fehler

datei << "Autor: .." << endl;
datei.close();


Ciao,
_

Sachse
02-03-2003, 13:22
Tschuldigung .. aber mit den [ code ] und nach dem Code [ /code ] (Jeweils ohne Leerzeichen) sagt mir jetzt nichts.

Ja die Rechte für die Com-Port's habe ich.
Hatte noch ein fehler drinnen. Der Path in "cadas = fopen ( "/dev/ttyS0" , "r" );" muss richtig mit angegeben werden. Somit kommt dann mit "cout << cadas << "\n" ;" was nur zum testen drinenn steht auch 0x8049970 raus. Wenn ich für "cadas = fopen ( "/dev/ttyS0" , "r" );" ttyS33 eingebe kommt 0 raus weil es diese "Datei" in /dev/ nicht gibt.

Ich hab das jetzt nicht genau im Kopf aber im Handbuch von dem Photometer also dem Cadas haben die ein Bsp. mit Basic drinnen. Die senden dan nur einen Return oder andere Sonderzeichen und das Cadas sendet dann die Daten. Somit müsste ich mir ne Schleife basteln und ständig abfragen. Was wirkt sich negativer aus, die Schleife mit sleep() ausbremsen oder ständig die Schleife ablaufen lassen. Da kommen natürlich nur aller paar Minuten Analysenergebnisse zustande. Frag mich jetztnicht od das Cadas die Daten puffert.

Wo kann ich das Prog dann für alle Linuxer zugänglich machen ?
Das Cadas ist nicht selten verkauft worden ?


Äh wie lese ich eigentlich jetzt vom einer Datei ? Bisher habe ich ja nur geöffnet und geschrieben.
fprintf (cadas,"\b"); zb. erzeugt keinen Fehler. Sollte das Senden eines Sonderzeichens sein.:rolleyes:

anda_skoa
02-03-2003, 13:39
Original geschrieben von Sachse
Tschuldigung .. aber mit den [ code ] und nach dem Code [ /code ] (Jeweils ohne Leerzeichen) sagt mir jetzt nichts.


Du editierst dein Posting mit dem Button Bearbeiten.
Dann gehst du in dem Texteingabefeld an den Anfang deines Codes und gibt ein
[ code ] nur eben ohen Leerzeichen zwischen Klammer und Wort.
Dann am Ende [ /code ]



Schleife mit sleep() ausbremsen oder ständig die Schleife ablaufen lassen. Da kommen natürlich nur aller paar Minuten Analysenergebnisse zustande. Frag mich jetztnicht od das Cadas die Daten puffert.


Wenn das Geät nur auf Anforderung Daten sendet, machst du am besten eine Schleife mit
- Anforderung senden
- Lesen

Das Lesen sollte dann von selbst solange Blockieren, bis Daten verfügbar sind.



Wo kann ich das Prog dann für alle Linuxer zugänglich machen ?

freshmeat.net, sourceforge.net, berlios.de



Äh wie lese ich eigentlich jetzt vom einer Datei ? Bisher habe ich ja nur geöffnet und geschrieben.

fread oder fgets wenn du es in C machst.



fprintf (cadas,"\b"); zb. erzeugt keinen Fehler. Sollte das Senden eines Sonderzeichens sein.:rolleyes:

Sollte ansich nicht gehen, du hast das Device nur read-only geöffnet.

Ciao,
_

Sachse
02-03-2003, 13:54
ja genau nur read-only werd ich gleich ändern


Ich schreibe gerade alles mit kedit. Stress aber ich denke ich hab alles so besser im Auge.
Denke ich lerne so mehr.
Dann mache ich c++ -o cadas cadas.c && cadas.


geht "fscanf (cadas , "%c", &zeichen );" auch ? oben habe ich "char zeichen" gemacht .

Habs mal so laufen gelassen. Da ja nichts kommt bleibt das Prog an dieser Stelle stehen.

anda_skoa
02-03-2003, 14:12
Original geschrieben von Sachse

Dann mache ich c++ -o cadas cadas.c && cadas.


Gib der Datei die Endung .cpp wenn du C++ Sachen drin hast.



geht "fscanf (cadas , "%c", &zeichen );" auch ? oben habe ich "char zeichen" gemacht .


Ja, das geht natürlich auch.

Ciao,
_
P.S. hab in dein Posting die Code tags eingefügt.

Sachse
02-03-2003, 15:12
Danke für deine Hilfe und einen schönen Sonntag noch.:)