Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Schnittstelle RS 232/485

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] [ 2 ] > 3 <
020
29.09.2004, 10:10 Uhr
Mr. T




Zitat von ao:
Ich glaube, du brauchst zwei Threads: einen, der an COM1 horcht und sich schlafenlegt bis was kommt und einen, der an COM2 horcht und gegebenenfalls das COM1-ReadFile cancelt.
ao


Danke, danke!!

Also, dann versuche ich das demnächst mal so. Aber nur zum Verständnis: Wenn sich com1 schlafenlegt, bis was kommt, hört sich nicht gut an!!!! Das heisst doch, dass wenn (und das ist bei mir der Fall) PERMANENT Daten an com1 anliegen, wird dieser auch nicht einschlafen, und somit ständig beschäftigt sein, oder?
Nochmal deutlich:
com1 : permanentes Signal im stringformat liegt an und soll gelesen und gespeichert werden,

bis:

com2: eine 0x01 z.B. bekommt (com2 wird also auch mit readfile() ausgelesen). Diese 0x01 soll das Lesen und Speichern von com1 beenden.

Das heisst also, ich muß dann com2 schlafend gestalten und bei 0x01 cancelio() aufrufen, richtig?
--
So ist das!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
021
29.09.2004, 10:30 Uhr
ao

(Operator)



Zitat von Mr. T:
Das heisst doch, dass wenn (und das ist bei mir der Fall) PERMANENT Daten an com1 anliegen, wird dieser auch nicht einschlafen, und somit ständig beschäftigt sein, oder?

Der Thread, der das ReadFile an Com1 aufruft, schläft tatsächlich an dem Event (mit WaitForSingleObject). Im Hintergrund (tief drinnen in Windows) läuft aber jemand und holt Daten aus der Schnittstelle und packt sie in den Pufferspeicher. Wenn dann eine der drei Bedingungen erfüllt ist, füttert er den Event und weckt damit deinen Thread wieder auf:

1. Timeout abgelaufen: X Millisekunden ohne Dateneingang
2. Puffer voll, d.h. Anzahl der empfangenen Daten ist nNbrOfBytesToRead
3. Jemand hat CancelIo () aufgerufen.


Zitat:
com2: eine 0x01 z.B. bekommt (com2 wird also auch mit readfile() ausgelesen). Diese 0x01 soll das Lesen und Speichern von com1 beenden.

Das heisst also, ich muß dann com2 schlafend gestalten und bei 0x01 cancelio() aufrufen, richtig?

Auf Com2 kommt erst ganz lange nichts; d.h. auf Com1 soll gelesen werden. Irgendwann kommt 0x01, dann soll das Lesen auf Com1 abgebrochen werden. Richtig?

In dem Fall kann auf Com2 synchron gelesen werden (ohne Timeout-Begrenzung), also: Warte so lange bis irgendwas kommt, und wenn das eine 1 ist, dann mach CancelIo auf Com1.

Du kannst aber auch auf Com2 asynchron warten, dann kannst du für beide Schnittstellen ähnlichen Sourcecode verwenden. Du brauchst dann zwei Events.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
022
29.09.2004, 10:42 Uhr
Mr. T




Zitat von ao:
In dem Fall kann auf Com2 synchron gelesen werden (ohne Timeout-Begrenzung), also: Warte so lange bis irgendwas kommt, und wenn das eine 1 ist, dann mach CancelIo auf Com1.

Du kannst aber auch auf Com2 asynchron warten, dann kannst du für beide Schnittstellen ähnlichen Sourcecode verwenden. Du brauchst dann zwei Events.


Danke, ich hoffe ich bekomme das dann jetzt endlich hin.

Kennst Du vielleicht ein gutes deutsches nachschlagewerk, in dem ich diese ganze Sache nachschlagen kann? Es ist doch recht umfangreich, auch mit den ganzen eventuellen Fehlerfallbehandlungen. Diese Onlinehilfe ist mal zu einfach und dann wieder zu schwer zum durchsteigen, ich weiß nicht, ob es sonst auch noch jemandem so ging.

Dann schliesse ich mich jetzt mal in mein Kämmerchen...
--
So ist das!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
023
29.09.2004, 11:50 Uhr
ao

(Operator)



