Mit C++ Datenerfassungsbaustein auswerten

#1677271
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
#1677298
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.
#1677317
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
   }
Gast #1677414
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;
#1677435
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
#1677446
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);


}
//---------------------------------------------------------------------- 
-----
Gast #1677483
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...
#1678679
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.
#1678745
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren