COM-port ansprechen



  • Hallo

    Mein Ziel ist es über den Com1 -port abzufragen ob ein Schalter geschlossen oder offen ist. Meine Überlegung: Über RTS sende ich ständig ein TRUE. RTS mit CTS über den Schalter kurzschließen und wenn CTS TRUE ist weiß ich das der Schalter geschlossen wurde.

    Ich habe es geschafft den RTS zu setzen kann aber nicht den CTS abfragen.

    Das ist mein (zusammengesuchter) 🙂 Code:

    cport.h

    #define WRONG_PORT 100
    #define ON true
    #define OFF false
    
    class ComPort
    {
    public:
    int SetOPEN (int PORT);
    int SetCLOSE (void);
    int SetDTR (bool mode);
    int SetRTS (bool mode);
    int SetTXD (bool mode);
    bool GetCTS ();
    bool GetDSR ();
    void SetAll (bool mode);
    };
    

    main.cpp

    #include "CPORT.H"
    #include <stdio.h>
    #include <conio.h>
    #include <windows.h>
    #include <atlbase.h>
    
    HANDLE hCom;
    DWORD COMStatus;
    
    LPWSTR foo(const char* s) {
    	USES_CONVERSION;
    	LPWSTR p = A2W(s); // ANSI to WIDE
    	return p;
    }
    
    int ComPort::SetOPEN(int PORT)
    {
    if(PORT<=0 || PORT>4)
    {
    return WRONG_PORT;
    }
    
    LPCSTR ansistr = "COM1"; 
    LPWSTR neuerStr = foo(ansistr);
    
    hCom = CreateFile(neuerStr,
    GENERIC_READ | GENERIC_WRITE,
    0,
    NULL,
    OPEN_EXISTING,
    0,
    NULL);
    
    return 0;
    }
    
    int ComPort::SetCLOSE()
    {
    CloseHandle(hCom);
    return 0;
    }
    
    int ComPort::SetDTR(bool mode)
    {
    if(mode==ON)
    {
    EscapeCommFunction(hCom, SETDTR); // setzen
    }
    else
    {
    EscapeCommFunction(hCom, CLRDTR); // Loeschen
    }
    return 0;
    }
    
    int ComPort::SetRTS(bool mode)
    {
    if(mode==ON)
    {
    EscapeCommFunction(hCom, SETRTS); // setzen
    }
    else
    {
    EscapeCommFunction(hCom, CLRRTS); // Loeschen
    }
    return 0;
    }
    
    int ComPort::SetTXD(bool mode)
    {
    if(mode==ON)
    {
    EscapeCommFunction(hCom, SETBREAK); // setzen
    }
    else
    {
    EscapeCommFunction(hCom, CLRBREAK); // Loeschen
    }
    return 0;
    }
    
    bool ComPort::GetCTS()
    {
    GetCommModemStatus(hCom, &COMStatus);
    if(COMStatus & MS_CTS_ON)
    {
    return ON;
    }
    return OFF;
    }
    
    bool ComPort::GetDSR()
    {
    GetCommModemStatus(hCom, &COMStatus);
    if(COMStatus & MS_DSR_ON)
    {
    return ON;
    }
    return OFF;
    }
    void ComPort::SetAll (bool mode)
    {
    SetRTS(mode);
    SetTXD(mode);
    SetDTR(mode);
    }
    
    void main(void){
    	BOOL Loop = TRUE;
    	ComPort comp;
    
    	while(Loop){
    
    		if( _kbhit() ){
    			Loop = FALSE;
    		}
    			if (comp.SetOPEN(1)!=100){			
    				comp.SetRTS(true);	
    				if (comp.GetCTS()== true){
    					printf ("schalter geschlossen\n");
    				}
    			}else{
    				printf("Wrong comport\n");
    		}
    	}	
    	comp.SetCLOSE();
    }
    

    Gruß Eisenschlumpf




Anmelden zum Antworten