Zitat von Mr. T:
Kennst Du vielleicht ein gutes deutsches nachschlagewerk, in dem ich diese ganze Sache nachschlagen kann?

Nein, leider nicht. Aber geh doch mal in die öffentliche Bücherei der nächsten Großstadt - Uni-Bibliothek ist auch gut, wenn du da Zugang hast - und such nach etwas, das irgendwie "Windows-Programmierung" heißt. Das kann ruhig ein paar Jahre alt sein, die Konzepte sind schon lange unverändert.


Zitat:
ich weiß nicht, ob es sonst auch noch jemandem so ging.

Praktisch jedem, der damit anfing. Aber das geht vorbei, und die Mühe sollte man sich machen, weil die MSDN-Hilfe *die* offizielle Referenz für alles ist, was mit Windows-Programmierung zu tun hat.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
024
29.09.2004, 12:03 Uhr
Mr. T



Leider Gottes bin ich schon in allen Bücherläden gewesen, meine c/c++ Bücher befassen sich nur mit Grundsätzlichem... Stuttgart, Ulm, die haben alle viele Bücher für Anfänger - das wars dann auch schon...

Jetzt versuche ich mal weiter mit der msdn - "Hilfe".

Ich belästige Dich jetzt nochmal mit ein paar Begriflichkeiten:

Was ist denn genau der Unterschied zw. Synchron und Asynchron? Nur das "schlafen"des comX?!

Thread ist die Bezeichnug für den Handle der "Datei" bzw. "comX"?!

Event ist dann der Auslöser für das CancelIo() oder?
so:
__--> Event?
|
if(readfile(hcomX,..,......)==0x02)
{
CancelIo(hcomY);
}

Wie verhält es sich eigentlich mit den Bitverlusten? Da es diese WaitForSingleObject() gibt, könnte sich der interrupt erledigt haben. Dann lasse ich halt eine feste Zeit an Com1 lesen und schiesse dann ab. Ist die Zahl gelesener Bytes dann immer konstant, wenn der Sender konstant sendet? WaitForSingleObject() scheint mir eine gute lösung, zur zeit lasse ich nämlich diese feste Zeit auch über Com2 steuern, nach 2sek schaltet der nämlich von 0x01 auf 0x02, dann brauche ich den cancelio nicht und kann also synchron (?) Com1 einlesen...

Wo findet man nur all diese tollen fertigen Funktionen, wenn man sie nicht kennt???

Danke für die Geduld...
--
So ist das!

Dieser Post wurde am 29.09.2004 um 12:20 Uhr von Mr. T editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
025
29.09.2004, 12:30 Uhr
ao

(Operator)


1. Bücherladen != Bücherei.

2. Synchroner Aufruf einer Funktion (hier ReadFile) heißt, die Funktion wird aufgerufen, und wenn sie zurückkehrt, ist alles gelaufen, d.h. entweder stehen die Daten im Puffer, oder es war Timeout, oder irgendein anderer Fehler.

Asynchroner Aufruf heißt, die Funktion wird aufgerufen, hinterlegt im Betriebssystem irgendwas und kehrt zurück. Das Ergebnis (Daten oder Timeout oder Fehler) steht erst zu einem späteren Zeitpunkt fest, und du wirst, wenn es soweit ist, über einen Event benachrichtigt, dass du jetzt nach dem Ergebnis schauen kannst.

3. WaitForSingleObject kann auch ohne Timeout warten. Setze bei dwMilliseconds INFINITE ein.

4. Thread: Nein, das ist keine Bezeichnung für ein File-Handle. MSDN-Hilfe -> Platform SDK Documentation -> Base Services -> DLLs, Processes and Threads -> Processes and Threads. Da steht, was ein Thread ist. Das solltest du zuerst lesen, bevor du weitermachst.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
026
29.09.2004, 12:44 Uhr
Mr. T



Oke.

Ich mache das jetzt mit 0x01 von com2 = Start vom readfile() an com1 mit waitforsingle object() schiesse ich com1 nach 2sek lesen ab - so bin ich glücklich!

Jetzt gehts nur noch um die Syntax, aber damit möchte ich dich nicht länger belästigen.
Danke Dir vielmals, was könnte ich denn jetzt im Austausch für Dich tun?

