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
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ß
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!
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
[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???
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.
>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
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ß
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 =)
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.