Serielle Schnittstelle - Serielle Daten



  • Hallo,

    ich habe ein Gerät was über die Serielle Schnittstelle Daten wie
    &GPP 122,12,34,67,43,678,423,0,0,0,0,0,67
    sendet. Meine Frage wie kann ich diese Daten in mein Programm einlesen und bearbeiten.

    z.B. das ich für jede Zahl eine Variable nutzen kann also:

    &GPP 122,12,34,67,43,678,423,0,0,0,0,0,67
    a, b, c, b, e, f, g,h,i,j,k,l,m

    ds er also die Zahlen zwischen den Komma in einer Variable schreibt.



  • Jo da hab ich doch noch ein Stück Code auf meinem PC mit Serialerschnit... (ja dinksta bumsta, ihr wist schon)

    3
    /*
    Wichtig ist dabei die Zeile #define PORT 0x2F8
    da mußt du bei dir in der Systemsteuerung (GeräateManager) welcher E/A Beraich (Heißt so bei XP) nachschauen.
    */
    
    /* Ampel.cpp  Ampelschaltung */
    #include <stdio.h>
    #include <time.h>
    #include <conio.h>
    
    #define PORT 0x2F8
    unsigned int bits;
    
    void warten(int sekunden)
      {
      clock_t start;
      sekunden *= CLOCKS_PER_SEC;
      start = clock();
      while( clock() < start + sekunden)
        ;
      }
    
    // Funktionen für Schaltzustände
    void rot()
      {
      printf("\nrot");
      outp(PORT+4, inp(PORT+4) | 0x2 );          // Rot = RTS setzen
      outp(PORT+4, inp(PORT+4) & 0xFE);
      outp(PORT+3, inp(PORT+3) & 0xBF);
      warten(10);
      }
    
    void rot_gelb()
      {
      printf("\nrot\tgelb");
      outp(PORT+4, inp(PORT+4) | 0x2);          // Rot = RTS setzen
      outp(PORT+4, inp(PORT+4) | 0x1);          // Gelb = DTR setzen
      outp(PORT+3, inp(PORT+3) & 0xBF);
      warten(2);
      }
    
    void gruen()
      {
      printf("\n\t\tgruen");
      outp(PORT+3, inp(PORT+3) | 0x40);         // Gruen = TxD setzen
      outp(PORT+4, inp(PORT+4) & 0xFE);
      outp(PORT+4, inp(PORT+4) & 0xFD);
      warten(6);
      }
    
    void gelb()
      {
      printf("\n\tgelb");
      outp(PORT+4, inp(PORT+4) | 0x1);          // Gelb = DTR setzen
      outp(PORT+4, inp(PORT+4) & 0xFD);
      outp(PORT+3, inp(PORT+3) & 0xBF);
      warten(3);
      }
    
    // Array von Zeigern auf Funktionen
    void (*fpointer[4]) ();
    
    int main()
      {
      int i;
    
      // Zeiger initialisieren (mit Funktionen)
      fpointer[0]=rot;
      fpointer[1]=rot_gelb;
      fpointer[2]=gruen;
      fpointer[3]=gelb;
    
      // Array durchlaufen (Ampel in Betrieb nehmen)
      for (i=0; i<=3; i++)
        fpointer[i]();
    
      return 0;
      }
    


  • Wo hat sich in den vielen Zeilen denn nur die MFC versteckt images/smiles/icon_confused.gif images/smiles/icon_confused.gif

    MfG veganza



  • Hallo SaM,

    Die Serielle Schnittstelle wir unter Windows wie eine Datei behandelt,
    also mit ReadFile / WriteFile.

    für jede Zahl eine Variable ? ich würde ein Array nehmen, kommt jedoch auf den Verwendungszweck an.

    Ein kleines Beispiel wie du die Eingelesenen Daten ( als String eingelesen )
    in ein Int-Array speicherst und die Kommas rausfilterst.

    Solten ausßer "," und Zahlen noch andere Zeichen gesendet werden,
    müßen diese noch herausgefiltert werden.

    CString strEmpfang;
    
        // deine empfangen Daten
        strEmpfang.Format("122,12,34,67,43,678,423,0,0,0,0,0,67");
    
        int iaDeineZahlen[100];   // ein Array mit deinen Zahlen
    
        if (strEmpfang.GetLength() != 0)
        {   
            CString strTemp;
            CString strZahl;
    
            strTemp.Format("%s",strEmpfang); 
    
            int iFind =0; 
            int nCount = 0;  // druchlaufzähler
    
            while (iFind != -1)
            {
                iFind = strTemp.FindOneOf(",");
                int iLength = strTemp.GetLength();
    
                // weil am Schluß kein Komma ist 
                if (iFind != -1)
                    strZahl.Format("%s",strTemp.Left(iFind ));
                else
                    strZahl.Format("%s",strTemp.Right(iLength -iFind -1));
    
                strTemp.Format("%s",strTemp.Right(iLength -iFind -1));
    
                // eingelesene Zahl speichern
                iaDeineZahlen[nCount] = atoi(strZahl);
                nCount++; // weiterzählen
                //MessageBox(strZahl,strTemp);
            } 
    
            CString test;
    
            for (int ii = 0; ii<nCount;ii++)
            {
                test.Format("%d",iaDeineZahlen[ii]);
                MessageBox(test);
            }
        }
    


  • -see signature-

    So far ...



  • Hallo,

    das mit dem String habe ich hinbekommen aber probehalber erstmal nur mit einer Datei. Jetzt habe ich mich gefragt wie ich mit ReadFile und WriteFile Arbeiten muß damit überhaupt etwas passiert. images/smiles/icon_rolleyes.gif

    gruß SaM



  • Hallo SaM,

    Schnittstelle öffnen zb. mit CreateFile mit dem zurückgegebene HANDLE zb. hComm
    ReadFile(hComm,..)
    im Prinzip wie bei einer Datei jedoch müssen die Daten an der Schnittstelle erst vorhanden sein.
    Es giebt auch eine Benachichtigungsfunktion wenn daten vorhanden sind,
    die fällt mir aber gerade nicht ein ich muß erst mal suchen.

    Ein Beispiel aus der Suche hir im Forum http://www.c-plusplus.net/ubb/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=1&t=004847

    PS: Cookies annehmen, die gespeichet sind, dann klappts auch mit dem Registrierten Namen.

    [ Dieser Beitrag wurde am 01.02.2002 um 22:38 Uhr von Paul editiert. ]



  • // Seriellport.h: Schnittstelle für die Klasse CSERIELL.
    
    #if !defined(SERIELLPORT_H)
    #define SERIELLPORT_H
    
    #if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    
    #include <windows.h>
    
    class CSERIELL  
    {
    public:
        CSERIELL();                                     
        ~CSERIELL();    
        bool Init(int iPort, int Baud =9600, int Size =8, int Parity =0, int stopbit=0, int fRtsControl =2, int Timeout =100, int TotalTimeout =1000); 
        int Receive(void *PUFFER, int MAXBYTES);        
        bool Send(void *PUFFER, unsigned int nBYTES);   
        bool Close();
        char* Geterror();
    
        bool isOpen();                                  
    
    private:
        char* m_fehler;
        HANDLE m_hPort;
    };
    
    #endif 
    
    // Seriellport.cpp: Implementierung der Klasse CSERIELL.
    //
    
    #include "stdafx.h"
    #include "Seriellport.h"
    #include <stdio.h>
    #include <iostream.h>
    
    CSERIELL::CSERIELL()
    {
        this->m_error= NULL;
        this->m_hPort= 0;                        
    }
    
    CSERIELL::~CSERIELL()
    {
        this->Close();                           
    }
    
    /sendet Daten zur seriellen Schnittstelle
    bool CSERIELL::Send(void *puffer, unsigned int len)
    {
        DWORD written= 0;                       
        if(isOpen())
        {                                       
            WriteFile(this->m_hPort, puffer, len, &written, NULL);
        }
        if(len == written)                      
            return true;
    
        return false;
    }
    
    //holt Daten von der seriellen Schnittstelle
    int CSERIELL::Receive(void *puffer, int len)
    {
        DWORD receive=0;
        if(m_hPort !=0 && len >0)
        {
            ReadFile(m_hPort, puffer, len, &receive, NULL);
        }
        if(receive==0)
    
        return receive;
    }
    
    //schließt die serielle Schnittstelle
    bool CSERIELL::Close()
    {
        if(isOpen())
        {
            CloseHandle(this->m_hPort);
            this->m_hPort= 0;    
            return true;
        }
        return false;
    }
    
    //Ist serielle Schnittstelle offen
    bool CSERIELL::isOpen()
    {
        if(m_hPort >0)
            return true;
    //  this->m_error= ERROR_port_init;
        return false;
    }
    
    char* CSERIELL::Geterror()
    {
        return m_error;
    }
    
    bool CSERIELL::Init(int iPort, int iBaud, int iSize, int iParity, int stopbit, int fRtsControl, int iTimeout, int iTotalTimeout)
    {
        char port[]= "COM0123456789:";          
        sprintf(port, "COM%i:", iPort);
    
        m_hPort = CreateFile(   port, 
            GENERIC_READ | GENERIC_WRITE, 
            0, 
            NULL, 
            OPEN_EXISTING,
            FILE_ATTRIBUTE_NORMAL, 
            NULL);
        if((int)this->m_hPort == -1)         //COMx ist nicht vorhanden
                this->m_hPort=0;
        if(this->m_hPort !=0)                    
        {
            COMMTIMEOUTS comtime;   
            GetCommTimeouts(this->m_hPort, &comtime);
            comtime.ReadIntervalTimeout= iTimeout;
            comtime.ReadTotalTimeoutConstant= iTotalTimeout;
            comtime.WriteTotalTimeoutConstant= iTotalTimeout;
            comtime.ReadTotalTimeoutMultiplier=2;
            comtime.WriteTotalTimeoutMultiplier=0;
            SetCommTimeouts(this->m_hPort, &comtime);
    
            DCB dcb;           //Gerätekommunikationsanpassung
            GetCommState(this->m_hPort, &dcb);
            dcb.BaudRate= iBaud;
            dcb.ByteSize= iSize;
            dcb.DCBlength= 28;
            dcb.EofChar= 0;
            dcb.ErrorChar= 0;
            dcb.fRtsControl= fRtsControl;
            dcb.Parity= iParity;
            dcb.StopBits= stopbit;
            dcb.fInX=0;
            dcb.fOutX=0;
            dcb.fAbort O n E r r o r = 1;  //Bitte hier die leerzeichen 
                    // wegmachen. Vermutlich Bug im Forum
        SetCommState(this->m_hPort, &dcb);
        return true;
        }
    
        return false;
    }
    

    Die ist eine Klasse um mit der Serielle Schnittstelle zu arbeiten.

    Header und cpp-datei.

    Terminator hat eine Möglichkeit gezeigt wie sie unter WinNT nicht funktioniert. Ob sie WINNT funzt kann ich nicht testen.
    W2K läßt aber solche zugriffe nicht zu. Deshalb die ´behandlung des Comports als File.

    [ Dieser Beitrag wurde am 01.02.2002 um 23:56 Uhr von Unix-Tom editiert. ]

    [ Dieser Beitrag wurde am 01.02.2002 um 23:57 Uhr von Unix-Tom editiert. ]

    [ Dieser Beitrag wurde am 01.02.2002 um 23:57 Uhr von Unix-Tom editiert. ]

    [ Dieser Beitrag wurde am 01.02.2002 um 23:59 Uhr von Unix-Tom editiert. ]

    [ Dieser Beitrag wurde am 02.02.2002 um 00:00 Uhr von Unix-Tom editiert. ]

    [ Dieser Beitrag wurde am 02.02.2002 um 00:00 Uhr von Unix-Tom editiert. ]

    [ Dieser Beitrag wurde am 02.02.2002 um 00:01 Uhr von Unix-Tom editiert. ]

    [ Dieser Beitrag wurde am 02.02.2002 um 00:03 Uhr von Unix-Tom editiert. ]


Anmelden zum Antworten