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 ]
010
25.09.2004, 09:09 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


hi zeig mal deinen code, vielleicht fällt uns ja auf warum im "inbuffer" müll steht
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
25.09.2004, 17:40 Uhr
~Mr. T
Gast



Zitat von FloSoft:
hi zeig mal deinen code, vielleicht fällt uns ja auf warum im "inbuffer" müll steht


Ich habe den empfohlenen code von Dir bzw. dem Tipp nach Dir versucht... (siehe oben).

Danke!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
25.09.2004, 18:20 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


hast du mal geschaut was dir ReadFile im nReadBytes-Parameter zurückgibt? evtl hilft ein


C++:
inbuffer[nReadBytes] = '\0'; // string terminieren



nach dem ReadFile-Aufruf
--
class God : public ChuckNorris { };

Dieser Post wurde am 25.09.2004 um 18:20 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
27.09.2004, 10:21 Uhr
Mr. T



Also, Jungs und co.!

Vielen Dank, wir haben es geschafft!!! Wenn das Programm soweit genau das tut, was ich
brauche, stelle ich es hier aus!

Vielen Dank für Eure Nerven...
--
So ist das!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
28.09.2004, 09:42 Uhr
Mr. T



[quote Mr. T]Also, Jungs und co.!

Vielen Dank, wir haben es geschafft!!![quote]

Naja...

Kann man den ReadFile() interrupten? Die Funktion schreibt ja solange, bis der Buffer voll ist, gelle?! Dann kann ich nicht Duch ein weiteres Signal an einem anderen Comport das Lesen starten und stoppen, schade..

Ist es die einzige Möglichkeit das zu erreichen wenn man beide Ports nacheinander zeichenweise (also nur inbuffer[0] für Com1 + Com2) einliest, auswertet und reagiert? Das wäre ja ein verdammt großer Aufwand...

Danke!
--
So ist das!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
28.09.2004, 10:12 Uhr
ao

(Operator)


Du kannst Timeouts vorgeben. Die Funktion dazu heißt SetCommTimeouts().

Wenn dann soundso lange keine Daten mehr gekommen sind, wird das ReadFile () abgebrochen. Der nBytesRead-Parameter enthält dann die Anzahl der Bytes, die bis dahin empfangen wurden, und so viele Bytes im Puffer sind gültig, der Rest ist Rauschen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
28.09.2004, 10:32 Uhr
Mr. T




Zitat von ao:
Du kannst Timeouts vorgeben. Die Funktion dazu heißt SetCommTimeouts().

Wenn dann soundso lange keine Daten mehr gekommen sind, wird das ReadFile () abgebrochen.


Yo, cool! ABER: Das sind doch dann feste timeouts. Leider kommen die Daten permanent am com1 an. das Lesen sollte aber aufhören, wenn an com2 ein bestimmter string ankommt. Dann klappt das doch nicht mehr mit den timeouts, oder checke ich das noch nicht? Wie meinst du das denn?
--
So ist das!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
017
28.09.2004, 11:42 Uhr
ao

(Operator)


Ach so, das war mir nicht klar. Dann wirds komplizierter.

Um ein laufendes ReadFile abzubrechen, verwende CancelIo ().

Das geht aber nur bei *asynchronen* Operationen, d.h. du rufst ReadFile (am COM1) so auf, dass es sich schlafenlegt, bis entweder genug Daten eingetroffen sind oder das Timeout abgelaufen ist oder CancelIo aufgerufen wird.

Dazu musst du im CreateFile die Flagge FILE_FLAG_OVERLAPPED setzen und im ReadFile eine ausgefüllte OVERLAPPED-Struktur übergeben. An dem Event, das du in das OVERLAPPED reinreichst, kannst du anschließend warten.

In der MSDN-Hilfe gibts auf der ReadFile-Seite ein Stück Beispielcode. Außerdem kommst du von ReadFile oder CreateFile auf Hilfeseiten zum Thema OVERLAPPED und Synchronization. Solltest du unbedingt lesen.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
018
28.09.2004, 15:01 Uhr
Mr. T




Zitat von ao:

Dazu musst du im CreateFile die Flagge FILE_FLAG_OVERLAPPED setzen und im ReadFile eine ausgefüllte OVERLAPPED-Struktur übergeben. An dem Event, das du in das OVERLAPPED reinreichst, kannst du anschließend warten.



Ey, Danke! Hammer, daß man sich so auskennen kann und noch so hilfreich ist, wie mache ich das bloß wieder gut?

Heisst das, dass ich den CancelIO() dann im readfile(..,..,..,..,cancelio()) aufrufen muß?
Und: die"gOverLapped.Offset=0;gOverLapped.OffsetHigh=0;" sind wofür?
Oder einfach so übernehmen?
Wie steuere ich dann das Ereignis von com2 auf cancelio()?

Oder: kann ich dann eine bool variable x ins readfile readfile(..,..,..,..,x) schreiben, welche auf true(?) gesetzt wird, wenn com2 ereignis stattfindet!? Das hiesse, die Funktion readfile wird verlassen und die nächste Zeile kann im Programm während des Einlesens des Strings verarbeitet werden, obwohl noch daten in das Stringfeld geschrieben werden?!
so:
gOverLapped.Offset = 0;
gOverLapped.OffsetHigh = 0;
gOverLapped.hEvent = x;
readfile(com1,..,..,..,&gOverLapped);//lesen bis Buffer voll aber mit overlapped
readfile(com2,..,..,..,..);//auf com2 horchen
if(..)//com2 ereignis
{
x=cancelio(com1);//readfile von com1 aschiessen
}

Muss ich dazu noch Headerdateien einfügen? windows.h ist schon drin. Wie mache ich diese drei gOverLapped. Aufrufe? Vor dem main()?

DANKE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
--
So ist das!

Dieser Post wurde am 28.09.2004 um 15:23 Uhr von Mr. T editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
019
29.09.2004, 09:04 Uhr
ao

(Operator)


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.

ReadFile ( ..., ..., CancelIo) oder ReadFile ( ..., ..., x) sind Unsinn. Es muss gehen wie in dem Beispiel gezeigt. Falls das COM1-ReadFile gecancelt wird, gibt es ein ERROR_OPERATION_ABORTED zurück (vgl. MSDN-Hilfe zu CancelIo), eine Auswertung dafür musst du in dem switch-Block noch hinzufügen.

Welche Header und Libs du brauchst, steht auch in der MSDN-Hilfe. Bei jeder Funktionsbeschreibung steht ganz unten ein Block "Requirements", der nennt dir alles, was du brauchst, um die jeweilige Funktion verwenden zu können.

ao
 
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: