RS232 in C



  • Hallo Leute,

    ich habe hier im FAQ ne Klasse gefunden um die RS232-Schnittstelle anzusprechen.
    Hier der Code:

    CPORT.H

    #ifndef CPORT_H 
    #define CPORT_H "cport.h" 
    
    #include <windows.h> 
    
    class ComPort 
    { 
    private: 
       HANDLE hCom; 
    public: 
       enum {OFF,ON}; 
       enum {MAX_PORT = 6}; 
       enum {STATE_ERR = -3, OPEN_ERR, WRONG_PORT, COMM_OK}; 
    
       ComPort(void); 
       ~ComPort(void); 
    
       HANDLE GetHCom(void); 
    
       int OpenCom(int portnr); 
       void CloseCom(void); 
    
       BOOL SetUART(DCB *dcb); 
       BOOL SetUART(long baud, char bytes, char parity, char stopbit); 
    
       BOOL SetTimeouts(COMMTIMEOUTS *timeouts); 
       BOOL SetTimeouts(long interval, int multiplier, int constant); 
    
       void SetDTR(int kz); 
       void SetRTS(int kz); 
       void SetTXD(int kz); 
       void SetAll(int kz); 
       void SetAll(int dtr, int rts, int txd); 
    
       BOOL GetCTS(void); 
       BOOL GetDSR(void); 
    
       unsigned long Send(const char *text); 
       unsigned long Receive(char *text, size_t maxsize); 
    
       static const char *GetCP(int index); 
    }; 
    
    #endif
    

    CPORT.C

    #include "cport.h" 
    
    ComPort::ComPort(void) 
    { 
       hCom=INVALID_HANDLE_VALUE; 
    } 
    
    ComPort::~ComPort(void) 
    { 
       CloseCom(); 
    } 
    
    HANDLE ComPort::GetHCom(void) 
    { 
       return hCom; 
    } 
    
    int ComPort::OpenCom(int portnr) 
    { 
       DCB dcb; 
       BOOL res; 
    
       if(portnr<=0||portnr>MAX_PORT) 
          return(WRONG_PORT); 
    
       hCom = CreateFile(GetCP(portnr-1), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); 
       if(hCom==INVALID_HANDLE_VALUE) 
          return(OPEN_ERR); 
    
       res=GetCommState(hCom, &dcb); 
       if(!res) 
       { 
          CloseCom(); 
          return(STATE_ERR); 
       } 
    
       return(COMM_OK); 
    } 
    
    void ComPort::CloseCom() 
    { 
       CloseHandle(hCom); 
       hCom=INVALID_HANDLE_VALUE; 
    } 
    
    BOOL ComPort::SetUART(DCB *dcb) 
    { 
       if(hCom!=INVALID_HANDLE_VALUE) 
          return(SetCommState(hCom, dcb)); 
       else 
          return(false); 
    } 
    
    BOOL ComPort::SetUART(long baud, char bytes, char parity, char stopbit) 
    { 
       if(hCom!=INVALID_HANDLE_VALUE) 
       { 
          DCB dcb; 
    
          dcb.BaudRate=baud; 
          dcb.ByteSize=bytes; 
          dcb.Parity=parity; 
          dcb.StopBits=stopbit; 
    
          return(SetCommState(hCom, &dcb)); 
       } 
       else 
          return(false); 
    } 
    
    BOOL ComPort::SetTimeouts(COMMTIMEOUTS *timeouts) 
    { 
       if(hCom!=INVALID_HANDLE_VALUE) 
          return(SetCommTimeouts(hCom, timeouts)); 
       else 
          return(false); 
    } 
    
    BOOL ComPort::SetTimeouts(long interval, int multiplier, int constant) 
    { 
       if(hCom!=INVALID_HANDLE_VALUE) 
       { 
          COMMTIMEOUTS timeouts; 
    
          timeouts.ReadIntervalTimeout=interval; 
          timeouts.ReadTotalTimeoutMultiplier=multiplier; 
          timeouts.ReadTotalTimeoutConstant=constant; 
    
          return(SetCommTimeouts(hCom, &timeouts)); 
       } 
       else 
          return(false); 
    } 
    
    void ComPort::SetDTR(int kz) 
    { 
       if(hCom!=INVALID_HANDLE_VALUE) 
          if(kz==ON) 
             EscapeCommFunction(hCom, SETDTR);  // setzen 
          else 
             EscapeCommFunction(hCom, CLRDTR);  // Loeschen   
    } 
    
    void ComPort::SetRTS(int kz) 
    { 
       if(hCom!=INVALID_HANDLE_VALUE) 
          if(kz==ON) 
             EscapeCommFunction(hCom, SETRTS);  // setzen 
          else 
             EscapeCommFunction(hCom, CLRRTS);  // Loeschen       
    } 
    
    void ComPort::SetTXD(int kz) 
    { 
       if(hCom!=INVALID_HANDLE_VALUE) 
          if(kz==ON) 
             EscapeCommFunction(hCom, SETBREAK);  // setzen 
          else 
             EscapeCommFunction(hCom, CLRBREAK);  // Loeschen     
    } 
    
    void ComPort::SetAll(int kz) 
    { 
       SetAll(kz, kz, kz); 
    } 
    
    void ComPort::SetAll(int dtr, int rts, int txd) 
    { 
       SetDTR(dtr); 
       SetRTS(rts); 
       SetTXD(txd); 
    } 
    
    BOOL ComPort::GetCTS(void) 
    { 
       if(hCom!=INVALID_HANDLE_VALUE) 
       { 
          DWORD COMStatus; 
    
          GetCommModemStatus(hCom, &COMStatus);   
          if(COMStatus & MS_CTS_ON) 
             return ON; 
    
          return OFF; 
       } 
       else 
          return OFF; 
    } 
    
    BOOL ComPort::GetDSR(void) 
    { 
       if(hCom!=INVALID_HANDLE_VALUE) 
       { 
          DWORD COMStatus; 
    
          GetCommModemStatus(hCom, &COMStatus);   
          if(COMStatus & MS_DSR_ON) 
             return ON; 
    
          return OFF; 
       } 
       else 
          return OFF; 
    } 
    
    unsigned long ComPort::Send(const char *text) 
    { 
       if(hCom!=INVALID_HANDLE_VALUE) 
       { 
          unsigned long sent; 
    
          WriteFile(hCom, text, strlen(text), &sent, NULL); 
    
          return(sent); 
       } 
       else 
          return(0); 
    } 
    
    unsigned long ComPort::Receive(char *text, size_t maxsize) 
    { 
       if(hCom!=INVALID_HANDLE_VALUE) 
       { 
          unsigned long received; 
    
          ReadFile(hCom, text, maxsize, &received, NULL); 
          text[received]=0; 
    
          return(received); 
       } 
       else 
          return(0); 
    } 
    
    const char *ComPort::GetCP(int index) 
    { 
       static const char *CP[]={"COM1","COM2","COM3","COM4","COM5","COM6"}; 
    
       if(index>-1&&index<ComPort::MAX_PORT) 
          return(CP[index]); 
       else 
          return(""); 
    }
    

    Meine Frage: Ist das C-Code?
    Wenn nein, wie schreibe ich das in C um?

    Weitere Frage: Kann mir jemand ein Beispiel schreiben (in C) wie man diese Klasse einsetzt? zB um eine Spannung an RTS anzulegen (möchte eine Glühbirne zum leuchten bringen)

    Vielen Dank.

    Grüße,
    rolly



  • wieso postest du den code, wenn er doch hier
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39312-and-postdays-is-0-and-postorder-is-asc-and-start-is-10.html
    in der faq steht?

    der code ist in c++.

    würde mich erstmal damit auseinandersetzen, bevor ich glühbirnen leuchten lasse, ist vielleicht nicht ungefährlich.



  • @elise: hast schon recht, ich hätte auch nen link posten können

    hmm, c++ also
    das EscapeCommFunction(hCom, SETDTR) kann ich doch aber auch in C benutzen oder? ist doch winapi?



  • rolly schrieb:

    das EscapeCommFunction(hCom, SETDTR) kann ich doch aber auch in C benutzen oder? ist doch winapi?

    http://www.cul.de/data/win32pr1.html


Anmelden zum Antworten