Forum: PC-Programmierung Mit C++ Datenerfassungsbaustein auswerten


von Klaus L. (klauslohs)


Lesenswert?

Hi Leute!!

Ich hab ein Problem und hoffe es kann mir einer weiter helfen.

Von einem Datenerfassungsbaustein
Typ:
http://www.conrad.de/ce/de/product/191028/USB-12-BIT-DATENERFASSUNGSSYS-BAUSTEIN

bekomm ich einen ASCII-Cod laut Datenblatt, durch ein Senden von einem 
Befehl c01.....c09.

Hier ein paar Programmzeilenzum Ansteuern der Schnittstelle:

C/C++ Code:
 void __fastcall TForm1::SerialControl1CharReceived(TObject *Sender)
{
char Zeich;
int Anz;
bool bAbbr=false;

while (bAbbr==false)
    {
    Anz=SerialControl1->ReadString(&Zeich, 1);
    if (Anz==1) Antw=Antw+Zeich;
    else bAbbr=true;
    }

lblEmpfText->Caption=Antw;

Im lblEmpfText bekommme ich hier einen Code
( z.b. kl
 &'
 %&)
Wöllt aber gern die Ausgabe im lblEmpfText als Dezimalzahl.Also als 
Messwert bekommen.
Wie müsste ich den Programmtext umschreiben?

schon mal danke

von Klaus W. (mfgkw)


Lesenswert?

Wo bekommst du einen ASCII-Code zurück?
Wenn ich das Datenblatt lese, kommen jeweils 17 Byte,
für 8 Kanäle je zwei Byte plus eine Prüfsumme.

Du musst also je zwei Byte zu einer uint16_t zusammenschieben.

Quelltexte kann man übrigens auch besser lesen, wenn man sie
ordentlich formatiert und im Forum mit
1
[c]
2
...
3
[/c]
einschließt.

von Klaus L. (klauslohs)


Lesenswert?

Wie kann ich das denn mit c++ machen, dass ich 2 Byte zusammenschiebe. 
Ich komm noch nicht zu einer richtigen Lösung.

Könntest du mir bitte weiterhelfer

von Klaus W. (mfgkw)


Lesenswert?

Das wird hier fast jeden Tag beschrieben.
z.B.
1
   uint16_t   werte[8]; // für alle 8 Kanäle
2
   int     iWert;
3
   for( i=0; i<8; ++i )
4
   {
5
       uint8_t   zeichen1, zeichen2;
6
       // ... zeichen1 und zeichen2 lesen, wie in deinem Beispiel
7
       werte[iWerte] = ( zeichen1<<8 ) | zeichen2;
8
   }

von Klaus L. (klauslohs)


Lesenswert?

iWerte schick ich in das lbl EmpfText soweit ok.
Das is doch nur die Auswertung für einen Analogeingang. Wie müsste ich 
den Programmtext umändern, wenn ich alle 8 Kanäle einzeln auswerten 
will??
Oder versteh ich da was falsch?

von Klaus L. (klauslohs)


Lesenswert?

uint16_t bringt mir eine Fehlermeldung "Undefiniertes Symbol..sonst 
Deklarationsfehler

von Klaus W. (mfgkw)


Lesenswert?

> uint16_t bringt mir eine Fehlermeldung "Undefiniertes Symbol..sonst
> Deklarationsfehler

Welche Compiler schreibt denn "sonst Deklarationsfehler"?

#include <stdint.h>

von Klaus W. (mfgkw)


Lesenswert?

Klaus Lohs schrieb:
> Das is doch nur die Auswertung für einen Analogeingang. Wie müsste ich
> den Programmtext umändern, wenn ich alle 8 Kanäle einzeln auswerten
> will??

Mein Vorschlag ist für alle 8 Kanäle, daher die Schleife mit
8 Durchläufen - und der Kommentar "für alle 8 Kanäle".

von Klaus L. (klauslohs)


Lesenswert?

Ich schreib mit cbuilder5.

#include <stdint.h> kann nicht geöffnet werden

von Karl H. (kbuchegg)


Lesenswert?

Klaus Lohs schrieb:
> Ich schreib mit cbuilder5.
>
> #include <stdint.h> kann nicht geöffnet werden

dann mach dir ein typedef
1
typedef unsigned char      uint8_t;
2
typedef unsigned short int uint16_t;

von Klaus L. (klauslohs)


Lesenswert?

jetzt hab ich nur noch einen Fehler bei dem Programmtext und zwar in der 
Zeile:
werte[iWerte] = ( zeichen1<<8 ) | zeichen2;

Fehler: Unzulässiger Indirektionsoperator

von jl (Gast)


Lesenswert?

Klaus Wachtler schrieb:
> for( i=0; i<8; ++i )
>    {
>        uint8_t   zeichen1, zeichen2;
>        // ... zeichen1 und zeichen2 lesen, wie in deinem Beispiel
>        werte[iWerte] = ( zeichen1<<8 ) | zeichen2;
>    }

funktioniert nicht ganz, zeichen1 ist 8bit gross und schieben um 8 wird 
zu 0.

werte[iWerte] = ( ((uint_16)zeichen1)<<8 ) | zeichen2;

von Klaus W. (mfgkw)


Lesenswert?

jl schrieb:
> funktioniert nicht ganz

doch, funktioniert

von Klaus L. (klauslohs)


Lesenswert?

werte[iWerte] = ( ((uint_16)zeichen1)<<8 ) | zeichen2;

Tritt der selbe Fehler wieder auf.
Fehler: Unzulässiger Indirektionsoperator

Muss mich erstmal Ausloggen. Meld mich am Sonntag wieder. Vielleicht 
findet man noch eine andere Lösung für das Problem.

 dankeschön für die Hilfe

von Klaus W. (mfgkw)


Lesenswert?

Klaus Lohs schrieb:
> Fehler: Unzulässiger Indirektionsoperator

Dann fehlt mehr Quelltext; an dieser Zeile allein kann ich das nicht 
sehen.

von Klaus L. (klauslohs)


Lesenswert?

ok ich schick dir mein ganzes Programm. Moment

von Klaus L. (klauslohs)


Lesenswert?

#include <vcl.h>
#pragma hdrstop

#include "TestiDRX.h"

//---------------------------------------------------------------------- 
-----
#pragma package(smart_init)
#pragma link "SerialControl"
#pragma resource "*.dfm"
TForm1 *Form1;
int com;    //Deffinieren com

String EmpfText;  //Deffinieren EmpfText  (Zeichenkette)

String Sende;  //Deffinieren SendeText (Zeichenkette)

String ok;     //Deffinieren ok (Zeichenkette)

//---------------------------------------------------------------------- 
-----
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------- 
-----

void __fastcall TForm1::btnOpenClick(TObject *Sender)
{

  com= cmbPort->ItemIndex+1;    //Zeilen 2 festlegen 
da-Zeile1=0/Zeile2=1Index+1

if (com==1) SerialControl1-> Port=COM1;   //Mit der Eigenschaft kann ein 
serieller Port ausgewählt werden
                                         //Com-port1 auswählen in 
SerielControl

if (com==3) SerialControl1-> Port=COM3; //Com-port2 auswählen in 
SerielControl

if (com>0) {                     //wenn ausgewählt ist-dann...

SerialControl1->OpenCom();       //Aus Hilfe OpenCon!!!Die Einstellungen 
des COM-Ports wie Portbezeichnung
                                 //werden beim Öffnen aus den 
entsprechenden Eigenschaften
                                 //entnommen.
//if(cmbPort==COM1)
//{
//SerialControl1->Port = COM1;
//}
//else
//{
//SerialControl1->Port=COM3;
//}
// SerialControl1->OpenCom();


btnOpen->Enabled=false;          //Öffnen Button sperren

btnClose->Enabled=true;          //Schließen-Button entsperren

btnSenden->Enabled=true;         //Senden-Button entsperren
}
}
//---------------------------------------------------------------------- 
-----


void __fastcall TForm1::btnCloseClick(TObject *Sender)
{
SerialControl1->CloseCom();        // Aus Hilfe CloseCom!! Schließt den 
geöffneten seriellen Port

btnOpen->Enabled=true;             //Öffnen-Button entsperren

btnClose->Enabled=false;           //Schließen-Button sperren

btnSenden->Enabled=false;           //Senden-Button sperren

}
//---------------------------------------------------------------------- 
-----

void __fastcall TForm1::btnSendenClick(TObject *Sender)
{

Sende = edBefehl->Text+"\r";   //in Editfeld eingegebenen Text + <CR> 
senden/sonderzeichen \r

int Length =Sende. Length();   //Länge bestimmen

SerialControl1->SendString(Sende.c_str(),Length); // Es werden Length 
Zeichen eines an
                                                 //  befindlichen 
Strings gesendet.

EmpfText="";                  //leeren
lblEmpfText->Caption="";      //leeren
lblTemp->Caption="";          //leeren

}
//---------------------------------------------------------------------- 
-----

void __fastcall TForm1::SerialControl1CharReceived(TObject *Sender)
{
//Aus Hilfe OnCharReceived
char Zeich;
int Anz;
bool bAbbr=false;


while (bAbbr==false)
      {
      Anz=SerialControl1->ReadString(&Zeich, 1);

      if (Anz==1)EmpfText=EmpfText+Zeich;    //Schreiben des 
Empfangtextes in programmvariable

      else bAbbr=true;
      }
lblEmpfText->Caption=EmpfText;

                 //Anzeigen Empfangstext

typedef unsigned char uint8_t;
typedef unsigned char uint_16;

   int     iWert;
   int i ;
   int werte;
   int iWerte;
   for( i=0; i<8; ++i );
   {
       uint8_t   zeichen1, zeichen2;
       // ... zeichen1 und zeichen2 lesen, wie in deinem Beispiel
      werte[iWerte] = ( ((uint_16)zeichen1)<<8 ) | zeichen2;
   }
   Memo1->Lines->Add(iWerte);


}
//---------------------------------------------------------------------- 
-----

von Link zu (Gast)


Lesenswert?

1
   int     iWert;
2
   int i ;
3
   int werte;
4
   int iWerte;
5
   for( i=0; i<8; ++i );
6
   {
7
       uint8_t   zeichen1, zeichen2;
8
       // ... zeichen1 und zeichen2 lesen, wie in deinem Beispiel
9
      werte[iWerte] = ( ((uint_16)zeichen1)<<8 ) | zeichen2;
10
   }
11
   Memo1->Lines->Add(iWerte);
werte ist kein array!

Und auf die Codeumgebung hat dich Klaus Wachtler ja schon hingewiesen...

von Walter (Gast)


Lesenswert?

iWert und iWerte durch i ersetzen
(Tip: Compilerwarnungen nicht ignorieren)

von Klaus W. (mfgkw)


Lesenswert?

ja, sorry; das war mein Fehler: iWerte vereinbart, und i verwendet :-(

Im Zweifelsfall würde ich aber lieber i durch iWerte ersetzen
als umgekehrt, aber das ist natürlich Geschmackssache...

von Klaus L. (klauslohs)


Lesenswert?

erstmal danke für eure hilfe.

Ich hab mich eben 6Std gequält eine Verbindung zu den Datenbaustein zu 
erhalten. Ist mir leider nicht geglückt.
Könnt ihr mir noch ein wenig helfen. Ich tu mich hier echt schwer aber 
geb mir die beste Mühe.

von Klaus L. (klauslohs)


Lesenswert?

Dieses Text funktioniert soweit:

typedef unsigned char      uint8_t;
typedef unsigned short int uint16_t;


 uint16_t   werte[8]; // für alle 8 Kanäle
   int    iWerte;


   for( iWerte=0; iWerte<8; ++iWerte )
   {
       uint8_t   zeichen1, zeichen2;
       // ... zeichen1 und zeichen2 lesen, wie in deinem Beispiel
       werte[iWerte] = ( zeichen1<<8 ) | zeichen2;

    }
 lblEmpfText->Caption=iWerte;

Aber im lblEmpfText bekomm ich nur Nullen geliefert und keinen richtigen 
Messwert von meinen Analogeingängen, wenn ich den entsprechenden Befehl 
sende.

von Karl H. (kbuchegg)


Lesenswert?

Klaus Lohs schrieb:

>  lblEmpfText->Caption=iWerte;
>
> Aber im lblEmpfText bekomm ich nur Nullen geliefert und keinen richtigen
> Messwert von meinen Analogeingängen, wenn ich den entsprechenden Befehl
> sende.

Wenn dein Control nur halbwegs einem normalen Windows Control gleicht, 
dann ist der Caption Wert ein Text(!) und keine Zahl. Hat denn dein 
Compiler da gar nichts dazu gesagt?

Du musst also vom Zahlenwert eine Textrepräsentierung erzeugen.
Jetzt kommt es darauf an, welchen Datentyp das Caption Member konkret 
hat, welche Umwandlungsfunktion du benutzen musst.

von Karl H. (kbuchegg)


Lesenswert?

> Ich tu mich hier echt schwer aber
> geb mir die beste Mühe.

Dein Problem ist, dass du dich (wie so viele andere) übernimmst. Dir 
fehlen massenhaft Grundlagen und dann beschwerst du dich, wenn du die 
simpelsten Zusammenhänge nicht verstehst.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.