Announcement

Collapse
No announcement yet.

Daten schreiben über RS232!!!

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Daten schreiben über RS232!!!

    Hallo Leute,

    ich würde gerne wissen wie ich Daten über RS232-Verbindung reinschreiben kann.
    Ich lese die daten folgendermaßen aus:

    Code:
    void __fastcall TForm1::BitBtn5Click(TObject *Sender)
    {
       int retval                           = 0;
       unsigned char ucData0,ucData1,ucData2,ucData3,ucData4;
    
       TCursor Save_Cursor                  = Screen->Cursor;
       Screen->Cursor                       = crHourGlass;    // Cursor als Sanduhr
    
       try
       {
          Application->ProcessMessages();
          if(Reader->Get_COM_Open_Status() == false)
          {
             Reader->CMD_Open_RS232();
          }
    
          if(Reader->Get_COM_Open_Status() == false)
          {
             retval = ERR_COMPORT_NOT_OPEN;
          }
          else
          {
             retval = ERR_NO_ERROR;
          }
    
          if(retval == ERR_NO_ERROR)
          {
             retval = Reader->SetTransparentMode(1500,1);
             if(retval != ERR_NO_ERROR)
             {
                retval = ERR_SET_TRANSPARENT_MODE;
    
                // Falls wir schon im Transparent Mode sind "Info Reader Extern" senden um
                // dies zu überprüfen
                retval = Reader->InfoReaderExtern(1500,1);
                if(retval != ERR_NO_ERROR)
                {
                   // Falls "Info Reader Extern" Kommando nicht funktioniert hat
                   // Kommando Direct Transparent Mode probieren
                   retval = Reader->SetDirectTransparentMode(1500,1);
                   if(retval != ERR_NO_ERROR)
                   {
                      // Falls das auch nichts bringt @@EXIT@@ probieren
                      Reader->ExitTransparentMode();
                      Sleep(2500);
    
                      retval = Reader->SetTransparentMode(1500,1);
                      if(retval != ERR_NO_ERROR)
                      {
                         retval = ERR_SET_TRANSPARENT_MODE;
                      }
                   }
                }
             }
          }
    
          Application->ProcessMessages();
          if(retval == ERR_NO_ERROR)
          {
             retval = Reader->InfoReaderExtern(1500,1);
             if(retval != ERR_NO_ERROR)
             {
                retval = ERR_READER_INFO_EXTERN;
             }
          }
    
          if(retval == ERR_NO_ERROR)
          {
             ShowMessage("Mastercard");
          }
    
          // ToDo:
          if(retval == ERR_NO_ERROR)
          {
             int iStartAdr;
             int iTagAdr;
             int TagAnzahl;
    
             unsigned char ucLSB0;
             unsigned char ucMSB0;
    
             unsigned char ucLSB1;
             unsigned char ucMSB1;
    
             unsigned char ucLSB2;
             unsigned char ucMSB2;
    
             unsigned char ucLSB3;
             unsigned char ucMSB3;
    
             unsigned char ucLSB4;
             unsigned char ucMSB4;
    
             unsigned char ucLSB5;
             unsigned char ucMSB5;
    
    /*********************Anzeige von TagAnzahl Anfang*********************/
    
             iTagAdr = EditTagAnzahlAdresse->Text.ToInt();
    
             ucLSB5 = ( iTagAdr & 0x00FF);
             ucMSB5 = ((iTagAdr >> 8) & 0x00FF);
    
             retval = Reader->ReadWriteEEPROMExtern(0x52,ucLSB5,ucMSB5,0x00,1500,1);
             if(retval != ERR_NO_ERROR)
             {
                retval = ERR_EEPROM_EXTERN;
             }
    
             Reader->GetEEPromDataExtern(iTagAdr,&ucData0);
             EditTagAnzahl->Text = EditTagAnzahl->Text.sprintf("%02X", ucData0);
    
             TagAnzahl = EditTagAnzahl->Text.ToInt();
    
    /*********************Anzeige von TagAnzahl    Ende*********************/
    
    /*********************Anzeige von TxP_ID Anfang*******************/
             int i=0;
             iStartAdr = 6;
             TagAnzahl-= 1;
             AnsiString ansiMerker;
             int j, x;
    
             Form1->ProgressBar1->Max = TagAnzahl;
             Form1->ProgressBar1->Visible = true;
    
             while(i != TagAnzahl)
             {
                ucLSB0 = (iStartAdr & 0x00FF);
                ucMSB0 = ((iStartAdr >> 8) & 0x00FF);
    
                ucLSB1 = ((iStartAdr+1) & 0x00FF);
                ucMSB1 = (((iStartAdr+1) >> 8) & 0x00FF);
    
                ucLSB2 = ((iStartAdr+2) & 0x00FF);
                ucMSB2 = (((iStartAdr+2) >> 8) & 0x00FF);
    
                ucLSB3 = ((iStartAdr+3) & 0x00FF);
                ucMSB3 = (((iStartAdr+3) >> 8) & 0x00FF);
    
                ucLSB4 = ((iStartAdr+4) & 0x00FF);
                ucMSB4 = (((iStartAdr+4) >> 8) & 0x00FF);
    
                // 0x57 = Write / 0x52 = Read
                // LSB
                // MSB
                // Wert
                // Timeout
                // Wiederholung Kommando
                retval = Reader->ReadWriteEEPROMExtern(0x52,ucLSB0,ucMSB0,0x00,1500,1);
                if(retval != ERR_NO_ERROR)
                {
                   retval = ERR_EEPROM_EXTERN;
                }
    
                retval = Reader->ReadWriteEEPROMExtern(0x52,ucLSB1,ucMSB1,0x00,1500,1);
                if(retval != ERR_NO_ERROR)
                {
                   retval = ERR_EEPROM_EXTERN;
                }
    
                retval = Reader->ReadWriteEEPROMExtern(0x52,ucLSB2,ucMSB2,0x00,1500,1);
                if(retval != ERR_NO_ERROR)
                {
                   retval = ERR_EEPROM_EXTERN;
                }
    
                retval = Reader->ReadWriteEEPROMExtern(0x52,ucLSB3,ucMSB3,0x00,1500,1);
                if(retval != ERR_NO_ERROR)
                {
                   retval = ERR_EEPROM_EXTERN;
                }
    
                retval = Reader->ReadWriteEEPROMExtern(0x52,ucLSB4,ucMSB4,0x00,1500,1);
                if(retval != ERR_NO_ERROR)
                {
                   retval = ERR_EEPROM_EXTERN;
                }
    
                if(retval == ERR_NO_ERROR)
                {
                   Reader->GetEEPromDataExtern(iStartAdr,&ucData0);
                   Reader->GetEEPromDataExtern(iStartAdr+1,&ucData1);
                   Reader->GetEEPromDataExtern(iStartAdr+2,&ucData2);
                   Reader->GetEEPromDataExtern(iStartAdr+3,&ucData3);
                   Reader->GetEEPromDataExtern(iStartAdr+4,&ucData4);
                   EditUnbekannt->Text = "UNBEKANNT";
                   EditTxpID->Text   = EditTxpID->Text.sprintf("%02X%02X%02X%02X", ucData3,ucData2,ucData1,ucData0);
                   EditTyp->Text     = EditTyp->Text.sprintf("%02X", ucData4);
                   EditSO->Text      = "Ja";
    
                   // Datensatz aus SmartOpen gelesen
    
                   // Jetzt diesen Datensatz in der Struktur suchen
                   j = -1;
                   for (x = 0; x < Informationen.Anzahl; x++)
                   {
                       ansiMerker = Informationen.alleUser[x].TxP_ID;
    
                       if (ansiMerker == EditTxpID->Text)
                       {
                         j = x;
                       }
                   }
    
                   // Wenn Datensatz (d.h. Transponder ID und Typ) nicht vorhanden
                   // den Datensatz hinzufügen
                   if (j == -1)
                   {
                      //Überprüfen ob MAX_USER erreicht
                      if(Informationen.Anzahl < 100)
                      {
                         strcpy (Informationen.alleUser[Informationen.Anzahl].Vorname,  EditUnbekannt->Text.c_str());
                         strcpy (Informationen.alleUser[Informationen.Anzahl].Name,     EditUnbekannt->Text.c_str());
                         strcpy (Informationen.alleUser[Informationen.Anzahl].TxP_ID,   EditTxpID->Text.c_str());
                         strcpy (Informationen.alleUser[Informationen.Anzahl].Typ,      EditTyp->Text.c_str());
                         strcpy (Informationen.alleUser[Informationen.Anzahl].SO,       EditSO->Text.c_str());
                         Informationen.Anzahl++;
                      }
                      else
                      {
                         MessageDlg("Maximale Benutzeranzahl erreicht!\nLöschen Sie einige Users um\nWeiter arbeiten zu können!", mtError, TMsgDlgButtons()<< mbOK, 0);
                      }
                   }
                   else
                   {
                     // Wenn Datensatz vorhanden an der Stelle ein JA setzen
                     strcpy (Informationen.alleUser[j].SO, EditSO->Text.c_str());
                   }
    
                }
                iStartAdr+=5;
                i++;
                Form1->ProgressBar1->Position = i;
                Application->ProcessMessages();
             }
             fktSchreiben (&Informationen);
             fktAnzeigen(&Informationen);
             Form1->ProgressBar1->Visible = false;
          }
    
          Reader->ExitTransparentMode();
          Reader->CMD_Close_RS232();
    
          // Auf @@exit@@ warten
          Sleep(550);
    
          Application->ProcessMessages();
       }
       __finally
       {
          Screen->Cursor                    = Save_Cursor; // Cursor immer wiederherstellen
       }
    }
    Das schreiben der Daten sollte auch fast gleich sein, aber ich kriege es net hin.
    Vlt könnt ihr mir ja helfen ^^
    Achja! Bevor ich es vergesse, die Datensätze sind in einen TXT Datei gespeichert.
    Die Werte sind HEX Zahlen und sollten auch so wieder reingeschrieben werden.

    Es wäre super nett wenn ihr mir weiterhelfen könntet.

    gruß
    guenter67

  • #2
    Nun noch mal all das, was über die Privaten Nachrichten gelaufen ist??

    Also nochmal:

    DU MUSST ENDLICH DEN DATENTYP BEKANNTGEBEN, DER GESCHRIEBEN WERDEN SOLL!!!!

    Datentypen sind
    char
    int
    int_8
    short
    float
    double
    und von mir aus auch String

    Und wie schon erläutert musst du hier ansagen wie dein hexadezimaler Wert (bsp. fe) geschrieben werden soll

    Als Zeichenkette

    "fe" = 2 Byte

    oder als nummerischer Wert in einem Byte

    Und wie auch schon ausgeführt kann in einem Byte kein "fe" gespeichert werden. Die ist eine Zeichekette. Es kann der Wert 254 gespeichert werden, der eben als fe interpretierbar ist

    int x=254;
    int x=0xfe;

    ist gleich. Mitnichten wird im letzteren Fall "fe" gespeichert. Wie auch schon erläutert gibt es keinen HEX-Datentyp und auch enthält ein int keinen DEZ, HEX, BIN oder OCT Wert. Ein int enthält einen Wert. Wie du den "ansiehst" - in welchem Zahlensystem - ist wurscht.

    Und HEX-Zahlen gibt es nicht als Datentyp, sondern ein String oder char der die Zeichen "f" oder "a" enthält. Und da man bekanntermassen mit String nicht rechnen kann, gibt es auch keine "Zahlen"

    String test="f"+"f"
    ergibt nicht 1e



    Leider ist dein Quelltextauszug keine Hilfe, weil das Lesen und Schreiben in der Klasse Reader erfolgt. Ein Hinweis ist

    Reader->ReadWriteEEPROMExtern(0x52,ucLSB0,ucMSB0,0x00,150 0,1);

    Aber dazu fehlen die Info, was die Funktion wann wie erwartet.


    Einen Link wie das Lesen und Schreiben auf rs232 über CreateFile, ReadFile und WriteFile erfolgt habe ich dir über die Privaten Nachrichten gesandt.
    Christian

    Comment


    • #3
      sry, schon wieder vergessen Daten typ sollte am besten unsigned char sein ^^

      Originally posted by Christian Marquardt
      Reader->ReadWriteEEPROMExtern(0x52,ucLSB0,ucMSB0,0x00,1 50 0,1);
      Also ein Mitarbeiter von mir hatte mir gesagt, das man hierrüber die einzelnen adressen ausliest. Für das Schreiben soll ich Reader->...(0x52,....) in Reader->....(0x57,....) ändern (0x52 steht fürs Lesen und 0x57 fürs schreiben).

      gruß
      guenter67

      Comment


      • #4
        for(x=0;x<sByte->Count;x++)
        {
        unsigned char byte=strtol(sByte->Strings[x].c_str(),NULL,16);
        //schreibe Byte
        }

        So wird jedes einzelne Byte übertragen
        Christian

        Comment


        • #5
          Reader->ReadWriteEEPROMExtern(0x57,Adresselow, Adressehigh, byte,1500,1);

          Die Adresse musst du ja wissen....
          Christian

          Comment

          Working...
          X