Problem beim lesen von COM1



  • 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ängen

    2. 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


  • Mod

    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 CR

    Byte1,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 CR

    Byte1,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 initialisieren
    

    Hier 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]


Anmelden zum Antworten