Greetings
--
So ist das!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
027
01.10.2004, 08:47 Uhr
Mr. T




Zitat von Mr. T:

Ich mache das jetzt mit 0x01 von com2 = Start vom readfile() an com1 mit waitforsingle object() schiesse ich com1 nach 2sek lesen ab - so bin ich glücklich.


Doch nicht. Ich mache das jetzt so: Com2 gibt Startsignal zum einlesen des Com1. Com1 sendet ein Token an einen Teilnehmer, der antwortet, und wenn ich meine gewünschte Anzahl an Antworten habe, ist alles Paletti!!

Vielen Dank an alle, die mir geholfen haben!

Nur einzwei Fragen noch:

Das Lesen funktioniert ja auch ohne die Structs dcb und commontimeouts etc.. Die dazugehörigen Funktionen Get/Set - Commontimeouts/State benötigt man dann nur zum Kontrollieren, ob die Einstellungen auch übernommen wurden? Wozu stelle ich eigentlich zB die Baudrate etc. ein, wenn auch alles ohne Einstellungen funktioniert? Ich habe Spaßeshalber mal alles ausser CreateFile() auskommentiert, aber es lief hervorragend weiter!

Also, so long!
--
So ist das!

Dieser Post wurde am 01.10.2004 um 08:48 Uhr von Mr. T editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
028
04.10.2004, 13:21 Uhr
~Mr. T
Gast


Hallo!

Hier der Teil des Programmes, der noch nicht sauber möchte...
Der an com1 ankommende String mit der Länge von 7 ASCII Zeichen muß immer mit einer 0x01 gestartet werden. Das geht noch. Auch das Einlesen der Daten geht noch. Aber wieso ist das Kopieren zum Speicher in ein Feld nicht möglich? Es werden immer ca. 200 Werte erfolgreich kopiert und gespeichert. Dann fängt mein Rechner an, zu Piepen und schreibt nur noch eine Zeile nach der Anderen im sekundentakt aufs Display (mit cout<<WertA[...]).
Das ganze Thema hackt dann und läuft nicht mehr richtig.

char WertA[4000]

for(t=0;t<2000;t++)
{
//Token an Adresse 0x01 schicken
WriteFile(h_com1_Bus, &com1_ZuSchreiben, com1_ZuSchreibendeBytes, &com1_GeschrBytes, NULL);

/////Teilnehmer 0x01 sendet jetzt Daten, einlesen von 7Bytes://///
//////[0]=Wert,[1]=Wert,[2]=Token der an Teilnehmer als Folge/////
///Teilnehmer eingestellt ist. Hier 0x02, der Inkrementalgeber.///
///////[3]=WertA, [4]=WertB, [5]=Token. Ende des Comkreises///////

ReadFile(h_com1_Bus, &com1_Gelesen, 8, &com1_GelesBytes, NULL);

/////Wenn das dritte Byte nicht das Token 0x02 ist, Fehler!/////
/////Wenn das fünfte Byte nicht das Token 0x03 ist, Fehler!/////

if(com1_Gelesen[2]!=0x02 || com1_Gelesen[5]!=0x03)
{
cout<<"\nCom Fehler\n"
<<"Gelesen wurde : "
<<com1_Gelesen[0]
<<com1_Gelesen[1]
<<com1_Gelesen[2]
<<com1_Gelesen[3]
<<com1_Gelesen[4]
<<com1_Gelesen[5]
<<com1_Gelesen[6]
<<com1_Gelesen[7]
<<"-->Fehler"
<<endl;
break;
}

WertA[2*t] = com1_Gelesen[0];
WertA[2*t+1] = com1_Gelesen[1];
WertB[2*t] = com1_Gelesen[3];
WertB[2*t+1] = com1_Gelesen[4];

t++; //Um immer um 2 Felder zu springen...
}

Wieso funzt das nicht richtig?

Danke...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
029
04.10.2004, 13:35 Uhr
Mr. T



Oke,

sagt mir jetzt bitte nicht, dass weil ich da mit cout ASCII Werte ausgebe, auch das Piep Signal mit dabei sein könnte... und es also kein Fehler im Programm, sondern halt ein Wert für das Piepsen 0x... gibt!

Bin halt auch nur ein Anfänger..
--
So ist das!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] [ 2 ] > 3 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: