Com Kommunikation



  • Hallo!
    Bin neu hier.
    Habe ein testprogrämchen geschrieben. kompilierung ergibt keine fehler, aber wenn ich den testknopf drücke kommt die meldung "Das System kann die angegebene Datei nicht finden"
    Was mache ich denn nicht richtig??? 😕
    Danke schonmal für die mühe!!
    Bullach

    void CTestDlg::OnTest() 
    {
    	CString strTemp=_T("parity= data= stop=");
    	strTemp.Insert(strTemp.Find(_T("data="))+5,_T("8"));
    	strTemp.Insert(strTemp.Find(_T("stop="))+5,_T("1"));
    	strTemp.Insert(strTemp.Find(_T("parity="))+7,_T("N"));
    
    	CSerial serial;
    
    	serial.Open(1,9600);
    
    	int test = 85 ;
    
    	HANDLE hCom;
    	hCom=CreateFile ("\\.\\COM1:",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
    
    	if (hCom==INVALID_HANDLE_VALUE)
    	{
    		MessageBox("Zugriff auf den COM-Port fehgeschlagen!\n\tSenden nicht möglich!");
    		return ;
    	}
    
    	[b]serial.Write(&test,7);[/b]
    	serial.Close();
    	return ;
    }
    


  • mach aus dem "\.\\COM1:" mal ein "\\\.\\COM1",



  • Habe die 2\ eingefügt und das ":" weg aber leider keine änderung.





  • bei mir sieht das ganze wie folgt aus:

    //ÖFFNEN
    	HANDLE Port; // steh bei mir in der Header
    	DCB PortConfig;
    	Port = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
    	if(GetCommState(Port,&PortConfig) == 0)
    	{
    		//hier fehlerbehandlung
    		return;
    	}
    	PortConfig.BaudRate = CBR_9600;
    	PortConfig.StopBits = ONESTOPBIT;
    	PortConfig.Parity = NOPARITY;
    	PortConfig.ByteSize = 8;
    	if(SetCommState(Port,&PortConfig) == 0)
    	{
    		//hier error;
    	}
    
    	//SENDEN
    	unsigned long length = 0;
    	CString sDaten = "hallo ich bin eine Nachricht";
    	if(WriteFile(Port, sDaten, sDaten.GetLength(), &length,NULL) == 0)
    	{
    		//hier fehlerbehandlung
    		return;
    	}
    

    mfg Emperor_L0ser



  • Funzt leider nicht. Ich programmiere unter WIN NT. Also sowohl mit meinem code als auch vom Emperor_LOser gibt es bei mir probleme bei der ersten fehlerbehandlung.

    void CTestDlg::OnTest() 
    {
        HANDLE hCom;
        hCom=CreateFile ("\\.\\COM1:",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
    
        if (hCom==INVALID_HANDLE_VALUE)
        {
            MessageBox("Zugriff auf den COM-Port fehgeschlagen!\n\tSenden nicht möglich!");
            return ;
        }
    
        CString strTemp=_T("parity= data= stop=");
        strTemp.Insert(strTemp.Find(_T("data="))+5,_T("8"));
        strTemp.Insert(strTemp.Find(_T("stop="))+5,_T("1"));
        strTemp.Insert(strTemp.Find(_T("parity="))+7,_T("N"));
    
        CSerial serial;
    
        serial.Open(1,9600);
    
        int test = 85 ;
    
        serial.Write(&test,7);
        serial.Close();
        return ;
    }
    


  • Wofür habe ich den Link zur Klasse gepostet. Geht es damit ?



  • ich verwende meinen code und es läuft wunderbar, auf meinem rechner läuft winxp.

    kann es eventuell sein, das dein Com-Port belegt ist und du eventuell COM2 benötigst, oder eventuell auf einem Laptop arbeitest, bei denen sämtliche Externe anschlüsse gerne deaktviert werden?



  • Ich habe schon eine Serial.h von naughter.com deshalb bin ich nicht weitergegangen.

    /*
    Module : SERIAL.H
    Purpose: Declaration for an MFC wrapper class for serial ports
    Created: PJN / 31-05-1999
    
    Copyright (c) 1999 - 2002 by PJ Naughter.  
    All rights reserved.
    
    */
    
    ///////////////////// Macros / Structs etc //////////////////////////
    
    #ifndef __SERIAL_H__
    #define __SERIAL_H__
    
    /////////////////////////// Classes ///////////////////////////////////////////
    
    ////// Serial port exception class ////////////////////////////////////////////
    
    void AfxThrowSerialException(DWORD dwError = 0);
    
    class CSerialException : public CException
    {
    public:
    //Constructors / Destructors
    	CSerialException(DWORD dwError);
    	~CSerialException();
    
    //Methods
    #ifdef _DEBUG
    	virtual void Dump(CDumpContext& dc) const;
    #endif
    	virtual BOOL GetErrorMessage(LPTSTR lpstrError, UINT nMaxError,	PUINT pnHelpContext = NULL);
    	CString GetErrorMessage();
    
    //Data members
    	DWORD m_dwError;
    
    protected:
    	DECLARE_DYNAMIC(CSerialException)
    };
    
    //// The actual serial class /////////////////////////////////////////////
    
    class CSerial : public CObject
    {
    public:
    //Enums
      enum FlowControl
      {
        NoFlowControl,
        CtsRtsFlowControl,
        CtsDtrFlowControl,
        DsrRtsFlowControl,
        DsrDtrFlowControl,
        XonXoffFlowControl
      };
    
      enum Parity
      {    
        EvenParity,
        MarkParity,
        NoParity,
        OddParity,
        SpaceParity
      };
    
      enum StopBits
      {
        OneStopBit,
        OnePointFiveStopBits,
        TwoStopBits
      };
    
    //Constructors / Destructors
      CSerial();
      virtual ~CSerial();
    
    //General Methods
      void Open( int nPort, DWORD dwBaud = 9600, Parity parity = NoParity, BYTE DataBits = 8, 
                StopBits stopbits = OneStopBit, FlowControl fc = NoFlowControl, BOOL bOverlapped = FALSE );
      void Close();
      void Attach(HANDLE hComm, BOOL bOverlapped = FALSE);
      HANDLE Detach();
      operator HANDLE() const { return m_hComm; };
      BOOL IsOpen() const { return m_hComm != INVALID_HANDLE_VALUE; };
    #ifdef _DEBUG
      void Dump(CDumpContext& dc) const;
    #endif
    
    //Reading / Writing Methods
      DWORD Read(void* lpBuf, DWORD dwCount);
      BOOL  Read(void* lpBuf, DWORD dwCount, OVERLAPPED& overlapped, DWORD* pBytesRead=NULL);
      void  ReadEx(void* lpBuf, DWORD dwCount);
      DWORD Write(const void* lpBuf, DWORD dwCount);
      BOOL  Write(const void* lpBuf, DWORD dwCount, OVERLAPPED& overlapped, DWORD* pBytesWritten=NULL);
      void  WriteEx(const void* lpBuf, DWORD dwCount);
      void  TransmitChar(char cChar);
      void  GetOverlappedResult(OVERLAPPED& overlapped, DWORD& dwBytesTransferred, BOOL bWait);
      void  CancelIo();
      DWORD BytesWaiting();
      BOOL  DataWaiting(DWORD dwTimeout);
    
    //Configuration Methods
      void GetConfig(COMMCONFIG& config);
      static void GetDefaultConfig(int nPort, COMMCONFIG& config);
      void SetConfig(COMMCONFIG& Config);
      static void SetDefaultConfig(int nPort, COMMCONFIG& config);
    
    //Misc RS232 Methods
      void ClearBreak();
      void SetBreak();
      void ClearError(DWORD& dwErrors);
      void GetStatus(COMSTAT& stat);
      void GetState(DCB& dcb);
      void SetState(DCB& dcb);
      void Escape(DWORD dwFunc);
      void ClearDTR();
      void ClearRTS();
      void SetDTR();
      void SetRTS();
      void SetXOFF();
      void SetXON();
      void GetProperties(COMMPROP& properties);
      void GetModemStatus(DWORD& dwModemStatus); 
    
    //Timeouts
      void SetTimeouts(COMMTIMEOUTS& timeouts);
      void GetTimeouts(COMMTIMEOUTS& timeouts);
      void Set0Timeout();
      void Set0WriteTimeout();
      void Set0ReadTimeout();
    
    //Event Methods
      void SetMask(DWORD dwMask);
      void GetMask(DWORD& dwMask);
      void WaitEvent(DWORD& dwMask);
      BOOL WaitEvent(DWORD& dwMask, OVERLAPPED& overlapped);
    
    //Queue Methods
      void Flush();
      void Purge(DWORD dwFlags);
      void TerminateOutstandingWrites();
      void TerminateOutstandingReads();
      void ClearWriteBuffer();
      void ClearReadBuffer();
      void Setup(DWORD dwInQueue, DWORD dwOutQueue);
    
    //Overridables
      virtual void OnCompletion(DWORD dwErrorCode, DWORD dwCount, LPOVERLAPPED lpOverlapped);
    
    protected:
      HANDLE m_hComm;       //Handle to the comms port
      BOOL   m_bOverlapped; //Is the port open in overlapped IO
      HANDLE m_hEvent;      //A event handle we need for internal synchronisation
    
      static void WINAPI _OnCompletion(DWORD dwErrorCode, DWORD dwCount, LPOVERLAPPED lpOverlapped); 
    
    	DECLARE_DYNAMIC(CSerial)
    };
    
    #endif //__SERIAL_H__
    


  • Es kann natürlich sein dass die GemPlus software den COM blockiert. Ich werde sie deinstalieren und es nochmal testen.

    Ja es lag daran, aber es läuft noch nicht ganz wie ich es will. Ich kann die Daten nur einmal an den COM senden, beim zweiten mal ist er blockiert und um erneut zu senden muss ich das prog neustarten.???



  • Also nochmal von vorne.
    ich habe das prog von Emperor-LOser vom 12:51:26 31.07.2004 bei mir eingegaut und zur überprüfung ein Nullmodem kabel über COM an einen zweiten rechner gelegt und das prog sendet nicht das was ich in sDaten eingebe.

    Mit einer anderen methode funzt es einwandfrei, aber sie ist vom code her viel aufwendiger, da ich dort eine datei sende. Ich würde gerne die deten direkt im quellcode eingeben.

    Kann mir jemand vielleicht weiterhelfen?
    Danke! 🙂



  • ich persönlich würde vermuten wollen, das

    CSerial serial; 
    serial.Open(1,9600);
    

    zusammen mit

    HANDLE hCom; 
        hCom=CreateFile ("\\.\\COM1:",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
    

    nicht funktioniert, da beide Anweisungen ja das selbe tun, nämlich den comport öffnen



  • hat sich erledigt!
    hatte nur vergessen den com-port zu schließen...



  • Mach dir nicht soviel Mühe. Microsoft liefert mit Visual C++ ein Active X für den COM Port Zugriff. Leider gut versteckt in der Online Hilfe Name: Communication Control MSCOM.ocx. Im Programmbeispiel VCTREM wird die Anwendung erklärt. Ein erstklassiges OCX das auch für Parallelports funktioniert kannst du unter www.jspayne.com (leider muss man das bezahlen ist aber jeden Cent Wert)herunterladen.



  • Mit der MFC wird ein ActiveX für den Zugriff auf die serielle Schnittstelle mitgeliefert, in der Online Hilfe nach CMSCOMM suchen. Anwendung findet sich im Beispiel VCTREM.
    Ein weiteres Control für Schnittstellen (auch Druckerschnittstellen) findet sich unter www.jspayne.com


Anmelden zum Antworten