Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Anweisungen Hilfe Bitte

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 < [ 2 ] [ 3 ]
000
20.07.2004, 10:09 Uhr
~wasa
Gast


tagchen!
kann mir jemand erklären was der folgende Code zu sagen hat bzw. was da gemacht wird!?
DANKE SCHONMAL!!!!!!
Ich komme damit echt nicht zurecht!!!

DANKE cu wasa

C++:
int digit(int x)
{
    int dig[10]={0xd7,0x05,0x5b,0x1f,0x27,0x3e, 0x7e,0x15,0x7f, 0x3f};
    int n;
    x=x&0x7f;
    for(n=0;n<10;n++)
        if (x==dig[n])
            return n;
    return 0;
}
/*---------------------------------------------------------------------*/
char *dvm_unit(int y, int x, char *s)
{    
    char *prefix="";
    char *unit="";
    char *ext="";
    char *ext1="";

    if (x&0x2000)
        ext="delta";
    else if (x&0x100000)
        ext="Diode";
    else if (x&0x10000)
        ext="Beep";
    
    if (x&0x080000)
        prefix="m";
    else if (x&0x800000)
        prefix="u";
    else if (x&0x400000)
        prefix="n";
    else if (x&0x020000)
        prefix="M";
    else if (x&0x200000)
        prefix="k";

    
    if (x&0x0800)
        unit="A";
    else if (x&0x0200)
        unit="Hz";
    else if (x&0x40000)
        unit="%";
    else if (x&0x10)
        unit="°C";
    else if (x&0x4000)
        unit="Ohm";
    else if (x&0x0400)
        unit="V";
    else if (x&0x8000)
        unit="F";

    sprintf(s,"%s%s %s (%s)",prefix, unit,
        (y&0x8?"AC":""),
        ext);
}
/*---------------------------------------------------------------------*/
int main(int argc,char **argv)
{
    unsigned char data;
    unsigned char buffer[100];
    unsigned char buffer1[9];
    char units[20];
    int n;
    float it;
    unsigned int t,tf;
    
    fd=open_serial("/dev/ttyS0", 2400);
    
    set_rts_dtr(fd); // DTR/RTS setzen

    while(1)
    {
        n=0;
        memset(buffer,0,20);
        while(1)
        {
            read(fd,&buffer[n],1);        
            if ((buffer[n]&0xf0)==0xe0 || (n==16))
                break;        
            n++;
        }
#if 0
        // Raw output
        for(n=0;n<16;n++)
            printf("%02x ",buffer[n]);
#endif

        buffer1[0]=buffer[0]&15;

        for(n=0;n<8;n++)
            buffer1[1+n]=((buffer[2*n+1]&15)<<4)|(buffer[2*n+2]&15);


#if 0
        // Nibble compacted data
        for(n=0;n<8;n++)
            printf("%02x ",buffer1[n]);

        printf("%i%i%i%i\n",digit(buffer1[1]),digit(buffer1[2]),
        digit(buffer1[3]),digit(buffer1[4]));
#endif

        if ((buffer1[3]&0x7f)==0x68)
            it=9999999;
        else
            it=1000.0*digit(buffer1[1])+100.0*digit(buffer1[2])
                +10*digit(buffer1[3])+1*digit(buffer1[4]);
        

        if (buffer1[4]&0x80)
            it=it/10.0;

        if (buffer1[3]&0x80)
            it=it/100.0;

        if (buffer1[2]&0x80)
            it=it/1000.0;
            
        if (buffer1[1]&0x80)
            it=-it;
        
        dvm_unit(buffer1[0], (buffer1[5]<<16)|(buffer1[6]<<8)|buffer1[7],units);
        timestamp();
        printf("%0.3f %s\n",it, units);
        fflush(stdout);
    }
}


 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
20.07.2004, 10:22 Uhr
ao

(Operator)


Aus einer seriellen Schnittstelle werden 16 Bytes gelesen, und dann beginnt eine geradezu widerwärtige Zahlenhexerei. Offenbar wird hier das Datenprotokoll eines Messgeräts (Digital-Multimeter?) interpretiert. Am Ende fallen aus diesem Wust ein Zahlenwert und eine Einheit heraus, und die werden am Bildschirm angezeigt.

Was sollst du mit diesem Chaos anfangen, du Armer?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
20.07.2004, 10:39 Uhr
Tommix




Zitat:


C++:
fd=open_serial("/dev/ttyS0", 2400);




Nie und nimmer ist das ein MFC-Programm.

- Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
20.07.2004, 11:16 Uhr
~wasa
Gast


Tagchen!

Danke erstmal für die Antworten!
ja, also es wird eine Verbindung zu COM1 hergestellt und 16 Bytes herausgelesen, von nem DMM.

Was ist das jetzt für ne Zahlenhexerei??? Man bekommt die 16 Bytes
übergeben und muss diese dann noch "umformen" oder wie???

Wie mache ich das in MFC??
in meinem Programm öffne und lese ich den COM und bekomme 14 Bytes in nem Buffer übergeben.
Wie wende ich jetzt darauf die Zahlenhexerei an??? irgendwie verstehe ich das nicht!!
THX wasa
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
20.07.2004, 12:14 Uhr
ao

(Operator)


Es ist wirklich unfassbar. Dieses DMM sendet ein Bit für jeden Balken der 7-Segment-Anzeigen und für jedes Symbol (V, A, Hz, C, Ohm, n, µ, m, k, M, AC) auf seinem Display, und zwar eine 1 für Sichtbar und eine 0 für Unsichtbar.

Jedes Byte, das über die Serielle kommt, enthält 4 gültige Bits, und die werden (hinter dem ersten #endif) erst mal paarweise zu 8-bit-Gruppen zusammengeschoben. Wenns Spaß macht ...

Hinter dem zweiten #endif kommt zuerst die Prüfung auf Überlauf, und dann werden die vier Ziffern ausgewertet (Aufrufe von digit) und daraus der vierstellige Zahlenwert zusammengebaut.

In den 4 if's danach wird der Dezimalpunkt gesucht und auf negatives Vorzeichen getestet.

Am Ende werden das 5., 6. und 7. Byte zu einem 32-Bit-Wert zusammengeschoben, und die Funktion dvm_unit maskiert damit ein bisschen herum und stellt fest, welche Maßeinheit das war. Und am 0. Byte detektiert sie AC oder DC.

Was sollst du denn machen? Ein MFC-Programm schreiben, das dasselbe tut wie der Chaoten-Code da oben?

Wie weit bist du schon? Kannst du die Daten aus dem Multimeter in den Speicher holen?

Hast du irgendeine Beschreibung zu dem DMM und seinem Datenprotokoll? Was für ein DMM ist das (Typbezeichung)? Gibts die Beschreibung vielleicht im Internet?

Dieser Post wurde am 20.07.2004 um 12:15 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
20.07.2004, 14:50 Uhr
~wasa
Gast


tagchen!

also! ich soll für meine Bachelorarbeit ein Digital Multimeter (VC820) über das Internet steuern können. Der Haken dabei ist, weil mein Prof nicht aufgepasst hat, das Teil lässt sich nicht steuern. Man kann das Gerät nur auslesen. Nun soll ich das Gerät nur auslesen und der Benutzer misst und stellt die entsprechenden Größen auf dem DMM ein.

Habe dazu ein MFC Programm geschrieben, welches sich die Daten / Befehle des Users holt, der das im Internet / Webinterface eingegeben hat. Befehle sind Intervall und Wiederholungen der Messungen sowie zur Überprüfung der Messungen (also das auch nur das gemessen wird was der User eingestellt hat).
Das Programm öffnet den COM sobald es eine entsprechende Datei (stehen die Befehle drin) gefunden hat und liest die Messungen vom COM ein.
Laut Beschreibung ist das ein 14 Byte großer String. Diesen bekomme ich auch nur der Inhalt ist ersten immer gleich und zweitens der Inhalt ist nichts sagend. Also muss ich bestimmt auch die Zahlenhexerei machen oder?Da habe ich das oben aufgeführte Beispiel im netz gefunden, welches das selbe Gerät (DMM VC820) ausliest. Nur komme ich damit nicht zu recht.
Die Codierung laut Beschreibung ist: als Beispiel

Code:
123456789ABCDE
DC  -3.999    VCR



In dem script von oben steht aber:
Das VC820/840 sendet 14 Bytes mit 2400Baud 8N1
Das High-Nibble der Bytes entspricht der Position (1...e)
Nur das Low-Nibble ist interessant!
Die Low-Nibbles codieren LCD-Segmente:
Nibble 0: AUTO|AC|TRUE_RMS|RS232
Nibble 1-2: Minus, Digit 0
Nibble 3-4: Dot, Digit 1
Nibble 5-6: Dot, Digit 2
Nibble 7-8: Dot, Digit 3
Nibble 8-14: numkM A V Hz F Ohm °C % Rel Diode Beep Hold

keine Ahnung was das zu bedeuten hat.

Die Beschreibung zu dem teil kannste vergessen, steht nichts drin, und die Hersteller Firma sowie der Vertreiber (Conrad) können gar nichts sagen!
Ich hoffe du kannst mir helfen und bedanke mich schonmal!!
THX!!!!
cu wasa

Dieser Post wurde am 20.07.2004 um 15:10 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
20.07.2004, 15:25 Uhr
ao

(Operator)


Lies mal hier nach:

http://home.arcor.de/bernd_kunze/selfprog.htm

Irgendwo unten auf der Seite gibts Links auf VC820 / VC840, da kommt ne genaue Beschreibung des Protokolls mit Tabellen, welches Bit in welchem Byte was bedeutet.

Wenn du dann noch Fragen hast, komm noch mal wieder.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
20.07.2004, 16:11 Uhr
~wasa
Gast


tagchen!

THX für die Mail!
der Link hat mir sehr geholfen!
Aber wie komme ich unter MFC an die BITS der einzelnen BYTES??

THX nochmal!
cu wasa
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
20.07.2004, 17:06 Uhr
ao

(Operator)



Zitat von ~wasa:
Aber wie komme ich unter MFC an die BITS der einzelnen BYTES??

Ausmaskieren, genau wie in C. Mit & (bitwise AND), | (bitwise OR), ~ (bitwise complement) und ^ (bitwise XOR). Das kannst du auch von dem Unix-Beispiel oben abgucken.

Aber versprich mir (*smile*), dass du nicht einfach Zahlen einhackst, sondern entweder symbolische Konstanten verwendest oder zumindest ausführlich kommentierst.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
20.07.2004, 23:34 Uhr
~wasa
Gast


Tagchen!

muss schon wieder nerven! SORRY!
Ich krieg das irgendwie nicht hin. habe es soweit das ich das erste Byte "decodieren" kann, also "nachschauen" ob es zum Beispiel AC oder DC ist. Nur bei den anderen geht das irgendwie nicht!
Wäre schön wenn ihr mir helfen könntet!
Bedanke mich schonmal!
cu wasa
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ]     [ 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: