Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Serielle Schnittstelle macht seltsame Sachen!

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
22.01.2005, 13:27 Uhr
mstank



Moin Moin!

Da hab ich eine Methode mit der ich die serielle Schnittstelle auslesen möchte.

C++:
void CTestDialogDlg::OnStart()
{
    // TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen

    CSerialCom Serial;

    if (!Serial.OpenPort("COM1"))
    {    
        AfxMessageBox("Can't Open Port!");
    }
    
    Serial.ConfigurePort(4800, 8, FALSE, NOPARITY, TWOSTOPBITS);
//    char Data[100]="\0";
//    BYTE DataByte='\0';

for (int j=0; j<10; j++)
//    while (m_Stop)
    {

//        if (!Serial.OpenPort("COM1"))
//        AfxMessageBox("Can't Open Port!");
//        }
//        
//        Serial.ConfigurePort(4800, 8, FALSE, NOPARITY, TWOSTOPBITS);
        
        //Read data from GPS

        char Data[100]="\0";
    

        BYTE DataByte='\0';
        int nIndex=0;
        
        BOOL Return=Serial.ReadByte(DataByte);
        while (DataByte!='\r' && DataByte!='\n' && Return==TRUE)
        {
            Data[nIndex]=DataByte;
            nIndex++;
            Return=Serial.ReadByte(DataByte);
        }
        
        Data[nIndex++]='\r';
        Data[nIndex++]='\n';
        Data[nIndex++]='\0';
        
        //Remove garbage characters
        nIndex=0;
        while (Data[nIndex]!='$' && nIndex<100)
            nIndex++;
        
        for (int i=0; i<nIndex; i++)
        {
            sMsg.Format("%s",(const char *) Data);
        }
//    AfxMessageBox(sMsg);
        m_Ausgabe.AddString(sMsg);
    }

    Serial.ClosePort();
}




--------------------------------------------------------------------------------
Moin Moin!

Da hab ich eine Methode mit der ich die serielle Schnittstelle auslesen möchte.
C/C++ Code:

C++:
void CTestDialogDlg::OnStart()
{
    // TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen

    CSerialCom Serial;

    if (!Serial.OpenPort("COM1"))
    {    
        AfxMessageBox("Can't Open Port!");
    }
    
    Serial.ConfigurePort(4800, 8, FALSE, NOPARITY, TWOSTOPBITS);
//    char Data[100]="\0";
//    BYTE DataByte='\0';

for (int j=0; j<100; j++)
//    while (m_Stop)
    {

//        if (!Serial.OpenPort("COM1"))
//        AfxMessageBox("Can't Open Port!");
//        }
//        
//        Serial.ConfigurePort(4800, 8, FALSE, NOPARITY, TWOSTOPBITS);
        
        //Read data from GPS

        char Data[100]="\0";
    

        BYTE DataByte='\0';
        int nIndex=0;
        
        BOOL Return=Serial.ReadByte(DataByte);
        while (DataByte!='\r' && DataByte!='\n' && Return==TRUE)
        {
            Data[nIndex]=DataByte;
            nIndex++;
            Return=Serial.ReadByte(DataByte);
        }
        
        Data[nIndex++]='\r';
        Data[nIndex++]='\n';
        Data[nIndex++]='\0';
        
        //Remove garbage characters
        nIndex=0;
        while (Data[nIndex]!='$' && nIndex<100)
            nIndex++;
        
        for (int i=0; i<nIndex; i++)
        {
            sMsg.Format("%s",(const char *) Data);
        }
//    AfxMessageBox(sMsg);
        m_Ausgabe.AddString(sMsg);
    }

    Serial.ClosePort();
}  
C/C++ Code:
void CTestDialogDlg::OnStart()
{
// TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen

CSerialCom Serial;

if (!Serial.OpenPort("COM1"))
{
AfxMessageBox("Can't Open Port!");
}

Serial.ConfigurePort(4800, 8, FALSE, NOPARITY, TWOSTOPBITS);
// char Data[100]="\0";
// BYTE DataByte='\0';

for (int j=0; j<100; j++)
// while (m_Stop)
{

// if (!Serial.OpenPort("COM1"))
// AfxMessageBox("Can't Open Port!");
// }
//
// Serial.ConfigurePort(4800, 8, FALSE, NOPARITY, TWOSTOPBITS);

//Read data from GPS

char Data[100]="\0";


BYTE DataByte='\0';
int nIndex=0;

BOOL Return=Serial.ReadByte(DataByte);
while (DataByte!='\r' && DataByte!='\n' && Return==TRUE)
{
Data[nIndex]=DataByte;
nIndex++;
Return=Serial.ReadByte(DataByte);
}

Data[nIndex++]='\r';
Data[nIndex++]='\n';
Data[nIndex++]='\0';

//Remove garbage characters
nIndex=0;
while (Data[nIndex]!='$' && nIndex<100)
nIndex++;

for (int i=0; i<nIndex; i++)
{
sMsg.Format("%s",(const char *) Data);
}
// AfxMessageBox(sMsg);
m_Ausgabe.AddString(sMsg);
}

Serial.ClosePort();
}  
C/C++ Code:
void CTestDialogDlg::OnStart()
{
    // TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen

    CSerialCom Serial;

    if (!Serial.OpenPort("COM1"))
    {    
        AfxMessageBox("Can't Open Port!");
    }
    
    Serial.ConfigurePort(4800, 8, FALSE, NOPARITY, TWOSTOPBITS);
//    char Data[100]="\0";
//    BYTE DataByte='\0';

for (int j=0; j<100; j++)
//    while (m_Stop)
    {

//        if (!Serial.OpenPort("COM1"))
//        AfxMessageBox("Can't Open Port!");
//        }
//        
//        Serial.ConfigurePort(4800, 8, FALSE, NOPARITY, TWOSTOPBITS);
        
        //Read data from GPS

        char Data[100]="\0";
    

        BYTE DataByte='\0';
        int nIndex=0;
        
        BOOL Return=Serial.ReadByte(DataByte);
        while (DataByte!='\r' && DataByte!='\n' && Return==TRUE)
        {
            Data[nIndex]=DataByte;
            nIndex++;
            Return=Serial.ReadByte(DataByte);
        }
        
        Data[nIndex++]='\r';
        Data[nIndex++]='\n';
        Data[nIndex++]='\0';
        
        //Remove garbage characters
        nIndex=0;
        while (Data[nIndex]!='$' && nIndex<100)
            nIndex++;
        
        for (int i=0; i<nIndex; i++)
        {
            sMsg.Format("%s",(const char *) Data);
        }
//    AfxMessageBox(sMsg);
        m_Ausgabe.AddString(sMsg);
    }

    Serial.ClosePort();
}  



Diese Methode greift auf die Klasse CSerialCom zurück. Das Device liefert ASCII-Zeichen. Die Methode bekommt von der Klasse die Zeichen und liest sie in ein char-Array. Jeder empfangene Datensatz endet mit <CR> und <LF>. Dann wird das Array in ein CString umgewandelt und in einer ListBox ausgegeben.

Mein Problem ist z.Zt., daß heute morgen die Datensätze angezeigt wurden (nicht ganz so, wie ich es möchte, aber immerhin) und nun nur noch Fragmente bzw. hauptsächlich nur noch die Steuerzeichen ausgegeben werden.

Da ich Anfänger bin, weiß ich mir nicht so recht zu helfen.

Wer hat davon mehr Ahnung?

THX Markus
--
Hier spricht die dunkle Seite der Macht!

Dieser Post wurde am 22.01.2005 um 13:47 Uhr von mike editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
22.01.2005, 15:13 Uhr
mmc20
puss in boots


hi,
so richtig schlau werd ich nicht aus deinem code ... ist alles etwas umständlich, aber der fehler ist hier

C++:
        for (int i=0; i<nIndex; i++)
        {
            sMsg.Format("%s",(const char *) Data); // wiso ein pointer ???
        }


Data ist doch ein array, wozu die schleife... also entweder schreibst nur

C++:
sMsg.Format("%s", Data);
// oder gleich
sMsg = (LPCTSTR)Data;


oder wenns denn unbedungt ne schleife sein muss

C++:
sMsg="";
for ( int i=0; i<nIndex; i++ )
     sMsg += Data[i];

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: