RS232 Hex senden



  • Hallo,

    ich muss hex Werte an ein rs232 Gerät senden. WriteText verwende ich bisher. Wie kann ich den Hexwert senden ? Wie deklariere ich einen Hex-Wert ? Ich hab z. B. 56 00 0a 00 zu senden.

    Danke für Hilfe !



  • Unten ist Quellcode von Visual Studio, da funktioniert das (ich erfasse mit der Option Hex 56000000). Ich hab versucht das anzupassen, gelingt aber nicht, da immer irgendwelche Typumwandlungen fehlerhaft sind.

    Ich verwende die TMS Async Komponente und wollte es über WriteBuf versuchen.

    char buff[4];
    	buff[0] = 56;
    	buff[1] = 00;
    	buff[2] = 00;
    	buff[3] = 00;
    
    	char buffer[4];
    	buffer[0] = IntToHex(buff[0], 1);
    	buffer[1] = 00;
    	buffer[2] = 00;
    	buffer[3] = 00;
    
            Ok = VaComm1->WriteBuf(buffer, 4);
    
    private void SendData()
        {
          if (CurrentDataMode == DataMode.Text)
          {
            // Send the user's text straight out the port
            comport.Write(txtSendData.Text);
    
            // Show in the terminal window the user's text
            Log(LogMsgType.Outgoing, txtSendData.Text + "\n");
          }
          else
          {
            try
            {
              // Convert the user's string of hex digits (ex: B4 CA E2) to a byte array
              byte[] data = HexStringToByteArray(txtSendData.Text);
    
              // Send the binary data out the port
              comport.Write(data, 0, data.Length);
    
              // Show the hex digits on in the terminal window
              Log(LogMsgType.Outgoing, ByteArrayToHexString(data) + "\n");
            }
            catch (FormatException)
            {
              // Inform the user if the hex string was not properly formatted
              Log(LogMsgType.Error, "Not properly formatted hex string: " + txtSendData.Text + "\n");
            }
          }
          txtSendData.SelectAll();
        }
    [code]
    
    [code]
    private byte[] HexStringToByteArray(string s)
        {
          s = s.Replace(" ", "");
          byte[] buffer = new byte[s.Length / 2];
          for (int i = 0; i < s.Length; i += 2)
            buffer[i / 2] = (byte)Convert.ToByte(s.Substring(i, 2), 16);
          return buffer;
        }
    


  • buffer[0] ist vom Datentyp char , IntToHex liefert einen AnsiString zurück. Klingelt da was?



  • Wie deklariere ich einen Hex-Wert ?

    char c = 0x56;
    


  • So soll es gehen:

    var
      b: byte;
    
    Vacomm.WriteBuf(b,1);
    

    Hier kommt nix an. Was ich auch nicht verstehe - mit dem anderen Programm hab ich das ohne 0x davor übergeben, da lief das.
    Also muss ich irgendwie als Hex 56000000 übergeben. Und da komm ich nicht weiter.

    char buffer[4];
    	buffer[0] = 0x56;
    	buffer[1] = 0x00;
    	buffer[2] = 0x00;
    	buffer[3] = 0x00;
    
            Ok = VaComm1->WriteBuf(buffer, 4);
    


  • Du scheinst nicht verstanden zu haben, dass du ein textbasiertes Protokoll hast. Du musst deine Binärdaten als 2-stellige Hexzahlen formatieren, aneinanderhängen und das Resultat verschicken.



  • Kannst mir da bitte nen Tip geben. Ich hab alles mögliche versucht, komm aber nicht klar.


  • Mod

    Hallo

    wenn es Textbas. ist.

    dann moeglicherweise so

    char buffer[4];
        buffer[0] = '5';
        buffer[1] = '6';
        buffer[2] = '0';
    usw..
    

    gibst sicher bessere Loesungen
    aber die findest du dann schon 🕶

    mfg
    Klaus



  • Bei mir haut das alles nicht hin. Ich hab jetzt noch ne Stunde zum Probieren und wenn nicht hau ich das Morgen früh ins Projektforum, dann findet sich vielleicht gegen Bezahlung jemand der mit dem TeamViewer einen Blick drauf wirft.



  • Auch wenn´s weh tut:
    Die Aufgabe ist so trivial, wenn du daran scheiterst fehlen dir zu viele Grundlagen und du hast dich an der Aufgabe verhoben.
    Das Forum gibt gern Hilfestellungen und Tipps zu konkreten Problemen. Alles, was du zu deiner Problemlösung benötigst, wurde hier bereits erwähnt. Programmieren hat wenig mit mit Probieren zu tun, du solltest schon wissen, was du tust.



  • OK, bevor das richtig Geld kostet können wir das doch mal probieren.
    Poste bitte mal den Code, wo du die Verbindung aufbaust und die Daten verschickst.
    Um zu gucken, was tatsächlich auf der Schnittstelle passiert kannst du Serial Monitor installieren.



  • Komponente:
    Baudrate: br57600
    Databits: db8
    DeviceName: COM7
    PortNum: 7
    Stopbits: sb1
    FlowControl:
    ControlDtr: dtrDisabled
    ControlRts: rtsHandshake
    DsrSensitivity: False
    OutCtsFlow: False
    OutDsrFlow: False
    TxContinueOnXoff: False
    XonXoffIn: False
    XonXoffCut: False
    MonitorEvents
    reCts: True, alles andere false

    ComboPortNum->ItemIndex = ComboPortNum->Items->IndexOf("7");
    ComboBaudrate->ItemIndex = ComboBaudrate->Items->IndexOf("br57600");

    ComboDatabits->ItemIndex = ComboDatabits->Items->IndexOf("db8");
    ComboParity->ItemIndex = ComboParity->Items->IndexOf("paNone");
    ComboStopbits->ItemIndex = ComboStopbits->Items->IndexOf("sb1");
    VaComm1->SetRTS(true);

    VaComm1->Open();
    
      AnsiString S = "";
      Boolean Ok;
      int i;
    
      char buffer[4];
      buffer[0] = '0x76';
      buffer[1] = '0x00';
      buffer[2] = '0x0A';
      buffer[3] = '0x00';
      Ok = VaComm1->WriteBuf(buffer, 4);
    
    /*
      S = EditTransmit->Text;
      VaComm1->WriteText(sCode);
      i = S.Length();
    */
    
      if (!Ok)
    	Memo1->Lines->Add("Error writing to: " + Format("Port %d", ARRAYOFCONST(((int)VaComm1->PortNum))));
      else Memo1->Lines->Add(Format("Writing %d characters", ARRAYOFCONST(((int)i))));
    

  • Mod

    Hallo

    und das laesst sich uebersetzen ohne Fehler/Warnings ?

    Mfg
    Klaus



  • Jepp.

    Aber stimmt - 2 Sachen hatte ich geändert - String S statt AnsiString und beim Senden (S) statt (sCode). Nachdem ich hier aber mit WriteBuf zgegriffen hab ist das nicht aufgefallen.

    Basis von dem Ganzen ist die Demo der TMS Komponente.


  • Mod

    Hallo

    keine Warning W8071 😕

    mfg
    Klaus





  • ok, ich passe das an.
    char buffer[8];
    buffer[0] = "0x7";
    buffer[1] = "0x6";
    ...
    buffer[7] = "0x0";

    Brachte nix, aber das andere war falsch.


  • Mod

    immer noch falsch 😡

    wo ist der Fehler in

    buffer[0] = "0x7";
    

    sollte es nicht

    buffer[0] = '7';
    

    sein

    mfg

    Klaus



  • Hab ich doch auch schon gemacht. Ich glaub dass Einstellungen in der Komponente nicht stimmen.


  • Mod

    Hallo

    hast du mit SerialMon getestet was du sendest
    (wie schon DocShoe gepostet hat)

    oder zeig mal was du bisher hast

    Mfg
    Klaus


Log in to reply