Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » mscomm

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
14.04.2004, 21:06 Uhr
~jma
Gast


Moin
bin c++ anfänger und versuche MsComm in mein programm aufzunehmen um ein Messgerät anzusprechen und werte abzufragen. Senden der Daten funktioniert einwandfrei. Nun möchte ich natürlich auch die werte vom messgerät empfangen.
könnte mit dem onTimer immer abfragen ob werte vorliegen, aber dabei treten mehrere Fehler auf, kann mir jemand weiterhelfen , wie müßte der code zum abrufen aussehen?? unter vb gabs /gibts ne eigene event funktion fürs empfangen.
Ein kleiner beispielcode würde weiterhelfen.

(beim senden der unten aufgeführten bytes werden definitiv daten zurückgeliefert)

Besten Dank jma


Mein Code:

C++:
m_out ==  MS Comm Steuerelement


//Empfangen    
CString InString;
if (m_out.GetInBufferCount >=2)     // Warten, bis Daten empfangen wurden.
      InString= m_out.Input;            // "OK"-Antwort aus dem seriellen


//Senden
void CMy12Dlg::OnButton1()
{    
    m_out.SetCommPort(1);
    m_out.SetSettings("9600,E,7,1");
    m_out.SetPortOpen(TRUE);
    
    COleVariant output;
    CByteArray data;
    data.Add(2);
             .....
    data.Add(13);
    data.Add(10);

    output=data;
    m_out.SetOutput(output);
}




Bearbeitung von typecast:
cpp-Tags gesetzt

Dieser Post wurde am 15.04.2004 um 17:31 Uhr von typecast editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
14.04.2004, 22:15 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


du könntest einen thread benutzen, der immer dann als schleife läuft und abfragt ob daten anliegen und diese ggf abruft
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
15.04.2004, 00:11 Uhr
~jma
Gast


ja
daran hab ich auch schon gedacht.

Vielleicht in erster Linie erst mal überhaupt daten bekommen,

C++:
//Empfangen    
CString InString;
if (m_out.GetInBufferCount >=2)     // Warten, bis Daten empfangen wurden.
      InString= m_out.Input;            // "OK"-Antwort aus dem seriellen


Kriege hier einen Fehler, das er nicht ">=" mag, alternativ hab ich schon auf
!= 0 geprüft was wiederrum funktioniert.

Außerdem mag er es nciht die empfangenen Bytes in nem String zu schreiben. Ich denke mal das es wie beim senden mit
- COleVariant output;
- CByteArray data;
gehen muss, kenn mich aber mit beiden typen nciht aus.

Gibt es ne Dokumentation oder kennt jemand beispiele für mscomm unter c++?
wie gesagt unter vb finet man allerhand, nur da hatte ich es ja selbst bereits am laufen.

Gruß
jma


Bearbeitung von typecast:
cpp-Tags gesetzt

Dieser Post wurde am 15.04.2004 um 17:32 Uhr von typecast editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
15.04.2004, 09:15 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


ich schätze mal das m_out.GetInBufferCount

eine Funktion ist!


C++:
m_out.GetInBufferCount()


--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
15.04.2004, 14:05 Uhr
~jma
Gast


ja richtig
die () sind mir wohl beim probieren abhanden gekommen.
außerdem heitß es wohl ehr

C++:
m_input = m_out.GetInput();



aber was fürn typ muss m_input nun sein, damit die daten eingetragen und angezeigt werden könnn.
gruß jma
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
15.04.2004, 17:24 Uhr
FloSoft
Medialer Over-Flow
(Administrator)



C++:
short CCommCtrl::GetInputLen()
{
  short result;
  GetProperty(0xc, VT_I2, (void*)&result);
  return result;
}



d.h es ist ein short was die Funktion zurückliefert


C++:
CString CCommCtrl::GetInput()
{
CString result;
GetProperty(0x1a, VT_BSTR, (void*)&result);
return result;
}


liefert einen CString
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
21.04.2004, 08:11 Uhr
~Chris
Gast


