- Akku Tests und Balkonkraftwerk Speicher         
Seite 4 von 4 ErsteErste ... 234
Ergebnis 31 bis 37 von 37

Thema: RS-232-Datenüberwachung

  1. #31
    Neuer Benutzer Öfters hier
    Registriert seit
    02.09.2009
    Beiträge
    18
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Also, so sieht er aus, ein bisschen umständlich, aber ich hab ja die Hoffnung, dass es funktioniert. Und wenn ich das Xterminal Programm von dir auf nem anderen Pc öffne und dort etwas schreibe und sende wird es auch mit meiner Software angezeigt. Das Problem ist, wenn ich die BaudRate oder Stopbit etc. ändere klappt es nicht mehr, auch wenn ich die einstellungen dementsprechend auch in meiner Software ändere.
    Naja hier erstmal der Quellcode:

    Code:
    //-----------------------------------Hauptmenü-----------------------------------------------------------
    
    menue: 
            
    cout << "Hauptmen\201:" << endl
         << "----------" << endl
         << "[1] Konfiguration des Com-Ports" << endl
         << "[2] Port \224ffnen" << endl
         << "[3] Programm starten" << endl
         << "[4] Programm beenden" << endl
         << "-------------" << endl
         << "Ihre Eingabe: ";  
      
    cin >> eingabe;
    cout << endl;
    
    //----------------------------Programm beenden----------------------------------------
    
    if(eingabe == 4)
    {
              return EXIT_SUCCESS;  //beendet Programm
    }
      
    
    //--------------------------------Port öffnen-----------------------------------------
    if(eingabe==2)
    {    
            
         hCom = CreateFile ("COM1", 
         GENERIC_READ | GENERIC_WRITE,
         0, // must be opened with exclusive-access
         NULL, // no security attributes
         OPEN_EXISTING, // must use OPEN_EXISTING
         0, // non overlapped I/O
         NULL // hTemplate must be NULL for comm devices
         );
         
                           
         if (hCom == INVALID_HANDLE_VALUE)    //bei fehler beim Portöffnen gibt Error aus
            { cout << " Error opening COM1" << endl << endl;}
                    
         else                                      
             { cout << " COM 1 successfully opened" << endl << endl;}
         
         Sleep(1000);
         goto menue;
    }
    
    
    if(eingabe==1)
    {     
         //-------------------Baudrate einstellen-----------------------------------------
         
         GetCommState(hCom,&dcb);  //Porteinstellungen werden abgerufen 
         
         neuBaudrate:
         cout << "Welche Baudrate soll eingestellt werden: " << endl <<
                 "----------------------------------------" << endl <<
                 "[1] 115200" << endl <<
                 "[2] 57600" << endl <<
                 "[3] 38400" << endl <<
                 "[4] 19200" << endl <<
                 "[5] 9600" << endl <<
                 "[6] 4800" << endl <<
                 "[7] 2400" << endl <<
                 "[8] 1200" << endl <<
                 "[9] 600" << endl <<
                 "[10] 300" << endl << 
                 "-------------" << endl <<
                 "Ihre Eingabe: ";
                 
         cin >> Baudrate;
         cout << endl;
         
         switch (Baudrate)
         {
                case 1:  dcb.BaudRate = CBR_115200;            //Baudrate
                         SetCommState (hCom, &dcb);        //COM-Einstellungen speichern
                break;
                case 2:  dcb.BaudRate = CBR_57600;             //Baudrate
                         SetCommState (hCom, &dcb);        //COM-Einstellungen speichern
                break;
                case 3:  dcb.BaudRate = CBR_38400;             //Baudrate
                         SetCommState (hCom, &dcb);        //COM-Einstellungen speichern
                break;
                case 4:  dcb.BaudRate = CBR_19200;             //Baudrate
                         SetCommState (hCom, &dcb);        //COM-Einstellungen speichern
                break;
                case 5:  dcb.BaudRate = CBR_9600;              //Baudrate
                         SetCommState (hCom, &dcb);        //COM-Einstellungen speichern
                break;
                case 6:  dcb.BaudRate = CBR_4800;              //Baudrate
                         SetCommState (hCom, &dcb);        //COM-Einstellungen speichern
                break;
                case 7:  dcb.BaudRate = CBR_2400;              //Baudrate
                         SetCommState (hCom, &dcb);        //COM-Einstellungen speichern
                break;
                case 8:  dcb.BaudRate = CBR_1200;              //Baudrate
                         SetCommState (hCom, &dcb);        //COM-Einstellungen speichern
                break;
                case 9:  dcb.BaudRate = CBR_600;               //Baudrate
                         SetCommState (hCom, &dcb);        //COM-Einstellungen speichern
                break;
                case 10: dcb.BaudRate = CBR_300;               //Baudrate
                         SetCommState (hCom, &dcb);        //COM-Einstellungen speichern
                break;
                default: goto neuBaudrate;                 //springe zurück 
                
         }
    
         
         //---------------------Anzahl Datenbits festlegen-------------------------------
              
         neuDatenbits:
         cout << "Wieviele Datenbits werden gesendet: " << endl <<
                 "-----------------------------------" << endl <<
                 "[1] 5" << endl <<
                 "[2] 6" << endl <<
                 "[3] 7" << endl <<
                 "[4] 8" << endl <<
                 "-------------" << endl <<
                 "Ihre Eingabe: ";
                 
         cin >> Datenbits;
         cout << endl;
         
         switch(Datenbits)
         {
                case 1:   dcb.ByteSize= 5;                  //Datenbits
                          SetCommState (hCom, &dcb);        //COM-Einstellungen speichern
                break;
                case 2:   dcb.ByteSize= 6;                  //Datenbits
                          SetCommState (hCom, &dcb);        //COM-Einstellungen speichern
                break;
                case 3:   dcb.ByteSize= 7;                  //Datenbits
                          SetCommState (hCom, &dcb);        //COM-Einstellungen speichern
                break;
                case 4:   dcb.ByteSize= 8;                  //Datenbits
                          SetCommState (hCom, &dcb);        //COM-Einstellungen speichern
                break;
                default: goto neuDatenbits;
         }
         
         
         //------------------Parität festlegen---------------------------------------------
         
         neuParitaet:
         cout << "Welche Parit\204t soll gesetzt werden: " << endl <<
                 "-----------------------------------" << endl <<
                 "[1] NOPARITY" << endl <<
                 "[2] ODDPARITY" << endl <<
                 "[3] EVENPARITY" << endl <<
                 "[4] MARKPARITY" << endl <<
                 "[5] SPACEPARITY" << endl <<
                 "-------------" << endl <<
                 "Ihre Eingabe: ";
                 
        cin >> Paritaet;
        cout << endl;
        
        switch(Paritaet)
        {
                case 1:    dcb.Parity= NOPARITY;             //Parität    
                           SetCommState (hCom, &dcb);        //COM-Einstellungen speichern
                           break; 
                case 2:    dcb.Parity= ODDPARITY;            //Parität
                           SetCommState (hCom, &dcb);        //COM-Einstellungen speichern
                           break;
                case 3:    dcb.Parity= EVENPARITY;           //Parität
                           SetCommState (hCom, &dcb);        //COM-Einstellungen speichern
                           break;  
                case 4:    dcb.Parity= MARKPARITY;           //Parität
                           SetCommState (hCom, &dcb);        //COM-Einstellungen speichern
                           break;  
                case 5:    dcb.Parity= SPACEPARITY;          //Parität
                           SetCommState (hCom, &dcb);        //COM-Einstellungen speichern
                           break;
                default: goto neuParitaet;
        }
    
        
        //---------------------Stopbits festlegen------------------------------------------
        
        neuStopbits:
        cout << "Wieviel Stopbits sollen gesetzt werden: " << endl <<
                "---------------------------------------" << endl <<
                "[1] 1 Stopbit" << endl <<
                "[2] 2 Stopbits" << endl <<
                "[3] 1,5 Stopbits" << endl <<
                "-------------" << endl <<
                "Ihre Eingabe: ";
                
        cin >> Stopbit;
        cout << endl;
        
        switch(Stopbit)
        {
                case 1:    dcb.StopBits= ONESTOPBIT;         //Stopbits
                           SetCommState (hCom, &dcb);        //COM-Einstellungen speichern
                           break; 
                case 2:    dcb.StopBits= TWOSTOPBITS;        //Stopbits
                           SetCommState (hCom, &dcb);        //COM-Einstellungen speichern
                           break; 
                case 3:    dcb.StopBits= ONE5STOPBITS;       //Stopbits
                           SetCommState (hCom, &dcb);        //COM-Einstellungen speichern
                           break; 
                default: goto neuStopbits;
        }
    
      
        //----------------------------Eingaben prüfen--------------------------------------
        
    
        cout << "Sind diese Eingaben OK?" << endl <<
            "-----------------------" << endl <<
            "[1] Ja" << endl <<
            "[2] Nein" << endl <<
            "-------------" << endl <<
            "Ihre Eingabe: ";
    
        cin >> ok;
        cout << endl;
        
        switch(ok)
        {       
                case 1:    goto menue;
                           break;
                case 2:    goto neuBaudrate;
                           break;
                default: goto neuBaudrate;          
        }
    
      {
           system("cls");      //löscht Bildschirm        
    }
              
    }            
        
         
        dcb.DCBlength = sizeof(DCB);      //Länge des Blockes muss gesetzt werden
        SetCommMask (hCom, EV_RXCHAR);    //Kontrolliert ob an RXD-Leitung Daten ankommen
    
    
    
    COMMTIMEOUTS ct;
    ct.ReadIntervalTimeout = MAXDWORD;
    ct.WriteTotalTimeoutConstant = 0;
    ct.ReadTotalTimeoutMultiplier = 0;
    ct.WriteTotalTimeoutConstant = 0;
    ct.WriteTotalTimeoutMultiplier = 0;
    SetCommTimeouts (hCom, &ct);
    
    if(!SetCommTimeouts(hCom, &ct))
    {
                               CloseHandle(hCom);
                               cout << "Fehler SetCommTimeouts";
    }
    
    //-------------------------------Bytes auslesen------------------------------------------
    
    if(eingabe==3)
    {
                  DWORD dwRead;
                  char chRead;
                  cout << dcb.BaudRate << endl
                  << dcb.ByteSize << endl
                  << dcb.Parity << endl
                  << dcb.StopBits;
    
                  do
                  {
                        
                         
                         if(ReadFile(hCom, &chRead, 1, &dwRead, NULL));
                          {          
                                    if(dwRead)
                                    {
                                             
                                               printf("%c<%03u>", chRead, chRead, chRead);
                                              
                                    }
                          }
                          
                            } while(1);
    
    
    
    }
    
        system("PAUSE");
        return EXIT_SUCCESS;
    }

  2. #32
    Neuer Benutzer Öfters hier
    Registriert seit
    02.09.2009
    Beiträge
    18
    Es ist egal, was ich bei meiner Software einstelle, die Daten werden nur richtig angezeigt, wenn ich bei deinem XTerm Baud 9600 einstelle....
    Sonst kommen nur seltsame zeichen an.

  3. #33
    Neuer Benutzer Öfters hier
    Registriert seit
    02.09.2009
    Beiträge
    18
    Ah, wenn ich SetCommState() nicht überall bei den Einstellungen dazuschreibe, scheint es zu funktionieren.

    Also die Baudrate kann ich jetzt verstellen, aber die Stopbits und Datenbitanzahl nicht ...

  4. #34
    Neuer Benutzer Öfters hier
    Registriert seit
    02.09.2009
    Beiträge
    18
    Also, das einzige Problem ist jetzt noch die Datenbitanzahl, damit stimmt irgendetwas nicht. Außerdem hab ich noch keine Lösung für die Endlosschleife. Über Tipps wär ich sehr dankbar.

    Gruß

  5. #35
    Erfahrener Benutzer Roboter Experte Avatar von BurningWave
    Registriert seit
    22.12.2007
    Ort
    nahe Stuttgart
    Alter
    30
    Beiträge
    656
    Also, das einzige Problem ist jetzt noch die Datenbitanzahl, damit stimmt irgendetwas nicht. Außerdem hab ich noch keine Lösung für die Endlosschleife. Über Tipps wär ich sehr dankbar.
    Ich hoffe ja nicht, dass in meinem Progamm diesbezüglich irgendwas nicht stimmt.

    Was stört dich denn an der Endlosschleife? Die scheint doch zu funktionieren oder? Außerdem empfehle ich dir if(!(cin >> irgendeinevar)) stat nur cin zu schreiben, da man nie wissen kann was der Benutzer eingibt (wenn man das nicht macht stürzt das Programm ja ab) und dann irgendeine Fehlerbehandlungsroutine einbaut (z.B. mit MessageBox).

  6. #36
    Neuer Benutzer Öfters hier
    Registriert seit
    02.09.2009
    Beiträge
    18
    Also, ich glaub mein Programm funktioniert soweit. Das mit den Datenbits lass ich jetzt einfach mal. Allerdings zeigt mir das Programm die Daten als ASCII-Code an. Gibt es eine Möglichkeit es einfach als Binärcode darzustellen?

  7. #37
    Erfahrener Benutzer Roboter Experte Avatar von BurningWave
    Registriert seit
    22.12.2007
    Ort
    nahe Stuttgart
    Alter
    30
    Beiträge
    656

Seite 4 von 4 ErsteErste ... 234

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad