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?