Problem beim lesen von COM1
-
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]