Byte senden

  • VB.NET

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von fraju.

    Byte senden

    Hallo,
    ich möchte einen Wert über die serielle Schnittstelle an einen µC senden.

    Der Wert von einer Scrollbar soll als ein Byte gesendet werden mehr nicht(auch kein CR oder so)
    Von 0 bis 127 funktioniert das auch, aber ich benötige ein Byte also bis 255.

    Quellcode

    1. Dim sollwert1 As Byte
    2. sollwert1 = Val(R_sollwert1.Value)
    3. SerialPort.Write(Chr(sollwert1))


    vielen Dank, Tobias
    Meines Wissens kann der Datentyp "Byte" Zahlen von -128 bis 127 (Umwandlung in Short o.Ä.) aufnehmen oder Zahlen von 0 bis 255 (Standard). In jedem Fall werden 256 Zahlen möglich sein.
    Ich denke das Problem stellt die Funktion "Val()" dar, da die einen Double- oder Integer-Wert zurückgibt.
    Versuche stattdessen "Convert.ToByte(R_sollwert1.Value)"


    Gruss
    Pascal
    Machen wir es doch gleich richtig.
    Du musst Bytes senden, wenn Bytes ankommen sollen. Nicht Characters.

    VB.NET-Quellcode

    1. Dim sollwert1() As Byte
    2. ReDim sollwert1(0)
    3. sollwert1(0) = Convert.ToByte(R_sollwert1.Value)
    4. SerialPort.Write(sollwert1, 0, 1) ' Hier lag der Fehler
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    fraju schrieb:

    ..so nebenbei,es werden immer Bytes gesendet.
    Insbesondere dann, wenn nur 7, 6, oder 5 Bit übertrtagen werden.

    RodFromGermany schrieb:

    Du musst Bytes senden, wenn Bytes ankommen sollen. Nicht Characters.
    Wenn Charakter gesendet werden, rasen zwar Bytes durch die Leitung, da kann es jedoch, je nach eingestellten CodePages zu mächtigen Missverständnissen kommen.
    Das passiert definitiv nicht bei gesendeten Bytes.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    SUPER - der Programmcode hat mir sehr geholfen! Es geht!
    Eine Kleinigkeit noch:
    Ich möchte die Variable(Sollwert1) überall nutzen können also "Global" wie mache ich das?



    Quellcode

    1. Dim sollwert1() As Byte
    2. ReDim sollwert1(0)
    3. sollwert1(0) = Convert.ToByte(R_sollwert1.Value)
    4. SerialPort.Write(sollwert1, 0, 1) ' Hier lag der Fehler

    VB.NET-Quellcode

    1. Public sollwert1() As Byte
    2. Private Sub Send()
    3. ReDim sollwert1(0)
    4. sollwert1(0) = Convert.ToByte(R_sollwert1.Value)
    5. SerialPort.Write(sollwert1, 0, 1)
    6. End Sub
    Oder Du machst eine Property draus:

    VB.NET-Quellcode

    1. Private _sollwert1() As Byte
    2. Public Property sollwert1 As Byte()
    3. Get
    4. Return _sollwert1
    5. End Get
    6. Set(ByVal value As Byte())
    7. _sollwert1 = value
    8. End Set
    9. End Property
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Kann man den Writebefehl an Beliebiger Stelle im Programm schreiben? Ich dachte mir das so:

    Quellcode

    1. Public Class Form1
    2. Public startbyte() As Byte
    3. Private Sub Send()
    4. ReDim startbyte(0)
    5. startbyte(0) = Convert.ToByte(250)
    6. End Sub
    7. Private Sub ScrollKanal1_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs) Handles ScrollKanal1.Scroll
    8. SerialPort.Write(startbyte, 0, 1)
    9. End Sub


    Oder hab ich da etwas falsch geschrieben? Zumindest geht es bei mir nicht - die Variable ist immer "Nothing"
    Events vertauscht: Bei Send() kommt der Code von ScrollKanal1_Scroll() hin und umgekehrt.
    Allerdings: Wenn Send() aufgerufen wird bevor einmal gescrollt wurde ist startbyte(0) wirklich Nothing.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Dann habe ich mich falsch ausgedrückt - oder es falsch verstanden:

    Wenn ich scrolle soll sofort gesendet werden.
    startbyte(0) = Convert.ToByte(250) möchte ich bei Programmstart festlegen und der Wert soll sich auch nicht ändern/nicht geändert werden.
    Wann springt das Programm denn in die "Private Sub Send()"?
    Wenn Du sofort senden willst wenn gescrollt wird musst Du den gesamten Code in die Scroll Sub schreiben:

    VB.NET-Quellcode

    1. Private Sub ScrollKanal1_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs) Handles ScrollKanal1.Scroll
    2. ReDim startbyte(0)
    3. startbyte(0) = Convert.ToByte(250)
    4. SerialPort.Write(startbyte, 0, 1)
    5. End Sub


    Soll eigentlich nur das StartByte(0) gesendet werden oder das ganze Array?

    Und wann das Programm die Sub Send() ausführt können wir nicht wissen. Das musst Du selbst wissen. (Laut diesem Code garnicht).
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Ich weiß nicht ob RodFromGermany nur den [/Ironie] -Tag vergessen hat oder ob er es ernst gemeint hat.

    Mit Seriellen Schnittstellen können nicht nur 8, sondern auch weniger (mehr auch?) Bits übertragen werden. Das kann in den Properties der Schnittstelle eingestellt werden. Vielleicht ist bei Dir standardmäßig 7 Bit eingestellt und es funktioniert nur bis 127.

    Noch eine kleine Korrektur an PascalN: Bytes stellen Werte von 0 bis 255 dar, nicht von -128 bis 127, denn das wäre SByte (Signed Byte).
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    RodFromGermany schrieb:


    Insbesondere dann, wenn nur 7, 6, oder 5 Bit übertrtagen werden.
    ..zu meinem Verständnis,solltest du dies etwas erläutern.
    Es könnte natürlich auch für Andere Aufschlussreich sein.
    MfG

    Niko Ortner schrieb:

    Ich weiß nicht ob RodFromGermany nur den [/Ironie] -Tag vergessen hat oder ob er es ernst gemeint hat.
    MSDN: Der Bereich von Werten für diese Eigenschaft erstreckt sich von 5 bis 8. Der Standardwert ist 8.

    VB.NET-Quellcode

    1. SerialPort.DataBits = 8 ' Standard, Stand der Technik
    2. SerialPort.DataBits = 7 ' Dies könnte ein alter Lochbandleser, -schreiber sein
    3. SerialPort.DataBits = 5 ' Dies könnte ein alter Fernschreiber sein
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich mag dieses viele Zitieren nicht,bringt sehr oft keine Lösung.

    Die Fernschreibzeit kenne ich noch sehr gut auch das 5 Bit Protokoll.
    Wenn du aber von 5,6,7,8 Bit sprichst dann musst du das 9 Bit =Paritätbit auch nennen.
    Es fehlen im Übertragungsprotokoll dann noch das Start/Stop Bit/s.

    Wenn wir von der seriellen sprechen ,dann werden vom Programm dem UART immer Byte Variable zugewiesen welcher der UART,je nach Protokoll verarbeitet und sendet.

    Warum der TE keine Werte bis 255 Senden kann liegt an der nicht richtigen Einstellung im VB Prog.
    Grüße

    Edit: ein bekanntes Serielles Verfahren war und ist auch noch das Morsen ;)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „fraju“ ()

    @fraju:
    Was Du hier schreibst, ist Grütze.
    Das Problem dieses Threads sind die Daten auf der Leitung, nicht aber die hardwaretechnische Umsetzung oder elementare Sicherheitschecks.
    Bei SerialPort.DataBits = nwerden n Datenbits pro kleinster Sendeeinheit übertragen. Was da noch davor und hinten dran gehängt wird, ist hier kein Thema.
    Übrigens: Sieh Dir mal die Antworten des TE auf meine Beiträge an.
    Übrigens 2: Auf einer CD werden 14 Bit pro Byte codiert.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Sooo viel Text wegen einer Frage :)

    Dieser Code funktioniert:

    Quellcode

    1. Private Sub ScrollKanal1_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs) Handles ScrollKanal1.Scroll
    2. Dim Startbyte() as Byte
    3. ReDim startbyte(0)
    4. startbyte(0) = Convert.ToByte(250)
    5. SerialPort.Write(startbyte, 0, 1)
    6. End Sub


    Damit bin ich auch zufrieden - aber...


    Ich habe einen µC der die seriellen Daten Byteweise empfängt.
    Wenn er die Zahl 250 als Byte empfängt weiß er, dass es losgeht.
    Wenn er die Zahl 251 als Byte empfängt weiß er, dass es alle Daten gewesen sind und er diese verarbeiten kann.
    Da bei jeder scrollbar Wertänderung der aktuelle Wert gesendet werden soll, müsste ich also jedes Mal:

    -die 250 als Byte festlegen

    Quellcode

    1. Private Sub ScrollKanal1_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs) Handles ScrollKanal1.Scroll
    2. Dim Startbyte() as Byte
    3. ReDim startbyte(0)
    4. startbyte(0) = Convert.ToByte(250)
    5. SerialPort.Write(startbyte, 0, 1)
    6. End Sub


    -die 251 als Byte festlegen

    Quellcode

    1. Private Sub ScrollKanal1_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs) Handles ScrollKanal1.Scroll
    2. Dim Stopbyte() as Byte
    3. ReDim stopbyte(0)
    4. stopbyte(0) = Convert.ToByte(251)
    5. SerialPort.Write(stopbyte, 0, 1)
    6. End Sub


    -UND dann den eigentlichen Wert von Scrollbar.

    Quellcode

    1. Private Sub ScrollKanal1_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs) Handles ScrollKanal1.Scroll
    2. Dim Kanal1() as Byte
    3. ReDim Kanal1(0)
    4. Kanal1(0) = Convert.ToByte(Kanal1.value)
    5. SerialPort.Write(Kanal1, 0, 1)
    6. End Sub


    und deshalb war die Idee einmal 250 & 251 als ByteVariable zu declarieren und dann überall NURNOCH

    Quellcode

    1. SerialPort.Write(startbyte, 0, 1)
    2. SerialPort.Write(Kanal1, 0, 1)
    3. SerialPort.Write(stopbyte, 0, 1)

    in die Scrollbar zu schreiben

    Aber wenn das nicht geht dann schreibe ich es in jede Scrollbar einzeln rein - ist nicht schlimm nur nicht so übersichtlich.
    Ich versuch mal eben zu beschreiben, was ich verstanden habe.
    Startbyte ist 250, Endbyte ist 251.
    Bei jedem Scroll wird das Startbyte, der Scholl-wert und das Endbyte gesendet?
    Dann mach es doch so:

    VB.NET-Quellcode

    1. Private Sub ScrollKanal1_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs) Handles ScrollKanal1.Scroll
    2. Dim values() as Byte
    3. ReDim values(2)
    4. values(0) = Convert.ToByte(250)
    5. values(1) = Convert.ToByte(ScrollKanal1.Value)
    6. values(2) = Convert.ToByte(251)
    7. SerialPort.Write(values, 0, 3)
    8. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!