Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Puffer leeren

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 <
000
05.10.2004, 11:49 Uhr
~Archie
Gast


Hallo zusammen!
Ich kommuniziere mit einem chipkartenleser. Ich stelle fragen und der kartenleser antwortet. z.B.
1. Als erstes wähle ich ein feld auf der simkarte aus indem ich einen speziellen befehl sende z.B. "14 A0 A4 00 00 02 7F 20"; 7F20 ist der FID(field identifier) für das file GSM.
Auf der simkarte ist das GSM-file ein ordner in dem weitere files enthalten sind. Nach dem senden des ersten strings bekomme ich eine antwort darauf die z.B. so aussehen kann
"E7 9F 19" und sie bedeutet, dass das kommando erfolgreich ausgeführt wurde und ,dass 19h bytes zum lesen bereitstehen.

2. Als zweites wähle ich eine datei aus die im GSM-ordner steht. z.B. das LOCI-Feld (location information) "14 A0 A4 00 00 02 6F 7E" daraufhin bekomme ich eine antwort die der ersten ähnlich ist.

3. Dann sende ich einen befehl zum lesen des inhaltes der LOCI-Datei
"13 A0 B0 00 00 0B" die antwort vom Kartenleser folgt sofort.

Ich will jetzt die dritte antwort mit dem inhalt der LOCI-Datei lesen, mit ReadFile(...)-->> daraufhin bekomme ich nicht nur die dritte antwort, sonder alle drei antworten, weil sie sich im Speicherpuffer befinden. wie kann ich den puffer vor dem dritten punkt leeren, sodass nach dem dritten punkt nur die antwort, vom kartenleser, auf den dritten punkt gelesen werden kann.

Bisher lese ich alles was im puffer ist und muss dann abzählen welche stelle ich abfragen muß um den inhalt der LOCI-Datei zu bekommen.

Danke für eure Hilfe!!!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
05.10.2004, 14:28 Uhr
proga



etwas Quellcode wäre schon nicht schlecht, dann könnte man dir vielleicht helfen
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
05.10.2004, 15:35 Uhr
~Archie
Gast



