Problem beim lesen von COM1



  • 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