Hallo Ich brauche unbediengt eure Hilfe. Die Grundlagen von VB2008.NET sind mir vertraut. Ich habe es auch geschaft über die serielle Schnittstelle Daten zusenden, aber leider nur von 0 bis 127. Darüber hinaus kommt immer nur 0x3F (0b00111111). Das Problem ist, dass ich unbedingt einen ganzen Byte senden muss! Gibt es irgendwo so eine Funktion? Danke schonmal im Voraus.
Private Sub btnSendByte_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnSendByte.Click
If SerialPort1.IsOpen Then
Dim str As String = txtSendByte.Text
Dim CharByte As Byte
For i As Integer = 0 To 7
If Asc(str.Chars(i)) = Asc("1") Then
CharByte = CharByte Or 2 ^ (7 - i)
ElseIf Asc(str.Chars(i)) = Asc("0") Then
GoTo End_If
Else
MsgBox("Die Eingabe ist fehlerhaft")
End_If:
End If
Next
Dim chr As Char = Convert.ToChar(CharByte)
SerialPort1.Write(chr)
End If
End Sub
vb ist zwar nicht meine stärke aber das sieht merkwürdig aus Dim chr As Char = Convert.ToChar(CharByte) SerialPort1.Write(chr) Warum wandelst du in ein Char? write kann auch eine byte array senden. http://msdn.microsoft.com/de-de/library/ms143551%28VS.80%29.aspx du musst also das byte in ein bytearray stecken und dann write aufrufen SerialPort1.Write(bytearray, 1, 1 ) weiss aber nicht wie ein bytearray in vb geht.
Hier wird von im Grunde demselben Problem berichtet http://www.eggheadcafe.com/software/aspnet/33819191/serielle-schnittstelle-z.aspx aber leider keine Lösung angegeben. Aber es könnte dir bei der weiteren Web-recherche helfen
Vor dem Öffnen der Schnittstelle diese Zeile einfügen: SerialPort1.Encoding = System.Text.Encoding.Default
@ Markus (Gast) Das spielt nur eine Rolle wenn man Text sendet, wenn man gleich bytes sendet ist das encoding egal. Bytes sind nun mal Bytes.
Karl heinz Buchegger schrieb: > Hier wird von im Grunde demselben Problem berichtet > > http://www.eggheadcafe.com/software/aspnet/33819191/serielle-schnittstelle-z.aspx > > aber leider keine Lösung angegeben. > Aber es könnte dir bei der weiteren Web-recherche helfen Die Seite liefert eigentlich die Lösung für Strings: Passendes Encoding. Muss es eine 1:1-Umwandlung sein, ist dies nur mit "ISO-8859-1" bzw. 28591 zu machen 1) also SerialPort1.Encoding = System.Text.Encoding.GetEncoding("ISO-8859-1") bzw. z.B. encoding = System.Text.Encoding.GetEncoding("ISO-8859-1") strResult = encoding.GetString(byteArray) byteArrayResult = encoding.GetBytes(strInput) 1) http://blogs.msdn.com/bclteam/archive/2006/05/26/608377.aspx
Du hast völig recht Peter. Danke, dass du mir auf die Sprünge geholfen
hast.
Für Alle, die das selbe Problem haben, hier ist der funktionierende
Codeabschnitt.
Private Sub btnSendByte_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnSendByte.Click
If SerialPort1.IsOpen Then
Dim str As String = txtSendByte.Text
Dim CharByte(0) As Byte
CharByte(0) = 0
For i As Integer = 0 To 7
If Asc(str.Chars(i)) = Asc("1") Then
CharByte(0) = CharByte(0) Or 2 ^ (7 - i)
ElseIf Asc(str.Chars(i)) = Asc("0") Then
GoTo End_If
Else
MsgBox("Die Eingabe ist fehlerhaft")
End_If:
End If
Next
SerialPort1.Write(CharByte, 0, 1)
End If
End Sub
Mit freundlichen Grüßen
Hallo,
bin zwar kein VB Profi würde deine For-Schleife so nicht eleganter
aussehen
For i As Integer = 0 To 7
If str.Chars(i) = "1" Then
CharByte(0) += 2 ^ (7 - i)
ElseIf str.Chars(i)) <> "0" and str.Chars(i) <> "1" Then
MsgBox("Die Eingabe ist fehlerhaft")
Exit For
End If
Next
LG
FZ
Eleganter wäre es wenn man 2 ^ (7 - i) durch Schieben (*2) und setzen des jeweils untersten Bits austauschen würde.
Julia Dorfmeister schrieb:
> Wie macht man das im .net Umfeld?
VB kennt <<, >>, and, or
C#, C/C++, Ruby, Python kennen <<, >>, &, |
F# kennt <<<, >>>, &&&, |||
Oder was war die Frage?
>VB kennt <<, >>, and, or
Leider wird immer nur eine 0 geschoben.
zur Frage:
Imports System.Text ' <=== ! nicht vergessen
'Codeabschnitt von Rod:
Sub SendSerialData01xxxx(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.Write(data)
End Using
End Sub
Sub SendSerialData02(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)
SerialPort1.Encoding = enc
Try
SerialPort1.Write(data)
Catch
MessageBox.Show("Anschluß geschlossen")
End Try
End Sub
Gruß
Hallo.
Da bin ich wieder.
Nun bin ich in der Lage Daten über die serielle Schnittstelle zusenden.
Also wollte ich auch mal Daten empfangen, und stellte fest, dass es
etwas schwiriger ist.
Ich habe zwar in der MSDN-Library gelesen, aber irgendwie klapt es
nicht.
Beim empfangen eines Bytes kommt folgender Fehler: Der Puffer darf nicht
NULL sein
Private Sub SerialPort1_DataReceived(ByVal sender As System.Object,
ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles
SerialPort1.DataReceived
Dim Data() As Byte
Try
Dim RBytes As Integer = SerialPort1.Read(Data, 0,
SerialPort1.BytesToRead)
lblByteCount.Text = RBytes
For Each Value In Data
lstReceiveData.Items.Add(Value)
Next
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
Hoffe, Ihr könnt mir nocheinmal helfen.
Valentin R. schrieb: > Hallo. > Da bin ich wieder. > > Nun bin ich in der Lage Daten über die serielle Schnittstelle zusenden. > Also wollte ich auch mal Daten empfangen, und stellte fest, dass es > etwas schwiriger ist. > Ich habe zwar in der MSDN-Library gelesen, aber irgendwie klapt es > nicht. > Beim empfangen eines Bytes kommt folgender Fehler: Der Puffer darf nicht > NULL sein > > > Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, > ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles > SerialPort1.DataReceived > Dim Data() As Byte > Try > Dim RBytes As Integer = SerialPort1.Read(Data, 0, > SerialPort1.BytesToRead) > lblByteCount.Text = RBytes > For Each Value In Data > lstReceiveData.Items.Add(Value) > Next > Catch ex As Exception > MsgBox(ex.Message) > End Try > End Sub > > > Hoffe, Ihr könnt mir nocheinmal helfen. Setze mal einen Breakpoint auf die Zeile Dim RBytes As Integer = SerialPort1... und sieh dir an was Data ist bzw. noch nicht ist. Zweites Problem: Das Update der ListBox funktioniert so auch nicht, da das Event nicht im UI-Thread ausgelöst wird, sondern in einem eigenen Thread, Updates von Steuerelementen aber nur im UI-Thread durchgeführt werden dürfen. http://msdn.microsoft.com/de-de/library/system.io.ports.serialport.datareceived(VS.80).aspx d.h. in der Klasse wird noch etwas wie das unten stehende gebraucht
1 | Private Delegate Sub DataReceivedDel() |
2 | Private ListUpdateHandler As New DataReceivedDel(AddressOf ListUpdate) |
3 | Private Sub ListUpdate() |
4 | do something |
5 | End |
6 | |
7 | Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, |
8 | ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles |
9 | SerialPort1.DataReceived |
10 | do something |
11 | Me.Invoke(ListUpdateHandler) |
12 | End |
Hallo
Danke an Arc Net und die Anderen.
Dank Eurer Hilfe kann ich jetzt mittels serieller Schnittstelle, Daten
senden und epmfangen.
Hier ist der Code-Ausschnitt des Empfängerteils:
Private Sub SerialPort1_DataReceived(...) Handles
SerialPort1.DataReceived
ReDim Data(SerialPort1.BytesToRead - 1)
Try
ReadedBytes = SerialPort1.Read(Data,
0,SerialPort1.BytesToRead)
Me.Invoke(ListUpdateHandler)
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
Private Delegate Sub DataReceivedDel()
Private ListUpdateHandler As New DataReceivedDel(AddressOf ListUpdate)
Private Sub ListUpdate()
For Each Value In Data
...
Next
End Sub
Was ich allerdings noch nicht verstehe.
Was bewirkt die Eigenschaft "WriteBufferSize"?
Ich habe zwar damit experimentiert, aber leider keine Wirkung
festgestellt.
Vielleicht weiß es einer von Euch.
Hallo, WriteBufferSize ruft die Größe des Ausgabepuffers des seriellen Anschlusses ab oder legt diese fest, normal ist die Puffergröße 2048 alle Werte die kleiner sind werden ignoriert. Grüße FZ
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.