C++:
void CLesen::OnLesen()
{
    DCB PortConfig;
    HANDLE hCom;
    hCom = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
    if(GetCommState(hCom,&PortConfig) == 0)
    {
        //hier fehlerbehandlung
        MessageBox("1.Senden nicht möglich!");
        return;
    }
    PortConfig.BaudRate = CBR_9600;
    PortConfig.StopBits = ONESTOPBIT;
    PortConfig.Parity = NOPARITY;
    PortConfig.ByteSize = 8;
    if(SetCommState(hCom,&PortConfig) == 0)
    {
        //hier error;
        MessageBox("2.Senden nicht möglich!");
    }

    //SENDEN
    unsigned long length1 = 0;
    CString sEoT = 0x03;
    CString sROSaus = "600301000062";
    WriteFile(hCom, sROSaus, sROSaus.GetLength(), &length1, NULL);
    WriteFile(hCom, sEoT, sEoT.GetLength(), &length1, NULL);
    Sleep(250);
    CString sPUp = "6002121363";
    WriteFile(hCom, sPUp, sPUp.GetLength(), &length1, NULL);
    WriteFile(hCom, sEoT, sEoT.GetLength(), &length1, NULL);
    char Antwort1[15];
    ReadFile(hCom, Antwort1, sizeof(Antwort1), &length1, NULL);
    if(Antwort1[13]=='F')
    {
        if(Antwort1[14]=='B')
        {
            MessageBox("Keine Karte im Leser.");
            CloseHandle(hCom);
            OnClose();
        }
    }
    else
    {
        Sleep(1000);
    //SELECT GSM
    CString sSelectGSM = "600814A0A40000027F2025";
    WriteFile(hCom, sSelectGSM, sSelectGSM.GetLength(), &length1, NULL);
    WriteFile(hCom, sEoT, sEoT.GetLength(), &length1, NULL);
    Sleep(200);
    int i;
    //PIN ABFRAGE*********************************
    if (m_dPin1.DoModal() == IDOK)
    {
        CString PinEingabe;
        CString test1 = "";
        CString XOR = "F";
        CString XOR1;
        CString PinSenden = "600E14A020000108";
        CString drei = "3";
        PinEingabe = m_dPin1.m_PinCode;
        if(PinEingabe.GetLength()==4)
        {
            for (i=0; i<=3; i++)
            {
                test1 = test1 + drei;
                test1 = test1 + PinEingabe[i];
                    
            }
            //XOR BERECHNEN**************************************
            int m_sXOR1 = 3;
            for(i=0; i<=(PinEingabe.GetLength()-1); i++)
            {
                m_sXOR1 = m_sXOR1 ^ (PinEingabe[i]-48);
            }
            XOR1.Format(_T("%X"), m_sXOR1);
            WriteFile(hCom, PinSenden, PinSenden.GetLength(), &length1, NULL);
            WriteFile(hCom, test1, test1.GetLength(), &length1, NULL);
            CString Fs4 = "FFFFFFFF";
            WriteFile(hCom, Fs4, Fs4.GetLength(), &length1, NULL);
        }
        else
        {
            int i;
            for(i=0; i<=(PinEingabe.GetLength()-1); i++)
            {
                test1 = test1 + drei;
                test1 = test1 + PinEingabe[i];    
            }
            //XOR BERECHNEN**************************************        
            int m_sXOR1 = 3;
            for(i=0; i<=(PinEingabe.GetLength()-1); i++)
            {
                m_sXOR1 = m_sXOR1 ^ (PinEingabe[i]-48);
            }
            XOR1.Format(_T("%X"), m_sXOR1);
            WriteFile(hCom, PinSenden, PinSenden.GetLength(), &length1, NULL);
            WriteFile(hCom, test1, test1.GetLength(), &length1, NULL);
            CString Fs6 = "FFFFFF";
            WriteFile(hCom, Fs6, Fs6.GetLength(), &length1, NULL);
        }
        WriteFile(hCom, XOR, XOR.GetLength(), &length1, NULL);
        WriteFile(hCom, XOR1, XOR1.GetLength(), &length1, NULL);
        WriteFile(hCom, sEoT, sEoT.GetLength(), &length1, NULL);
        //PIN RESPONSE**********************************************
        char Antwort1[10];
        ReadFile(hCom, Antwort1, sizeof(Antwort1), &length1, NULL);
    }
    Sleep(300);
    COMSTAT stat;
    DWORD dwErrors;
    if(!ClearCommError(hCom, &dwErrors, &stat))
    {
        TRACE(_T("Hallo Döner"));
//        AfxThrowSerialException();
    }

    DWORD dwLength = 0;
    DWORD dwWaitingBytes = stat.cbInQue;

    CString strRead;
    strRead.GetBufferSetLength(dwWaitingBytes);
    ReadFile(hCom, strRead.GetBuffer(6), dwWaitingBytes, &dwLength, NULL);
    strRead.ReleaseBuffer(dwWaitingBytes);
    //SELECT LOCI******************************************
    CString sSelectLoci = "600814A0A40000026F7E6B";
    WriteFile(hCom, sSelectLoci, sSelectLoci.GetLength(), &length1, NULL);
    WriteFile(hCom, sEoT, sEoT.GetLength(), &length1, NULL);
    Sleep(200);
    //READ LOCI
    CString sReadLOCI= "600613A0B000000B6E";
    WriteFile(hCom, sReadLOCI, sReadLOCI.GetLength(), &length1, NULL);
    WriteFile(hCom, sEoT, sEoT.GetLength(), &length1, NULL);
    Sleep(200);
    //clear(buffer);
    m_sLOCI ="";
    char AntwortLOCI[46];
    ReadFile(hCom, AntwortLOCI, sizeof(AntwortLOCI), &length1, NULL);
    for(i=19; i<=40; i++)
    {
        m_sLOCI += AntwortLOCI[i];
    }
    UpdateData(FALSE);
    Sleep(200);
    //SELECT Kc*************************************
    CString sSelectKc = "600814A0A40000026F2035";
    WriteFile(hCom, sSelectKc, sSelectKc.GetLength(), &length1, NULL);
    WriteFile(hCom, sEoT, sEoT.GetLength(), &length1, NULL);
    Sleep(200);
    //READ Kc
    CString sReadKC= "600613A0B00000096C";
    WriteFile(hCom, sReadKC, sReadKC.GetLength(), &length1, NULL);
    WriteFile(hCom, sEoT, sEoT.GetLength(), &length1, NULL);
    Sleep(200);
    m_sKC ="";
    char AntwortKC[42];
    ReadFile(hCom, AntwortKC, sizeof(AntwortKC), &length1, NULL);
    for(i=21; i<=38; i++)
    {
        m_sKC += AntwortKC[i];
    }
    UpdateData(FALSE);
    Sleep(200);
    //SELECT BCCH********************************
    CString sSelectBCCH = "600814A0A40000026F7461";
    WriteFile(hCom, sSelectBCCH, sSelectBCCH.GetLength(), &length1, NULL);
    WriteFile(hCom, sEoT, sEoT.GetLength(), &length1, NULL);
    Sleep(200);
    //READ BCCH
    CString sReadBCCH = "600613A0B000001075";
    WriteFile(hCom, sReadBCCH, sReadBCCH.GetLength(), &length1, NULL);
    WriteFile(hCom, sEoT, sEoT.GetLength(), &length1, NULL);
    Sleep(200);
    m_sBCCH ="";
    char AntwortBCCH[55];
    ReadFile(hCom, AntwortBCCH, sizeof(AntwortBCCH), &length1, NULL);
    for(i=23; i<=54; i++)
    {
        m_sBCCH += AntwortBCCH[i];
    }
    UpdateData(FALSE);
    Sleep(200);
    //SELECT Forbidden PLMN*************************
    CString sSelectFPLMN = "600814A0A40000026F7B6E";
    WriteFile(hCom, sSelectFPLMN, sSelectFPLMN.GetLength(), &length1, NULL);
    WriteFile(hCom, sEoT, sEoT.GetLength(), &length1, NULL);
    Sleep(200);
    //READ Forbdden PLMN
    CString sReadFPLMN = "600613A0B000000C69";
    WriteFile(hCom, sReadFPLMN , sReadFPLMN.GetLength(), &length1, NULL);
    WriteFile(hCom, sEoT, sEoT.GetLength(), &length1, NULL);
    Sleep(200);
    m_sFPLMN ="";
    char AntwortFPLMN[50];
    ReadFile(hCom, AntwortFPLMN, sizeof(AntwortFPLMN), &length1, NULL);
    for(i=26; i<=49; i++)
    {
        m_sFPLMN += AntwortFPLMN[i];
    }
    UpdateData(FALSE);
    //POWER OFF
    Sleep(200);
    CString PowerDown = "60011170";
    WriteFile(hCom, PowerDown, PowerDown.GetLength(), &length1, NULL);
    WriteFile(hCom, sEoT, sEoT.GetLength(), &length1, NULL);
    CloseHandle(hCom);
    }
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
05.10.2004, 16:32 Uhr
proga



Welchen Puffer meinst du genau, deinen Puffer, also m_sLOCI?
oder meinst du den internen Puffer der seriellen Schnittstelle?

PS: beim nächsten mal bitten nicht den kompletten Quellcode posten, sondern nur das wichtigste, also ungefähr so:

...
Variablendeklaration
...
Quellcode zum Senden
...
Quellcode zum Empfangen
...


und vielleicht noch den Fehler makieren / kommentieren


Man hat schlie0lich auch noch andere Sachen zu tun, als nur deinen Quellcode zu analysieren

Dieser Post wurde am 05.10.2004 um 16:39 Uhr von proga editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
05.10.2004, 18:27 Uhr
~Archie
Gast


Sorry ich meine den internen puffer der seriellen schnittstelle. m_sLOCI ist eine Variable zum anzeigen desInhalts der Datei Loci.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
06.10.2004, 08:25 Uhr
proga



Den Puffer löschen kannst du mit


C++:
::PurgeComm(hCom, PURGE_RXCLEAR);



Aber ich würde es so nicht machen. Du willst den Puffer direkt nach dem Aufruf der WriteFile Funktion aufrufen. Das könnte dazu führen, dass du Daten anforderst, diese löschst !!! und dann versuchst zu lesen, dann ist aber der Puffer schon leer.

Dieser Post wurde am 06.10.2004 um 08:26 Uhr von proga editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
06.10.2004, 08:32 Uhr
proga



Normalerweise ist es so, dass du mit ReadFile dir die Daten von der Schnittstelle holst und
diese aus dem internen Puffer gelöscht werden. Wenn du also auf deine Anfrage die
46 Bytes an Daten bekommst, dann hast du diese auch angefordert. Oder du hast bei dem
vorherigen Aufruf von ReadFile (Schritt 1 und 2) nicht alle Daten abgeholt.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
06.10.2004, 09:54 Uhr
~Archie
Gast


Danke für Deine Hilfe.
Genau dieser Befehl fehlte mir!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ 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: