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
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.
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
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 | }
|
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?
uint16_t bringt mir eine Fehlermeldung "Undefiniertes Symbol..sonst Deklarationsfehler
> uint16_t bringt mir eine Fehlermeldung "Undefiniertes Symbol..sonst > Deklarationsfehler Welche Compiler schreibt denn "sonst Deklarationsfehler"? #include <stdint.h>
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".
Ich schreib mit cbuilder5. #include <stdint.h> kann nicht geöffnet werden
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; |
jetzt hab ich nur noch einen Fehler bei dem Programmtext und zwar in der Zeile: werte[iWerte] = ( zeichen1<<8 ) | zeichen2; Fehler: Unzulässiger Indirektionsoperator
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;
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
Klaus Lohs schrieb: > Fehler: Unzulässiger Indirektionsoperator Dann fehlt mehr Quelltext; an dieser Zeile allein kann ich das nicht sehen.
#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); } //---------------------------------------------------------------------- -----
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...
iWert und iWerte durch i ersetzen (Tip: Compilerwarnungen nicht ignorieren)
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...
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.
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.
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.
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.