Problem beim lesen von COM1
-
Hallo
junix bezieht sich sicher darauf
int zu_lesen=NULL;in der Annahme, das der Wert die zu lesenden Zeichen angeben soll.
bis bald
akari
-
sorry,
ich Dumpfbacke! Wer lesen kann ist klar in Vorteil
Das Habe ich dann auf 14 geändert, weil das Meßgerät einen String von 14 Byte sendet. Jetzt tritt aber folgendes neues Problem auf: Bei der Ausführung von
ReadFile(handle,&inPuffer,zu_lesen,&gelesen,NULL);springt er aus der Funktion nicht mehr heraus und das Programm hängt sich auf
Warum?
-
Korrekt.
Programmiererregel 3.1427:
Kenne deine Parameter und deren Bedeutung.Eigentlich gehört jeder der einfach mal "NULL" übergibt weil er nicht weiss was mit dem Parameter anzustellen ist niedergeschossen....
....tschuldigung hab grad meine destruktive Phase...
-junix
-
torsten_156 schrieb:
springt er aus der Funktion nicht mehr heraus und das Programm hängt sich auf
Warum?Was steht über Readfile genau in der Dokumentation?
Tip: Es hat was mit der Anzahl Bytes zu tun die empfangen werden sollen....
-junix
-
ich habe mir die Hilfe vom CBuilder über ReadFile() durchgelesen! Die große Erleuchtung kam mir leider nicht. Aber könnte es etwas mit dem zweiten Parameter (lpBuffer) zutun haben? Muß er evt. genau so groß sein wie der zu erwartende Datenstrom? Ich glaube eher nicht, oder?
Sonst habe ich leider noch keine weitere Idee...
-
Was genau macht die Funktion nach dem Aufruf?
Der Kern der Sache liegt in folgender Zeile: The ReadFile function returns when one of the following conditions is met: (click und nachlesen *g*)
-junix
-
Da steht ja folgendes: Die Function wird beendet, wenn folgende Fälle eintreten:
1. Wenn das schreiben von der Gegenstelle (Meßgerät) beendet ist!
-> nach dem Aufruf von ReadFile warte ich ca.2 min, es passiert nix und dann schalte ich das Meßgerät aus! Bleibt trotzdem hängen2. die Anzahl von verlangten Bytes ist gelesen worden!
-> ich weis, das das Meßgerät ein Datenpaket von 14Bytes / sec. schicken kann. Wie stelle ich fest, wann und wieviele Bytes schon geschickt wurden wenn ich keine andere Function dafür aufrufen kann?3. ein Fehler kommt vor
-> recht unwarscheinlich, da die Function ja nicht beendet wird
-
Was hindert dich daran REadfile Byteweise zu benutzen?
-junix
-
soll das bedeuten, das ich die 14Byte, die das Meßgerät sendet, alle einzeln abholen muß? Wenn ja, warum?
torsten_156
-
Hallo
wenn keine 14 Bytes ankommen kannst du lange warten
(ist das eine Erklaerung)MfG
Klaus
-
so langsam verzweifele ich

zu dem Meßgerät habe ich auch ein wenig Doku. In dieser steht (Zitat): Schalten Sie nun das Meßgerät ein. Drücken... Die Meßdaten werden in folgendem Datenformat(Länge: 14Byte) an den PC gesendet:
BYTE 123456789ABCDE
Bsp.1 DC-1.9999 V CRByte1,2 und A bis D enthalten die Maßeinheit des jeweiligen Meßbereiches, Byte 3 die Polarität, Byte 4 bis 9 den Meßwert und Byte E <CR> (Zitat ende).
Damit steht doch fest, das das Meßgerät 14 Bytes sendet. Da ich auch etwas getestet und probiert habe, hier nochmals der neue Code für das setzen des DCB:
AnsiString c=NULL; dcb.DCBlength = sizeof(DCB); GetCommState(handle, &dcb); BuildCommDCB("1200,N,7,1",&dcb); SetCommState(handle, &dcb);und hier der Code zum lesen:
unsigned char inPuffer[14]; DWORD gelesen = NULL; int zu_lesen=14; for(int x=0; x<zu_lesen; x++) { inPuffer[x] = NULL; } for(int y=0; y<=zu_lesen; y++) { inPuffer[y] = ReadFile(handle,&inPuffer,zu_lesen,&gelesen,0); }Ich bekomme beim lesen immer nur ein x01 ???
Was mache ich denn Falsch

-
JAAAAAAAA

Ich habe nach langem Versuchen die Lösung gefunden! Ich habe mir nochmals den DCB zur Brust genommen. Ich habe da noch ein paar Parameter mehr setzen müssen
Aber VIELEN DANK für die hilfe...
Schönen Gruß torsten_156
-
torsten_156 schrieb:
so langsam verzweifele ich

zu dem Meßgerät habe ich auch ein wenig Doku. In dieser steht (Zitat): Schalten Sie nun das Meßgerät ein. Drücken... Die Meßdaten werden in folgendem Datenformat(Länge: 14Byte) an den PC gesendet:
BYTE 123456789ABCDE
Bsp.1 DC-1.9999 V CRByte1,2 und A bis D enthalten die Maßeinheit des jeweiligen Meßbereiches, Byte 3 die Polarität, Byte 4 bis 9 den Meßwert und Byte E <CR> (Zitat ende).
Damit steht doch fest, das das Meßgerät 14 Bytes sendet. Da ich auch etwas getestet und probiert habe, hier nochmals der neue Code für das setzen des DCB:
AnsiString c=NULL; dcb.DCBlength = sizeof(DCB); GetCommState(handle, &dcb); BuildCommDCB("1200,N,7,1",&dcb); SetCommState(handle, &dcb);und hier der Code zum lesen:[code]unsigned char inPuffer[14];
DWORD gelesen = NULL;
int zu_lesen=14;
[...]
for(int y=0; y<=zu_lesen; y++)
{
inPuffer[y] = ReadFile(handle,&inPuffer,zu_lesen,&gelesen,0);
}[/cpp]Da steckt noch ein Denkfehler drin!
-
Versuch doch mal folgendes.
HANDLE handle; //Handle Instanz erzeugen DCB dcb; //DCB Instanz erzeugen COMMTIMEOUTS comtimeout; //COMTIMEOUT Instanz erzeugen unsigned long gelesene_bytes; unsigned char* buffer = new unsigned char[20]; //Empfangesbuffer unsigned char data; unsigned char index; handle = CreateFile("com1",GENERIC_WRITE | GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL); if (handle != INVALID_HANDLE_VALUE) { GetCommState(handle,&dcb); //DCB füllen GetCommTimeouts(handle,&comtimeout); //COMTIMEOUTS füllen dcb.fBinary = true; dcb.Parity = false; // kein parity dcb.fOutxCtsFlow = false; dcb.fOutxDsrFlow = false; dcb.fDtrControl = DTR_CONTROL_DISABLE; dcb.fDsrSensitivity = false; dcb.fTXContinueOnXoff = false; dcb.BaudRate = 19200; // Baudrate 19200 muss eventuell geändert werden dcb.ByteSize = 8; dcb.fOutX = false; dcb.fInX = false; dcb.fErrorChar = false; dcb.fNull = false; dcb.fRtsControl = RTS_CONTROL_DISABLE; dcb.fAbortOnError = false; dcb.StopBits = ONESTOPBIT; //Anzahl Stoppbits SetCommState(handle, &dcb); //Comstate (DCB) initialisieren timeout.ReadTotalTimeoutMultiplier = 3000; //Wartet 3sec auf den Empfang eines Bytes SetCommTimeouts(handle,&comtimeout); //Timeouts initialisierenHier die ReadFile Geschichte.
ReadFile liest solange Bytes in den Buffer bis
ein Timeout (nach 3sec) siehe "timeout.ReadTotalTimeoutMultiplier = 3000(milisecunden) weiter Oben" erfolgt, dann wird ReadFile ohne emfpangenes Byte verlassen (hängt nun nicht mehr).
In gelesene_bytes steht nun 0 und die While Schleife wird beendet, in Buffer stehen nun die empfangenen Bytes in index
steht die genaue Anzahl der Empfangenen Bytes -1.index = 0; do { ReadFile(handle,&data,1,&gelesene_bytes,NULL); //Handle,zeiger auf Empfangsbuffer,bytes zu lesen(1),zeiger auf Variable gelesene bytes, //Zeiger auf Overlapped Structur->NULL kein Overlapped(das mit dem Overlapped verstehe ich noch nicht so ganz, kann das mal Jemand genauer erklären) buffer[index] = data; index++; }while(gelesene_bytes != 0); }
-
@hermes:
Overlapped ermöglicht dir im wesentlichen ein Multitasking. Der Trick dabei ist, dass man weitere Operationen ausführen kann und "ReadFile" dabei im Hintergrund läuft.
-
Das ist mir klar, nur je mehr ich mich auf der MS Homepage damit beschäftige
desto verwirrender wird das ganze.
Hatt nicht mal einer ein einfaches Beispiel.
Danke
-
hermes schrieb:
Hatt nicht mal einer ein einfaches Beispiel.
Danke//liest Daten von der RS232 Schnittstelle und schreibt díese in buffer //bis keine Zeichen mehr empfangen werden. void ComRead (int ComPort, char* buffer) { int x, timeout; DWORD dwBytesRead; char InChar; x = 0; timeout = 0; do { ReadFile(hComm[ComPort], &InChar, 1, &dwBytesRead, NULL); //nur ein Byte lesen Sleep(10); timeout++; if (dwBytesRead) { buffer[x] = InChar; x++; timeout = 0; } } while (timeout<5 && x<BUFFSIZE-1); buffer[x] = '\0'; }Ergebnis steht in buffer[], ich lese damit einen "String", deshalb die Nullterminierung.
Jochen
-
Ich glaube er meinte ein einfaches Beispiel für die Verwendung der Overlapped-Funktionen (o;
[edit]Wenn ich das nächste Mal ein Bischen Zeit über habe, dann poste ich hier mal ein kleines Beispiel.
So richtig lustig ist der Overlapped-Betrieb eigentlich nur wenn man eh einen externen Thread dafür betreibt.[edit]