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.