Announcement

Collapse
No announcement yet.

Senden von Hex-Werten via Serialport

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

  • Senden von Hex-Werten via Serialport

    Hallo,

    leider hat sich mein Problem nun ein wenig geändert und zwar ist es folgendes. Folgender Code funktioniert leider nicht so wie ich es gerne hätte und ich weiß nicht wieso. Die gegenseite ist okay. Denn wenn ich das über ein Terminal versuche dann klappt es einwandfrei:

    Code:
    Sub Button1Click(sender As Object, e As EventArgs)
    		Dim Bytes(8) As Byte
    		Dim status As Integer
    		Bytes(0) = &H00
    		Bytes(1) = &H00
    		Bytes(2) = &H00
    		Bytes(3) = &H00
    		Bytes(4) = &H00
    		Bytes(5) = &H00
    		Bytes(6) = &H00
    		Bytes(7) = &H00
    		Dim anz As Integer
    		For i = 0 To 39
    			If lbl(i).BackColor = System.Drawing.Color.Black Then
    				status = 1
    			Else
    				status = 0
    			End If
    			
    			If i < 5 Then
    				Bytes(1) = Bytes(0) Or (status << (5-(i+1)))
    			ElseIf i < 10 Then
    				Bytes(2) = Bytes(1) Or (status << (10-(i+1)))
    			ElseIf i < 15 Then
    				Bytes(3) = Bytes(2) Or (status << (15-(i+1)))
    			ElseIf i < 20 Then
    				Bytes(4) = Bytes(3) Or (status << (20-(i+1)))
    			ElseIf i < 25 Then
    				Bytes(5) = Bytes(4) Or (status << (25-(i+1)))
    			ElseIf i < 30 Then
    				Bytes(6) = Bytes(5) Or (status << (30-(i+1)))
    			ElseIf i < 35 Then
    				Bytes(7) = Bytes(6) Or (status << (35-(i+1)))
    			ElseIf i < 40 Then
    				Bytes(8) = Bytes(7) Or (status << (40-(i+1)))
    			End If
    		Next
    		lbl_anz8.Text = "Byte8: " & Bytes(0).ToString("X2")
    		lbl_anz.Text =  "Byte1: " & Bytes(1).ToString("X2")
    		lbl_anz2.Text = "Byte2: " & Bytes(2).ToString("X2")
    		lbl_anz3.Text = "Byte3: " & Bytes(3).ToString("X2")
    		lbl_anz4.Text = "Byte4: " & Bytes(4).ToString("X2")
    		lbl_anz5.Text = "Byte5: " & Bytes(5).ToString("X2")
    		lbl_anz6.Text = "Byte6: " & Bytes(6).ToString("X2")
    		lbl_anz7.Text = "Byte7: " & Bytes(7).ToString("X2")
    		
    		serialPort1.WriteLine("data")
    
    
    
    		serialPort1.Write(Bytes(0))
    		serialPort1.Write(Bytes(1))
    		serialPort1.Write(Bytes(2))
    		serialPort1.Write(Bytes(3))
    		serialPort1.Write(Bytes(4))		
    		serialPort1.Write(Bytes(5))
    		serialPort1.Write(Bytes(6))
    		serialPort1.Write(Bytes(7))
    		
    		
    	End Sub

  • #2
    Schön, und was ist der Fehler?
    Hast du debuggt?
    Christian

    Comment


    • #3
      Aus Deinem Code werd ich als Aussenstehender überhaupt nicht schlau. Dann fehlende Infos, wie soll ich da helfen?



      >> funktioniert leider nicht so wie ich es gerne hätte
      Wie hättest Du es denn gern?

      >> und ich weiß nicht wieso
      Schon mal mit dem Debugger probiert?



      Geh das Programm schrittweise durch, schau Dir alle Variablen an, wie sie sich verändern, und vergleiche mit dem, was Du erwartest.
      Günther

      Comment


      • #4
        Das Problem liegt darin, dass ich z.b. auf dem entsprechenden Label der richtige Wert angezeigt wird. Also beispiel mal 00 somit erwarte ich, dass der Wert 00 auch gesendet wird über die Serielle aber dann das Ergebnis: Es wird statt der 00 eine 30 gesendet.

        Er sendet also nicht den Hex-Wert sondern wandelt die 00 in ein String um und eine 0 entspricht der 30. Aber er soll direkt den Hex-Wert senden und nicht den Hex-Wert der Zahl

        Comment


        • #5
          Ein Hex-Wert ist nur eine Darstellung, genau wie Binär oder Oktal.

          Wenn der Nutzer 0 eingibt und du eine 0 senden willst, musst du den Wert konvertieren. Schließlich werd ein einem Textfeld nun mal darstellbare Zeichen (bsp. A ist dann 65) verarbeitet
          Christian

          Comment


          • #6
            Originally posted by Christian Marquardt View Post
            Ein Hex-Wert ist nur eine Darstellung, genau wie Binär oder Oktal.

            Wenn der Nutzer 0 eingibt und du eine 0 senden willst, musst du den Wert konvertieren. Schließlich werd ein einem Textfeld nun mal darstellbare Zeichen (bsp. A ist dann 65) verarbeitet
            Okay klingt plausibel. Wie würde denn diese konvertierung dann aussehen? Habe schon viel probiert aber bisher ist alles nach hinten los gegangen.

            Comment


            • #7
              keine Ahnung, ich kenne deine Anforderungen nicht.....aber ich würde mal eine ASCII Tabelle ansehen
              Christian

              Comment


              • #8
                Ich möchte einfach erreichen, dass der Wert der eingegen wird auch als Hex wert übermittelt wie sie eingegeben werden. Gibt der user 43 ein dann soll das nicht als asci interpretiert werden sondern genau dieser wert gesendet werden.

                Comment


                • #9
                  Ich würde es erstmal so in der Art testen:

                  Dim strTmp1 As String = Bytes(0).ToString("X2")
                  Dim bTmp1 As Byte = CByte(strTmp1)

                  serialPort1.Write(bTmp1)

                  Comment


                  • #10
                    Dann musst du den eingegebenen String vor dem Senden nach Dez 67 / Hex 43 / Oct 103 / Bin 1000011 umwandeln
                    Christian

                    Comment


                    • #11
                      Originally posted by snaper View Post
                      Ich möchte einfach erreichen, dass der Wert der eingegen wird auch als Hex wert übermittelt wie sie eingegeben werden. Gibt der user 43 ein dann soll das nicht als asci interpretiert werden sondern genau dieser wert gesendet werden.
                      Er sendet nur Bytes. Du solltest dich nicht auf Hex versteifen.
                      Dann wandelst du es halt in Byte um.

                      Comment


                      • #12
                        Originally posted by sv00010 View Post
                        Ich würde es erstmal so in der Art testen:

                        Dim strTmp1 As String = Bytes(0).ToString("X2")
                        Dim bTmp1 As Byte = CByte(strTmp1)

                        serialPort1.Write(bTmp1)
                        Kommt weiterhin als 30 an.

                        Originally posted by Christian Marquardt View Post
                        Dann musst du den eingegebenen String vor dem Senden nach Dez 67 / Hex 43 / Oct 103 / Bin 1000011 umwandeln

                        Leider weiß ich grade beim besten willen nicht was du meinst.
                        Also das Problem ist, dass der Empfänger die Sachen auch als Hex-Wert versteht daher muss eine 0 auch als 0 gesendet werden oder eine 3 als 3 und ein FA als FA.

                        Comment


                        • #13
                          Originally posted by snaper View Post
                          Kommt weiterhin als 30 an.
                          Ließt du die Daten aus einer TextBox?
                          Dann musst du den String in eine Zahl umwandeln und darfst erst mit dieser weiterarbeiten.

                          Comment


                          • #14
                            Dann musst du den String in eine Zahl umwandeln und darfst erst mit dieser weiterarbeiten.
                            Das hat er ja nicht verstanden
                            Christian

                            Comment


                            • #15
                              Ich lese das nicht aus einer Textbox aus sondern diese Bytes werden quasi durch den Status der label gefüllt:

                              Dafür zuständig ist diese Codestelle:
                              Code:
                              For i = 0 To 39
                              			If lbl(i).BackColor = System.Drawing.Color.Black Then
                              				status = 1
                              			Else
                              				status = 0
                              			End If
                              			
                              			If i < 5 Then
                              				Bytes(1) = Bytes(1) Or (status << (5-(i+1)))
                              			ElseIf i < 10 Then
                              				Bytes(2) = Bytes(2) Or (status << (10-(i+1)))
                              			ElseIf i < 15 Then
                              				Bytes(3) = Bytes(3) Or (status << (15-(i+1)))
                              			ElseIf i < 20 Then
                              				Bytes(4) = Bytes(4) Or (status << (20-(i+1)))
                              			ElseIf i < 25 Then
                              				Bytes(5) = Bytes(5) Or (status << (25-(i+1)))
                              			ElseIf i < 30 Then
                              				Bytes(6) = Bytes(6) Or (status << (30-(i+1)))
                              			ElseIf i < 35 Then
                              				Bytes(7) = Bytes(7) Or (status << (35-(i+1)))
                              			ElseIf i < 40 Then
                              				Bytes(8) = Bytes(8) Or (status << (40-(i+1)))
                              			End If
                              		Next

                              Comment

                              Working...
                              X