Announcement

Collapse
No announcement yet.

binaer zu hexadezimal

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

  • binaer zu hexadezimal

    Hi,
    ich habe ein kleines Programm geschrieben um die Daten, die von einem Sirf GPS receiver gesendet werden, in einem Memo darzustellen.

    Der GPS Receiver sendet binaere Daten (Sirf Binary Protocol). Leider zeigt mein Programm ganz komische Zeichen an (keine binaeren Zahlen). Mit ner Demosoftware funktionierte es fein, also der GPS receiver sendet die richtige Daten.

    Also kontaktierte ich die Firma wo ich den Receiver gekauft hatte und die haben gasagt, ich muesste den binaeren stream umwandeln in hexadezimalen.

    Wie kann ich das realisieren? Hat jemand eine Idee?

    Die empfangenen Daten vom GPS Receiver werden in einer char Variable ("char InBuff[100]") gespeichert und mit "Form1->Memo1->SetSelTextBuf(InBuff);" angezeigt.

    Gruss,
    Ronald

  • #2
    Binär heißt, Nullen und Einsen, also z.B.: 1101011010110001101101110011.... Bei einer Hexadezimalzahl entsprechen jeweils 4 Stellen der Binärzahl einer Ziffer (0...F). Die erste Binärziffer wird mit 1, die zweite mit 2, die dritte mit 4 und die vierte mit 8 multipliziert, und alle Ergebnisse werden zusammengezählt. Nach der 4. Ziffer beginnt das Spiel von vorne. Also: aus 1011 wird 1*1+1*2+0*4+1*8=11(dezimal). Um daraus die Hex-Ziffer 'B' zu machen, gibt es die Methode AnsiString::IntToHex(int value, int digits); Die Frage ist jetzt noch, wie die Daten in Deinem "char InBuff[100]" abgelegt sind, und in welcher Reihenfolge der Hex-String zu schreiben ist.

    Gruß, Günthe
    Günther

    Comment


    • #3
      <html>

      <head>
      <meta http-equiv="Content-Language" content="de">
      <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
      <meta name="GENERATOR" content="Microsoft FrontPage 4.0">
      <meta name="ProgId" content="FrontPage.Editor.Document">
      <title>Neue Seite 2</title>
      </head>

      <body>

      <p>versuch mal das hier:</p>
      <pre>void __fastcall TForm1::Button1Click(TObject *Sender)
      {
      Memo1-&gt;Lines-&gt;Clear();
      for(int i=0; i&lt;100; i++)
      {
      int x=InBuff[i];
      AnsiString s=IntToHex(x,2);
      Memo1-&gt;Text=Memo1-&gt;Text+s+&quot; ";
      }
      }</pre>
      <p>Gruß, Günther</p>

      </body>

      </html&gt
      Günther

      Comment


      • #4
        Hi,
        Ich habe das ausprobiert und IntToHex funktioniert prima. Danke. Aber ich habe folgendes Problem.: Ich lese die empfangenen Daten (8 Bits,1 Stopbit) als ASCII ein und speichere es in InBuff als char. Manchmal kommt es vor, dass der ASCII Wert negativ wird. Wie kann ich das vermeiden oder was mache ich falsch? Ich meine "int x=InBuff[i]" (siehe unten) wird negativ.

        Ich verwende folgendes:
        ...
        hComm=CreateFile("COM1",GENERIC_READ | GENERIC_WRITE,0,0,OPEN_EXISTING,0,0);
        ...
        BuildCommDCB("9600,N,8,1",&dcbCommPort);
        ...
        DWORD dwBytesRead;
        char InBuff[100];
        ReadFile(hComm, InBuff, 50, &dwBytesRead, NULL);
        ...
        for (int i=0;i<100;i++)
        {
        int x=InBuff[i];
        AnsiString s=IntToHex(x,2);
        Form1->Memo1->Text=Form1->Memo1->Text+s+" ";
        }
        ...

        Gruss,
        Ronal

        Comment


        • #5
          char hat ein Wert im Bereich vom -128 bis 127.

          mindestens ein unsigend char nehmen oder besser Speicherbereich reservieren
          Christian

          Comment

          Working...
          X