serielle Schnittstelle auslesen (bisher nur Kryptische Daten erhalten)



  • Guten Tag ihr alle.

    Habe da einen kleines Problem mit meiner ser. Schnittstelle.
    Vorab, ich benutze Microsoft Visual C++ 6 und lese Daten von meiner eben genannten Schnittstelle aus.

    Leider bekomme ich an Ausgabe immer nur Kryotische Daten.

    Hier mal eben meine bisherigen Anstrengungen:

    DCB dcb;

    hCom = CreateFile ("COM1", GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);

    if(hCom == INVALID_HANDLE_VALUE)
    {
    MessageBox("Port konnte nicht geöffnet werden");
    }
    else
    {
    COMMTIMEOUTS cto = {1, 100, 1000, 0, 0};
    if(!SetCommTimeouts(hCom, &cto))
    {
    MessageBox("SetCommTimeouts - Fehler");
    }
    memset(&dcb,0,sizeof(dcb));

    dcb.DCBlength = sizeof(dcb); // Laenge des Blockes MUSS gesetzt sein!
    GetCommState (hCom, &dcb); // COM-Einstellungen holen und aendern
    dcb.BaudRate = 19200; // Baudrate
    dcb.ByteSize = 8; // Datenbits
    dcb.Parity = NOPARITY; // Parität
    dcb.StopBits = ONESTOPBIT; // Stopbits

    if(!SetCommState(hCom, &dcb)) //Com-Einstellungen speichern und auf Fehler überprüfen
    {
    MessageBox("SetCommState - Fehler");
    }

    char buf[7];
    DWORD read =0;

    ReadFile(hCom, buf, sizeof(buf),&read,NULL);
    DWORD i;

    for(i=0; i<read; i++)
    {
    for (int i=0; i<28; i++)
    {
    printf("%i ", (unsigned char)buf[i]);
    }

    }

    CloseHandle(hCom); // COM1 schließen

    Habe auch schon versucht mit L"COM1" oder _T("COM1") bzw. TEXT("COM1") an leserliche Daten zu kommen. Leider erfolglos.

    Danke schomal für Eure Hilfe.



  • Benutze doch eine Library.
    http://www.codeproject.com/KB/system/serial.aspx

    Das hat den Vorteil, dass auch schön alle Return Werte geprüft werden, die Library als solches getestet ist etc.

    Simon



  • Hallo Simon,

    danke für den Vorschlag, das habe ich mir auch schon angeschaut.
    Aber da es bisher bis auf die "Übersetzung" alles prima und ohne Probleme lief, dachte ich, es wäre einfach nur notwenidig eine weitere Zeile o.ä. einzufügen, damit ich korrekte Werte angezeigt bekomme.

    Wenn das nicht der Fall ist, müsste ich wohl auf eine Library zurück greifen.

    Danke dir



  • Also...

    Ein Problem ist, dass buf für 7 char Platz hat.
    Dann später (in der zweiten Schleife) greifst Du aber bis zu Index 28 -1 auf den Buffer zu. Du darfst nur soviele Bytes aus dem Buffer lesen, wie maximal drin sein können. Ausserdem ist es ratsam den Buffer zu initialisieren (z.B. mit char buf[7] = { };)

    Ausserdem benutzt Du zweimal i für die Schleifen!

    Simon

    Edit: Was erwartest Du denn für eine Ausgabe? Schreibs mal hin.



  • Hi,

    also wie du oben im Quelltext sehen kannst, habe ich buf initialisiert und zwar genauso, wie du es vorgeschlagen hast!
    Ich erwarte an Daten:
    44 00 B4 E8 54 69

    sowas in der Art.
    Habe jetzt für die 2. Schleife eine neue Laufvariable gewählt.

    Danke



  • Also läufts jetzt?



  • Nein, leider noch nicht.

    Die Änderungen haben bis jetzt nichts an der Ausgabe geändert.



  • Lies mal nach wie man mit printf(..) hex ausgibt oder noch besser benutze std::iostream mit std::hex.

    Stehen denn im Buffer die richtigen Werte? Benutze dazu den Debugger.
    Zeige mal den korrigierten Code (aber ReadFile(...)).

    Simon



  • Hier der korrigierte Teil:

    char buf[7];
    DWORD read =0;

    ReadFile(hCom, buf, sizeof(buf),&read,NULL);
    DWORD i;

    for(i=0; i<read; i++)
    {
    for (int i2=0; i<8; i++)
    {
    printf("%i ", (unsigned char)buf[i]);
    m_stranzeige += buf;
    }

    }

    Im buffer stehen die gleichen Werte, die dann auch ausgegeben werden, leider die falschen bzw. nicht in der Form, in der ich Sie haben will. (Habe ich per Debugger geprüft)

    Lese mich jetzt in io::stream ein, vielleicht ist das ja die Lösung!!

    Danke



    1. Benutze bitte die [cpp]-Tags. Das macht deinen Code dreimal lesbarer.
    2. Bist du sicher dass du im richtigen Forum bist? Du schreibst erstens nur mit C-Funktionen (printf) statt der C++-Funktionen, zweiten hantierst du mit WinAPI oder ähnlichem rum, wofür es auch ein eigenes Forum gibt. In diesem Bereich gehts eigentlich nur um Standard-C++ Fragen...


  • Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • sorry, werde ab jetzt die [cpp]-Tags benutzen.

    das mit printf, war nur ein versuch, der aber leider nicht funktionierte.
    bekomme meine Werte einfach nicht wie gewünscht ausgegeben.



  • 1. Wofür brauchts Du die ineinander verschaltelten Schleifen? Du brauchst sie nicht.
    2. in den for Schleifen inkrementierst Du beides mal i -> Fehler!
    3. buf ist immer noch nicht initialisiert.

    Ich schlage Dir vor erstmal ein Buffer anzulegen, zu initialisiern, von Hand mir Werten füllen (à la buf[0] = 0x12) und den dann auszugeben.

    Dein Problem hat, denke ich, (noch) nichts mit der seriellen Schnittstelle zu tun.

    Simon



  • Warum versuchst du nicht eine Klasse dafür zu verwensen, welche die WinApi funktionalität kapselt,

    ich kann mich erinnern, dass mynonA und AJ mal eine solche Klasse geschrieben haben, dies sollte dein Vorgehen vereinfachen können.

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39312-and-highlight-is-str%F6me+lenken.html



  • Das problem liegt (noch) nicht dort...



  • @EvilDaddy: danke für den Vorschlag, aber für mich leider das falsche. Versuche ja lediglich den Port auszulesen und zwar auf Hex Basis.

    @theta: habe eine Schleife rausgenommen und versucht buf zu initialisieren....
    leider bekomme ich nichtmal jetzt eine vernünftige ausgabe obwohl ich den ReadFile - Teil erstmal rausgenommen habe 😞
    bastle jetzt an der initialisierung, dass das dann zumindest erstmal läuft.

    danke soweit schonmal!



  • per Debugger bekomme ich immer nur "|||||" als Variablen-Inhalt angezeigt



  • Zeige deinen Code...



  • char buf[7];
    DWORD read =0;
    DWORD i=1;
    
    buf[0]=0x11;
    buf[1]=0x31;
    buf[2]=0x55;
    buf[3]=0x03;
    buf[4]=0x72;
    buf[5]=0x14;
    buf[6]=0x13;
    buf[7]=0x30;
    
    for(i=0; i<read; i++)
    {
            std::cout << std::hex << buf << std::endl;
    }
    

    Hab mal den std::hex Teil versucht, aber läuft genauso wenig wie meine vorherige Variante.

    Danke nochmals für alle Eure Mühen.



  • 1. Dein Buffer hat 7 Plätze, Du greifst aber auf den 8. ten zu ➡ Fehler
    2. In der Schleife musst Du die Elemente einzeln rausholen mit buf[i] und nicht einfach buf
    Edit:
    3. Du initialisierst read auf 0 ➡ Schleife wird 0 mal durchlaufen.

    char buf[8] = { };
    buf[0] = ..
    .
    .
    .
    buf[7] = ...
    
    DWORD read = 8;
    
    for(int i=0; i < read; i++) 
    {
       unsigned int value = static_cast<unsigned int>(buf[i]);
       std::cout << std::hex << value << std::endl; 
    }
    

Anmelden zum Antworten