mikrocontroller.net

Forum: PC-Programmierung Mit C++ Datenerfassungsbaustein auswerten


Autor: Klaus Lohs (klauslohs)
Datum:

Bewertung
0 lesenswert
nicht 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-B...

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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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
[c]
...
[/c]
einschließt.

Autor: Klaus Lohs (klauslohs)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus Wachtler (mfgkw)
Datum:

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

Autor: Klaus Lohs (klauslohs)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Klaus Lohs (klauslohs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
uint16_t bringt mir eine Fehlermeldung "Undefiniertes Symbol..sonst 
Deklarationsfehler

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> uint16_t bringt mir eine Fehlermeldung "Undefiniertes Symbol..sonst
> Deklarationsfehler

Welche Compiler schreibt denn "sonst Deklarationsfehler"?

#include <stdint.h>

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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".

Autor: Klaus Lohs (klauslohs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich schreib mit cbuilder5.

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

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

Autor: Klaus Lohs (klauslohs)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: jl (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jl schrieb:
> funktioniert nicht ganz

doch, funktioniert

Autor: Klaus Lohs (klauslohs)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus Lohs schrieb:
> Fehler: Unzulässiger Indirektionsoperator

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

Autor: Klaus Lohs (klauslohs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok ich schick dir mein ganzes Programm. Moment

Autor: Klaus Lohs (klauslohs)
Datum:

Bewertung
0 lesenswert
nicht 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);


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

Autor: Link zu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
   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);
werte ist kein array!

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

Autor: Walter (Gast)
Datum:

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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Klaus Lohs (klauslohs)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus Lohs (klauslohs)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.