Hallo!
Ich habe folgendes Problem:
Ich schreibe gerade ein Programm in VC++ 6.0, das Werte aus einem Gerät seriell auslesen soll, selbst senden muss ich nichts. Dabei verwende ich das MsComm-Objekt.
Die Methode GetInput() liefert mir jeweils ein Byte Daten zurück in einem COleVariant-Objekt. Ich weiß nun, dass mein Gerät am Anfang die Bytes (dezimal) 192, 1, 40, 156, 41, 15, 192 sendet. Ich empfange jedoch fälschlicherweise immer 192, 1, 40, 339, 41, 15, 192. Ich kann mir nicht erklären, woher die 339 kommt, zumal ein Byte nur Werte bis max. 255 annehmen kann. Ich habe die Vermutung, dass es ein Problem mit dem Zeichensatz ist oder ein Problem bei der Verwendung des Typs COleVariant.

Hier mal ein Auszug aus dem Quelltext:


C++:
void CTestDlg::OnCommMscomm1()
{
   COleVariant in_dat;
   unsigned char * intext;  // 1 Byte, max. 255
   in_dat = m_ComControl.GetInput();  // hier empfange ich die 339
   intext = in_dat.pbVal;  
   // Weitere Auswertung
   // von
   // intext
}



Initialisiert habe ich das MsComm-Objekt wie folgt:


C++:
m_ComControl.SetCommPort(1);
m_ComControl.SetRThreshold(1);
m_ComControl.SetInputLen(1);
m_ComControl.SetInBufferSize(1024);
m_ComControl.SetPortOpen(true);
m_ComControl.SetSettings("19200,N,8,1");
m_ComControl.SetDTREnable(false);
m_ComControl.SetEOFEnable(false);
m_ComControl.SetRTSEnable(false);



Wie gesagt, die Kommunikation funktioniert, ich empfange auch alles richtig bis auf diese 156.
Ich habe mir auch schon überlegt, Daten im BinaryMode zu empfangen. Dazu habe ich bloß leider nirgendwo eine Doku gefunden.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
25.04.2004, 17:42 Uhr
~jma
Gast


Moin
bei mir funktioniert das nun wunderbar, hab den Code von FloSoft übernommen
und erhalte sauber meinen String; hier mal den kompletten Code


C++:
float* CWTabelleDLG::getCommMscomm1()
{
    CString InString,tmp;
    char buffer[200];
    int i,j;
    j=0;

    if (m_out.GetInBufferCount() !=0)     // Warten, bis Daten empfangen wurden.
    {
        m_out.GetProperty(0x1a, VT_BSTR, (void*)&InString);
        sprintf( buffer , "%s", InString );
        
        for(i=0;i<nCL;i++)
        {    
            if(!strcmp(wCL[i],"Xus"))      dWert[i] = mid(buffer, 10+13, 6);
            if(!strcmp(wCL[i],"Yus"))      dWert[i] = mid(buffer, 16+13, 6);
            if(!strcmp(wCL[i],"Zus"))      dWert[i] = mid(buffer, 22+13, 6);
            if(!strcmp(wCL[i],"Ev"))  dWert[i] = mid(buffer, 10+13+32, 6);
            if(!strcmp(wCL[i],"x"))      dWert[i] = mid(buffer, 16+13+32, 6);
            if(!strcmp(wCL[i],"y"))      dWert[i] = mid(buffer, 22+13+32, 6);
            if(!strcmp(wCL[i],"u"))      dWert[i] = mid(buffer, 16+13+64, 6);
            if(!strcmp(wCL[i],"v"))      dWert[i] = mid(buffer, 22+13+64, 6);    
            if(!strcmp(wCL[i],"Tcp")) dWert[i] = mid(buffer, 16+13+96, 6);
            if(!strcmp(wCL[i],"du"))  dWert[i] = mid(buffer, 22+13+96, 6);
        }
    }
    else for(i=0;i<nCL;i++) dWert[i] = -0;
    
    return dWert;
}


Port Öffnen:

C++:
        m_out.SetCommPort(pCL);  // pCL ist die portnummer
        m_out.SetSettings("9600,E,7,1");
        m_out.SetPortOpen(TRUE);



besten danka nochmal für eure hilfe
jmA
 
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: