Comport zwar offen, kann aber nicht senden oder empfangen.



  • Hi!

    Ich versuch gerade einen ComPOrt verbindung herzustellen. Die Funktion um zu überprüfen, ob der Comport geöffnet ist, gibt mir ein True zurück, allerdings kann ich weder daten senden noch empfanden. Woran kann das liegen? Was ich auch aus technischer Sicht nicht ganz verstehe sind die iTimeout iTotalTimeout Variablen in der Klasse. Wenn ich über ein andere Tool zuvor eine RS232 Verbindung hergestellt habe, dann klappt's auch danach mit meiner. Mach ich einen Etablierungsfehler?

    Hier mein Code im Prog! (isOpen wirft mir ein True zurück, sowie für alle anderen RS232 Tools ist dieser Comport gesperrt!)

    Meine Umgebung ist VC++ 7 Win2000!

    Ich wäre um Hilfe echt froh!!!! DANKE!!!

    //[...]
        //Comport test
    
        port.Init(com/*iPort*/,9600/*iBaud*/,8/*iSize*/,0/*iParity*/,1/*stopbit*/,0/*fRtsControl*/,100/*iTimeout*/,1000/*iTotalTimeout*/);
        bool comtest;   
        comtest = port.isOpen();
        port.Send("*IDN?;\n",7);
        port.Close();
    
        //Comport test
    
    //[...]
    //Klasse
    
    //HEADER
    
    // Seriellport.h: Schnittstelle für die Klasse CSERIELL.
    
    #if !defined(SERIELLPORT_H)
    #define SERIELLPORT_H
    
    #if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    
    #include <windows.h>
    
    class CSERIELL  
    {
    public:
        CSERIELL();                                     
        ~CSERIELL();    
        bool Init(int iPort, int Baud =9600, int Size =8, int Parity =0, int stopbit=0, int fRtsControl =2, int Timeout =100, int TotalTimeout =1000); 
        int Receive(void *PUFFER, int MAXBYTES);        
        bool Send(void *PUFFER, unsigned int nBYTES);   
        bool Close();
        char* Geterror();
    
        bool isOpen();                                  
    
    private:
        char* m_error;
        HANDLE m_hPort;
    };
    
    #endif 
    
    //Source CPP
    
    // Seriellport.cpp: Implementierung der Klasse CSERIELL.
    //
    
    #include "stdafx.h"
    #include "Seriellport.h"
    #include <stdio.h>
    #include <iostream.h>
    
    CSERIELL::CSERIELL()
    {
        this->m_error= NULL;
        this->m_hPort= 0;                        
    }
    
    CSERIELL::~CSERIELL()
    {
        this->Close();                           
    }
    
    //sendet Daten zur seriellen Schnittstelle
    bool CSERIELL::Send(void *puffer, unsigned int len)
    {
        DWORD written= 0;                       
        if(isOpen())
        {                                       
            WriteFile(this->m_hPort, puffer, len, &written, NULL);
        }
        if(len == written)                      
            return true;
    
        return false;
    }
    
    //holt Daten von der seriellen Schnittstelle
    int CSERIELL::Receive(void *puffer, int len)
    {
        DWORD receive=0;
        if(m_hPort !=0 && len >0)
        {
            ReadFile(m_hPort, puffer, len, &receive, NULL);
        }
        if(receive==0)
    
        return receive;
    }
    
    //schließt die serielle Schnittstelle
    bool CSERIELL::Close()
    {
        if(isOpen())
        {
            CloseHandle(this->m_hPort);
            this->m_hPort= 0;    
            return true;
        }
        return false;
    }
    
    //Ist serielle Schnittstelle offen
    bool CSERIELL::isOpen()
    {
        if(m_hPort >0)
            return true;
    //  this->m_error= ERROR_port_init;
        return false;
    }
    
    char* CSERIELL::Geterror()
    {
        return m_error;
    }
    
    bool CSERIELL::Init(int iPort, int iBaud, int iSize, int iParity, int stopbit, int fRtsControl, int iTimeout, int iTotalTimeout)
    {
        char port[]= "COM0123456789:";          
        sprintf(port, "COM%i:", iPort);
    
        m_hPort = CreateFile(   port, 
            GENERIC_READ | GENERIC_WRITE, 
            0, 
            NULL, 
            OPEN_EXISTING,
            FILE_ATTRIBUTE_NORMAL, 
            NULL);
        if((int)this->m_hPort == -1)         //COMx ist nicht vorhanden
                this->m_hPort=0;
        if(this->m_hPort !=0)                    
        {
            COMMTIMEOUTS comtime;   
            GetCommTimeouts(this->m_hPort, &comtime);
            comtime.ReadIntervalTimeout= iTimeout;
            comtime.ReadTotalTimeoutConstant= iTotalTimeout;
            comtime.WriteTotalTimeoutConstant= iTotalTimeout;
            comtime.ReadTotalTimeoutMultiplier=2;
            comtime.WriteTotalTimeoutMultiplier=0;
            SetCommTimeouts(this->m_hPort, &comtime);
    
            DCB dcb;           //Gerätekommunikationsanpassung
            GetCommState(this->m_hPort, &dcb);
            dcb.BaudRate= iBaud;
            dcb.ByteSize= iSize;
            dcb.DCBlength= 28;
            dcb.EofChar= 0;
            dcb.ErrorChar= 0;
            dcb.fRtsControl= fRtsControl;
            dcb.Parity= iParity;
            dcb.StopBits= stopbit;
            dcb.fInX=0;
            dcb.fOutX=0;
    
        SetCommState(this->m_hPort, &dcb);
        return true;
        }
    
        return false;
    }
    


  • also mit VC++6 und Win98, WinNT, Win2K und WinXP funzt das Orginal Deiner Klasse 😉



  • port.Init(com/*iPort

    Hier solltest du einen Port angeben und nicht com reinschreiben.

    Weiters mal einen Debug machen was die einzelnen Funktionen zurückliefern.

    [ Dieser Beitrag wurde am 06.05.2003 um 06:30 Uhr von Unix-Tom editiert. ]



  • Also die einzelnen Funktionen liefern jeweils 'ne 1 bzw True zurück. Bei com handelt sich um 'ne Variabel, aber die wird schon richtig gesetzt, ich hab das nu hier aus meinem Code ausgeschnitten. Ich werde mal etwas probeweise unter c++ 6 kompilieren, und wenn es dort klappt habi ch definitiv ein Problem... hmm..



  • Schuss ins Blaue:
    Nimm mal den Doppelpunkt aus dem Formatstring raus.


Anmelden zum Antworten