Funktion die auf die serielle Schnittstelle zugreift



  • Hi @all,
    es tut mir jetzt schon leid, daß ich mit meinem ersten post etwas über die serielle schnittstelle wisssen will, aber ich verstehe es einfach nicht, ich glaub ich bin zu dumm dazu 😕

    Ich habe folgendes Problem:
    Ich möchte einen Industrie-Regler über die serielle Schnittstelle ansprechen (An der seriellen Schnittstelle hängt eine CAN-Bus-Wandler-Karte).
    Er erwartet zum Beispiel folgende Werte:

    Größe der Meldung = 10d
    Teilnehmer = 12d
    Bezeichnung der sendenden Anwendung = 01d
    Operationscode = 11d
    Verwaltung der Meldungen = 00d; 01d
    Index = 45d; 29d
    Unterindex = 00d
    Prüfsumme hBytes = 00d
    Prüfsumme lBytes = 109d

    Die serielle Schnittstelle soll immer nachfolgend Konfiguriert sein:

    8 Datenbits
    1 Stoppbit
    Kein Paritätsbit
    Übertragungsraten zwischen 9600 und 115200

    Kann mir irgend jemand den helfenden Rahmen erklären? Bin für jede Hilfe dankbar!

    Vielen Dank schonmal im Voraus

    Gruß Hendrik



  • Welches Betriebssystem verwendest Du?

    ISO-C++ ist eine Programmiersprache.

    Was Du suchst sind aber Systemfunktionen Deines Betriebssystems.



  • Marc++us schrieb:

    Welches Betriebssystem verwendest Du?

    ISO-C++ ist eine Programmiersprache.

    Was Du suchst sind aber Systemfunktionen Deines Betriebssystems.

    Ich verwende WinXP.
    Verstehe ich jetzt nicht, wieso eine Systemfunktion?
    Ich kann doch mit C++ die Serielle Schnittstelle ansprechen und dann Daten mittels eines C++ Programms an die serielle Schnittstelle senden.

    Ich bräuchte also Informationen wie ich die serielle schnittstelle wie oben angegeben unter c++ Konfiguriere.

    Leider kann ich erst heute abend oder am Wochenende testen ob ich die unten gefundene Funktion nehmen kann um meine Werte auf der Seriellen Schnittstelle auszugeben.

    Das HEADER-FILE ist: 
    //-HEADER-Datei-für-SensorbusKommunikation.cpp------------------------------- 
    #ifndef RS232 
    #define RS232 
    //-Include-Anweisungen------------------------------------------------------- 
    
    //--------------------------------------------------------------------------- 
    HANDLE Open_Comport (DWORD Comport, DWORD BaudRate); 
    
    int Close_Comport (HANDLE DriverHandle); 
    
    int Write_Comport (HANDLE DriverHandle, DWORD NumBytes, void *Buffer); 
    
    int Read_Comport (HANDLE DriverHandle, DWORD *BytesRead, DWORD BufferSize, void *Buffer,DWORD tout_dw); 
    //--------------------------------------------------------------------------- 
    #endif 
    
    Hier noch ein kleines Bsp. zur Anwendung: 
    //------------------------------------------------------ 
    extern HANDLE  DriverHandle; 
    
    HANDLE com_status_h;       // saves COM Status 
    int portnr_c = 1;          // stores COM-Port number 
    DWORD baudrate_dw = 9600;  // stores Baudrate 
    bool open_com_b = false;   // set if COM opened 
    DWORD rec_bytes_dw = 0;    // number of received bytes 
    
    bool par_enable_b;         // flag if parity is enabled 
    char protocol_c = 0;       // stores protokol type 
    char databits_c = 8;       // stores number if data bits 
    char paritbit_c = 0;       // stores type of parity bit 
    char stopbits_c = 0;       // stores number of stop bits 
    
    extern COMMTIMEOUTS timeouts; 
    
    char send_buf_c[100] = {0}; // Sendepuffer 
    char rec_buf_c[100] = {0};  // Empfangspuffer 
    
    //------------------------------------------------------ 
    Port Öffnen: 
      if(!open_com_b) 
      { 
        com_status_h = Open_Comport (portnr_c, baudrate_dw); 
        if (com_status_h == 0)   // error in opening port 
        { 
          Memo->Lines->Add("Öffnen des COM-Port Fehlgeschlagen"); 
        } 
        else 
        { 
          Memo->Lines->Add("COM-Port erfolgreich Geöffnet!"); 
          open_com_b = true;      // set flag that port is opened 
        } 
      } 
      else 
        Memo->Lines->Add("COM-Port ist bereits Geöffnet"); 
    //------------------------------------------------------ 
    
    // und Hier will ich dann meine Werte von Oben reinschreiben!!!
    Daten fürs Senden vorbereiten: 
      send_buf_c[0] = 0x53; 
      send_buf_c[1] = 0x69; 
      send_buf_c[2] = 0xAF; 
    
    Daten Senden: 
      Write_Comport(com_status_h, 3, &send_buf_c); 
    //------------------------------------------------------ 
    
    Daten Empfangen:   // Wird bei mir direkt nach Write_Comport ausgeführt 
      Read_Comport (com_status_h,    // Fest - True falls Port geöffnet 
                    &rec_bytes_dw,   // Fest - Anzahl der Empfangenen Bytes 
                    19,              // Variabel - Empfange maximal 19 Bytes (für char) 
                    &rec_buf_c,      // Variabel - Empfangspuffer (min. 19 Bytes groß) 
                    2000);           // Variabel - Timeout nach 2 sec. 
    
    //------------------------------------------------------ 
    
    Port Schliessen: 
      if (open_com_b)      // is port still opend? 
      { 
       open_com_b = false;           // reset flag 
       Close_Comport (com_status_h); // close com port 
      } 
    
    //------------------------------------------------------
    

    An der Seriellen Schnittstelle ist wie schon geschrieben eine CAN-Bus-Wandler Karte angeschlossen. Die Karte wandelt die Daten die Sie über die Serielle Schnittstelle bekommt in eine CAN-Bus-Meldung um (http://www.parvex.com/pdf/german/tech/3533-D.pdf).
    So wie ich es verstanden habe müßte es doch dann unter c++ gehen (unter der Adresse sind Beispiele unter Delphi angegeben, ich kann die aber leider nicht auf c++ umsetzen).

    Schönen Gruß Hendrik



  • Standard-C++ kennt keine seriellen Schnittstellen. Das heißt nicht, daß man mit C++ sowas nicht ansprechen kann, aber man kann es nicht ohne Hilfe einer Bibliothek oder des OS tun.

    Das Beispiel von Dir sieht aus, als stammt es aus DOS-Zeiten.
    Unter Windows kannst Du die WinAPI verwenden. Zugriff geht ähnlich wie auf Dateien. Am besten fragst Du mal im WinAPI-Forum nach, wenn Du genaueres wissen willst.

    Ich habe auch mal eine Klasse zur Benutzung des COM-Ports geschrieben, die kann ich Dir wenn Du willst gerne schieken.

    MfG Jester



  • Jester schrieb:

    Standard-C++ kennt keine seriellen Schnittstellen. Das heißt nicht, daß man mit C++ sowas nicht ansprechen kann, aber man kann es nicht ohne Hilfe einer Bibliothek oder des OS tun.

    Das Beispiel von Dir sieht aus, als stammt es aus DOS-Zeiten.
    Unter Windows kannst Du die WinAPI verwenden. Zugriff geht ähnlich wie auf Dateien. Am besten fragst Du mal im WinAPI-Forum nach, wenn Du genaueres wissen willst.

    Ich habe auch mal eine Klasse zur Benutzung des COM-Ports geschrieben, die kann ich Dir wenn Du willst gerne schieken.

    MfG Jester

    Hi Jester,
    Danke für die Antwort, dann ist doch ein größeres Problem es zu realisieren.
    Wäre sehr nett wenn du mir deine Klasse mal zuschickst (950950@web.de).
    Gut dann Probiere ich es mal im WinAPI-Bereich.
    Ich hatte das noch so leicht in Erinnerung unter Pascal oder ASM, schade! 😞

    Schönen Gruß Hendrik



  • Jester schrieb:

    Am besten fragst Du mal im WinAPI-Forum nach, wenn Du genaueres wissen willst.

    Noch besser: er sucht sich eines der folgenden Foren aus, und wirft dort einen Blick in die FAQ:
    MFC, VCL, WinAPI
    Es gibt in jedem Forum einen passenden Beitrag mit Erklärungen dazu.

    -junix

    btw: auch mit WinAPI ist das leicht. (sogar leichter)


Anmelden zum Antworten