Forum: Mikrocontroller und Digitale Elektronik rs 232 rechtecke vor und nach wert


von Dietmar (Gast)


Lesenswert?

hallo jungs,

habe einen atmega8 mit print lasse ich in "1", "2" und "3" nacheinander 
ausgeben.
funktion ok, im Terminal von MS: 1
                                 2
                                 3
funktion ok, super.
aber in meiner VB.NET 2008 zeigt er mir vor und nach jeweils ein quadrat 
oder rechteck, ich denke mal das sind meine gänsefüße, oder etwa nicht.
jetzt meine frage wie bekomme ich die sachen weg. Weil mit den zeichen 
habe ich probleme in der verarbeitung des programmes wohl, weil bei 
eintreffen der sachen sollen diverse schen farblich gemeldet werden.

ich danke euch schon mal im vorraus.

von Arne (Gast)


Lesenswert?

Zieh Dir mal den SerialPortMonitor:
http://www.serial-port-monitor.com/free-serial-port-monitor-downloads.html
Der logt alles mit, was über die serielle reinkommt/rausgeht. Dann 
kannst Du über den Hexcode und einer ASCII-Tabelle sehen, was da 
empfangen wurde. Schätze aber eher, daß das Steuerzeichen sind.

von STK500-Besitzer (Gast)


Lesenswert?

>aber in meiner VB.NET 2008 zeigt er mir vor und nach jeweils ein quadrat
>oder rechteck, ich denke mal das sind meine gänsefüße, oder etwa nicht.

Gänsefüßchen sind auch "sichtbare" ASCII-Zeichen.
Guck mal in der Codesammlung nach "Hterm". Das ist ein Terminalprogramm, 
das sehr schön sämtliche Darstellungsformen von Bytes bereitstellt.
Ich vermute, dass es sich bei den Klötzchen um Steuerzeichen handelt.

von Peter (Gast)


Lesenswert?

Caridge-Return [CR]=[&H10] und Line-Feed [LF]=[&H08]

Du musst Dir halt im VB-Net Programm die gewünschten Zeichen mittels 
Stringfunktionen (z.B. MyValue = mid(MyString,2,1) rauspicken.

von Dietmar (Gast)


Lesenswert?

wie meinst du das den genau. vom program her.

danke für die antworten

von Dietmar (Gast)


Lesenswert?

hier der quell code von vb 2008 express

Public Class Form1

    Delegate Sub TextBoxCallback(ByVal text As String)

    Private WithEvents myComPort As IO.Ports.SerialPort

    Private EndOfCommand As String = Constants.vbCrLf.ToString

    Private Sub Form1_Load(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles MyBase.Load

        Dim str() As String = IO.Ports.SerialPort.GetPortNames()

        If str.Length = 0 Then
            MsgBox("No Serialport available!", MsgBoxStyle.Critical)
            Me.Close()
        End If


        Me.myComPort = New IO.Ports.SerialPort(str(1)) 'für com3


        Me.myComPort.BaudRate = 4800
        Me.myComPort.DataBits = 8
        Me.myComPort.StopBits = IO.Ports.StopBits.One
        Me.myComPort.Parity = IO.Ports.Parity.None
        Me.myComPort.ReceivedBytesThreshold = 1
        Me.myComPort.Open()
    End Sub

    ''' <summary>

    ''' </summary>
    Private Sub myComPort_DataReceived( _
        ByVal sender As Object, _
        ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) _
        Handles myComPort.DataReceived

        Select Case e.EventType
            Case IO.Ports.SerialData.Chars
            Case IO.Ports.SerialData.Eof
        End Select
        Dim msg As String = Me.myComPort.ReadExisting
        Me.ShowText(msg)
    End Sub

    ''' <summary>

    ''' </summary>
    Private Sub myComPort_PinChanged(ByVal sender As Object, ByVal e As 
_
        System.IO.Ports.SerialPinChangedEventArgs) Handles 
myComPort.PinChanged
        Select Case e.EventType
            Case IO.Ports.SerialPinChange.Break


            Case IO.Ports.SerialPinChange.CDChanged


            Case IO.Ports.SerialPinChange.CtsChanged


            Case IO.Ports.SerialPinChange.DsrChanged


            Case IO.Ports.SerialPinChange.Ring

        End Select
    End Sub

    ''' <summary>

    ''' </summary>
    Private Sub myComPort_ErrorReceived( _
        ByVal sender As Object, _
        ByVal e As System.IO.Ports.SerialErrorReceivedEventArgs) _
        Handles myComPort.ErrorReceived

        Select Case e.EventType
            Case IO.Ports.SerialError.Frame

            Case IO.Ports.SerialError.Overrun


            Case IO.Ports.SerialError.RXOver


            Case IO.Ports.SerialError.RXParity

            Case IO.Ports.SerialError.TXFull

        End Select
        Me.ShowText("ERROR" & vbCrLf)
    End Sub

    ''' <summary>

    ''' </summary>
    Private Sub ShowText(ByVal text As String)
        If Me.TextBox1.InvokeRequired Then
            Dim d As New TextBoxCallback(AddressOf ShowText)
            Me.Invoke(d, New Object() {text})
        Else
            Me.TextBox1.Text = Me.TextBox1.Text & text
        End If
    End Sub

    ''' <summary>

    ''' </summary>
    ''' <param name="command"></param>
    ''' <remarks></remarks>
    Private Sub Send(ByVal command As String)
        Me.myComPort.Write(command & Me.EndOfCommand)
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles Button1.Click

        Me.Send("4")
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As 
System.EventArgs) Handles Button2.Click
        Me.Send("5")
    End Sub
End Class

von Sascha W. (sascha-w)


Lesenswert?

Hallo Dietmar

also die Funktion Print auf dem AVR sendet nicht nur das angegebene 
Zeichen sondern auch noch ein CR 0x0D und ein LF 0x0A, wenn du das mit 
dem Termialprogramm anschaust, so sorgen die beiden Steuerzeichen dafür 
das die Schreibposition zur nächsten Zeile und wieder zum Zeilenanfang 
springt.
Beim Empfang mit VB werden auch diese 2 Codes mit in deinem String 'msg' 
eingelesen - deine Funktion ShowText kann die Zeichen aber nicht 
darstellen und zeigt die "Rechtecke" als Platzhalter an.
Entweder du bringst print dazu kein CR-LF zu senden oder du entfernst 
die empfangenen nicht darstellbaren Codes im VB-Programm aus deinem 
String oder du pickst dir nur die relevanten Daten aus dem String wie 
Peter schon vorgeschlagen hat.

Sascha

von Dietmar (Gast)


Lesenswert?

da liegt der hund begraben mit dem auspicken, das habe ich noch nie 
gemacht und weiß jetzt nicht genau wie ich es einbauen soll.

von spess53 (Gast)


Lesenswert?

Hi

>da liegt der hund begraben mit dem auspicken, das habe ich noch nie
>gemacht und weiß jetzt nicht genau wie ich es einbauen soll.

Noch einfacher ist es, die Zeichen gar nicht erst zu senden. Einfach 
statt 'print' zu benutzen, die Zeichen direkt UDR übergeben  .

MfG Spess

von Karl H. (kbuchegg)


Lesenswert?

Dietmar schrieb:
> da liegt der hund begraben mit dem auspicken, das habe ich noch nie
> gemacht und weiß jetzt nicht genau wie ich es einbauen soll.

Dann schau in der Hilfe nach, welche Stringfunktionen es gibt.

Du hast einen String. Und du willst aus diesem String einen anderen 
String extrahieren, der aus allen ausser dem ersten und dem letzten 
Zeichen besteht.
In Basic gibt es für Stringverarbeitung eine Menge Funktionen. Unter 
anderem gibt es Funktionen um die Länge eines Strings festzustellen, um 
die linken x Zeichen zu bekommen, um die rechten x Zeichen zu bekommen 
und um einen Substring zu bekommen, der an Position x anfängt und n 
Zeichen lang ist.

Wie gesagt: Durchsuch deine Hilfe nach Stringfunktionen. Die brauchst du 
sowieso, wenn du auch nur annähernd ersthaft programmieren willst.

von Hermi (Gast)


Lesenswert?

Hallo,
CR und LF kann man beim Senden sehr einfach unterdrücken wenn man in 
Basic auf dem AVR statt Print "Text" einfach ein ; anhängt, also Print 
"Text";

Das ist dann auf dem Terminal-Programm nicht mehr zu lesen, weil das 
Folge-Print in die gleiche Zeile schreibt.

Anders herum kann man in VB .Net das CR und LF einfach ausblenden, wenn 
man Zeile = Io.Ports.SerialPort.ReadTo(vbcrlf) verwendet. In Zeile ist 
dann das CR und LF nicht enthalten.

Viel Spaß
Hermi

von Dietmar (Gast)


Lesenswert?

Hallo Hermi,

danke fuer die hilfe, das problem hat sich mit dank deinem simicolon 
gelöst.

Aber danke auch an alle anderen, für Ihre antworten.

Status : Problem gelöst :)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.