#include "cls_COM.h" #include #include #include #include //================================================================== cls_COM::cls_COM(wchar_t *EinComPort, int EinParity, int EinBaudrate, int EinStopbit, int EinDatabit) { m_ComPort = EinComPort; m_Parity = EinParity; m_Baudrate = EinBaudrate; m_Stopbit = EinStopbit; m_Databit = EinDatabit; m_WaitTime = 500; } //================================================================== cls_COM::~cls_COM(void) { PortClose(); } //================================================================== std::string cls_COM::StatusMeldungAusgeben(void) { return m_StatusMeldung; } //================================================================== bool cls_COM::PortOpen(void) { // port erschaffen m_PortHandle = CreateFile(m_ComPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL); // port öffnen und mögliche fehler ausgeben if (m_PortHandle == INVALID_HANDLE_VALUE) { int error = GetLastError (); m_StatusMeldung = "Fehler: Kann den Port nicht öffnen! /n"; if (error == 2) { m_StatusMeldung = m_StatusMeldung + "Fehler: Der ausgewählte Port existiert nicht!"; } else if (error == 5) { m_StatusMeldung = m_StatusMeldung + "Fehler: Der Port wird bereits verwendet!"; } else { m_StatusMeldung = m_StatusMeldung + "Fehler: Windows error"; } m_PortHandle = 0; return false; } //öffnung erfolgreich //eigenschaften setzen DCB dcb; dcb.DCBlength = sizeof(DCB); // Konfigurationen des Ports setzen if (SetCommState(m_PortHandle, &dcb)) { m_StatusMeldung = "Fehler: Konnte Konfigurationen nicht setzen!"; return false; } dcb.BaudRate = m_Baudrate; // Baud Rate dcb.Parity = m_Parity; // Parity dcb.ByteSize = m_Databit; // Data Bits dcb.StopBits = m_Stopbit; // Stop Bits dcb.fBinary = TRUE; m_PortOpening = true; m_StatusMeldung = "Port ist offen"; return true; // öffnung erfolgreich } //================================================================== bool cls_COM::PortClose() { // Port schließen if(CloseHandle(m_PortHandle) == 0) { m_StatusMeldung = "Fehler: Konnte Port nicht schließen!"; return false; } m_PortOpening = false; m_StatusMeldung = "Port wurde geschlossen!"; return true; } //================================================================== bool cls_COM::PortSenden(std::string Befehl) { // gibt nach den senden die anzahl der gesendeten bytes wieder DWORD BytesSchreiben = 0; // befehl senden if (WriteFile(m_PortHandle, &Befehl, sizeof(Befehl), &BytesSchreiben, NULL) == 0) { m_StatusMeldung = "Fehler: Fehler beim Senden des Befehls!"; return false; } return true; } //================================================================== char* cls_COM::PortLesen(void) { DWORD BytesLesen = 0; char* EmpfangenenString; if(ReadFile(m_PortHandle, &EmpfangenenString, 14, &BytesLesen, NULL) == 0) // 14 bytes lesen { m_StatusMeldung = "Fehler: Fehler beim Port Lesen!"; return "Fehler"; } return EmpfangenenString; } //================================================================== double cls_COM::PositionLesen() { char *EmpfangenenString; double strecke; if(!PortSenden("e0")) { return -1; } // System.Threading.Thread.Sleep(500); EmpfangenenString = PortLesen(); strecke = atof(EmpfangenenString); // unsaubere lösung, muss noch besser und sicherer return strecke / 100; // EmpfangenenString = EmpfangenenString.Split('>')[0]; // if (double.TryParse(EmpfangenenString, out strecke)) // { // return strecke / 100; // } // else // { // return -1; // } } //================================================================== bool cls_COM::NullPunktSetzen() { if(!PortSenden("L")) { return false; } // System.Threading.Thread.Sleep(500); if(PortLesen() == ">") { m_StatusMeldung = "Nullpunkt Setzung erfolgreich!"; return true; } else { m_StatusMeldung = "Fehler: Nullpunkt Setzung fehlgeschlagen!"; return false; } } //================================================================== bool cls_COM::SoftwareReset() { if(!PortSenden("K")) { return false; } // System.Threading.Thread.Sleep(500); m_StatusMeldung = "Software Reset vermutlich ausgeführt!"; return true; } //================================================================== bool cls_COM::ZaehlrichtungFestlegen(bool auf) { if(auf) { if(!PortSenden("T0")) { return false; } // System.Threading.Thread.Sleep(500); if(PortLesen() == ">") { m_StatusMeldung = "Zählrichtung auf auf geändert!"; return true; } else { m_StatusMeldung = "Fehler: Zählrichtung konnte nicht geändert werden!"; return false; } } else { if(!PortSenden("T1")) { return false; } // System.Threading.Thread.Sleep(500); if(PortLesen() == ">") { m_StatusMeldung = "Zählrichtung auf ab geändert!"; return true; } else { m_StatusMeldung = "Fehler: Zählrichtung konnte nicht geändert werden!"; return false; } } } //==================================================================