Forum: PC-Programmierung VB 2005 Serial Port Problem


von bushobbyentwickler (Gast)


Lesenswert?

Hallo,

ich habe auf meinem MC Atmega 16 ein Programm, das über UART Zeichen 
empfängt und diese dann wieder zurück über UART an den PC sendet.
In VB 2005 hab ich eine Anwendung gemacht, mit der man ein Zahlenwert 
zwischen 0 und 255 an den MC schicken kann.

Senden tu ich mit SerialPort.Write(Chr(value)) .

Empfangen kann ich allerdings dann nur Werte zwischen 0 und 63!

Ich hab das ganze mal mit einem Terminal-Programm durchgespielt. Wenn 
ich da beispielsweise 0xFF an den MC sende, dann kommt auch 255 zurück.

Also schließe ich daraus, dass diese .NET - KLasse die ich in VB nutze 
nur Werte zwischen 0 und 63 sendet. Mit einer Messagebox habe ich auch 
schon den Wert angezeigt, der der Sendefunktion übergeben wird, da sieht 
alles noch normal aus.

Muss ich vielleicht eine andere Funktion zum Senden der Daten verwenden?

mfg bushobbyentwickler

von j.... (Gast)


Lesenswert?

hallo


das könnte es sein

Stefan "stefb" B. (stefan)

Jetzt treibt ihr mich schon so weit, dass ich virtuell Visual Basic .NET
programmiere. Jungs, macht nur so weiter ;-)

Imports System
Imports System.Text    ' <=== !     ' das ist wichtig

Public Class Form1
    'Codeabschnitt von Rod:

    Sub SendSerialData(ByVal data As String)
        Dim enc As Encoding = Encoding.GetEncoding(1252)
        ' Send strings to a serial port.
        Using com1 As IO.Ports.SerialPort = _
        My.Computer.Ports.OpenSerialPort("COM1", 2400,
IO.Ports.Parity.None, 8)
            com1.Encoding = enc
            com1.WriteLine(data)
        End Using
    End Sub
End Class


gruß

von bushobbyentwickler (Gast)


Lesenswert?

Ich habs damit mal probiert, es hat aber nichts gebracht.

Hab das Problem aber nochmal genauer untersucht:
Wenn ich Werte zwischen 0 und 127 sende, sendet er auch genau diese 
Werte.
Wenn ich allerdings einen Wert > 127 sende, dann kommt vom MC 63 zurück, 
also muss mein VB-Programm wohl 63 gesendet haben.

Nochmal: Wenn ich mit einem Terminalprogramm z.B. 250 sende, dann kommt 
auch dieser Wert zurück!

von Meister E. (edson)


Lesenswert?

Hallo,

vielleicht ist ein Fehler bei der Verarbeitung der Werte auf dem uC 
aufgetreten.

>Wenn ich allerdings einen Wert > 127 sende, dann kommt vom MC 63 zurück,
>also muss mein VB-Programm wohl 63 gesendet haben.

Das glaube ich nämlich nicht. Wieso sollten Werte <127 und Werte um oder 
über 250 korrekt ausgegeben werden, die Anderen aber nicht? Den Fehler 
vermute ich in der uC-Firmware.


@j....

Bitte nicht zu jedem VB Problem den selben Beitrag zitieren.


Gruss,
Edson

von mars (Gast)


Lesenswert?

Probier mal SerialPort.Write(New Byte() {64, 128, 255}, 0, 3)

von bushobbyentwickler (Gast)


Lesenswert?

[quote]Das glaube ich nämlich nicht. Wieso sollten Werte <127 und Werte 
um oder
über 250 korrekt ausgegeben werden, die Anderen aber nicht? Den Fehler
vermute ich in der uC-Firmware.
[/quite]

Nein, Werte < 127 werden von der VB-Anwendung richtig gesendet, denn der 
MC sendet diese Werte auch wieder zurück. Sende ich aber in der 
VB-Anwendung Werte > 127 an den MC, kommt immer wieder 63 ('?') zurück.

Wenn ich das ganze mit dem Terminalprogramm durchspiele, funktioniert 
alles wunderbar, d.h. wenn ich 255 an den MC sende, kommt dies auch 
wieder zurück! Also kann es wohl nicht an der Firmware liegen, denn im 
Terminalprogramm tuts ja!

Kann es sein, dass ich irgendwo den Zeichensatz umstellen muss???

von Haus-Air (Gast)


Lesenswert?

Ich rate mal.... ist dein 'value' eh unsigned?

von Johnny (Gast)


Lesenswert?

Bedenke, dass .NET für Zeichen und Strings Unicode verwendet, also 
konkret 2 Bytes pro Zeichen. Dadurch kommt wahrscheinlich was 
durcheinander.
Wie bereits "mars" geschrieben hat am besten ein Byte Array erzeugen und 
das mit der entsprechenden Byte-Sende-Methode rausschicken.
Das gleiche gilt übrigens für den umgekehrten Weg.

von Meister E. (edson)


Lesenswert?

>Nein, Werte < 127 werden von der VB-Anwendung richtig gesendet

So habe ichs doch geschrieben...? :)

Das mit den Werten habe ich wohl falsch verstanden. Du hast ja die z.B. 
250 oder so vom Terminal aus geschickt.

Würde dann auch den von mars und Johnny vorgeschlagenen Weg versuchen.

Gruss,
Edson

von j.... (Gast)


Lesenswert?

bushobbyentwickler (Gast)


>@Stefan "stefb" B. (stefan)

>der cod ist richtig
>aus com1.WriteLine(Data)  muß aber com1.Write(Data) werden.

>Jetzt kann ich Einzelwerte und echte Datenstrings senden.

Versuche dies noch einmal.

Es geht wunderbar.

gruß

von Jan (Gast)


Lesenswert?

Hallo,

Ich will einen Hydraulikzylinder 9 Positionen anfahren lassen. Ich würde 
den Zylinder gerne mit einem einfachen VB oder C# Programm steuern. Ist 
es möglich mit einem VB-Programm analoge Signale zur Ansteuerung des 
Ventils zu erzeugen, bzw kann ich ein analoges Signal (von einem 
Wegmesssystem) von einem VB programm verarbeiten lassen?

Vielen Dank,
Jan =)

von bushobbyentwickler (Gast)


Lesenswert?

Nein, das geht nicht nur mit VB.
Du kannst aber damit einen MC über UART ansteuern der das dann alles 
machen kann.

von j.... (Gast)


Lesenswert?

hallo

bushobbyentwickler (Gast)

alles O.K.

von gast (Gast)


Lesenswert?

By default, SerialPort uses ASCIIEncoding to encode the characters. 
ASCIIEncoding encodes all characters greater then 127 as (char)63 or 
'?'. To support additional characters in that range, set Encoding to 
UTF8Encoding, UTF32Encoding, or UnicodeEncoding.

von Severino R. (severino)


Lesenswert?

Wie war das schon wieder mit dem Suchen?

Beitrag "immer 3Fh auf dem COM-Port, beim senden von Werten > 127d"

(erst vor ein paar Tagen...)

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.