| |
VB.NET - Ein- und UmsteigerEinrichten für Serielle Schnittstelle | | | Autor: Tommi467 | Datum: 18.11.17 20:17 |
| Hallo zusammen,
ich hoffe, es kann mir mal jemand etwas helfen.
Ich bin gerade dabei eine sogenannte CAT-Steuerung für
einen Transceiver (Amateurfunk) zu programmieren.
Als Grundlage dafür habe ich hier im Forum einen Source gefunden,
der für einen ersten Transceiver wunderbar funktionierte.
Nun will ich aber ein anderes Gerät steuern und habe Probleme
damit. Ich habe auf der Ausgangsleitung mal TX und RX gebrückt
und konnte feststellen, das Ein- und Ausgabe grundsätzlich
funktionieren.
Mit einer gekauften Software lässt sich auch der neue Transceiver
steuern, aber eben nicht mit meiner Software.
Deshalb vermute ich, das der Fehler entweder in der Initialisierung
liegt oder etwas stimmt mit dem Befehlssatz nicht. Letzteres kann in
diesem Forum sicher nicht geklärt werden.
Aber zu Initialisierung kann mir vielleicht jemand helfen:
Laut Dokumentation sollen die Kommandos bestehend aus 5-Byte-Blöcken
mit Pausen von bis zu 200ms zwischen den Bytes gesendet werden.
Jedes Byte besteht aus einem Start-Bit, 8 Daten-Bits ohne Paritätsbit
und 2 Stopp-Bits.
Ein Kommando sähe dann zum Beispiel so aus 43 97 00 00 01.
Und so sieht die Initialisierung bisher aus:
' Eine Instance von SerialPort erstellen
' Im Normalfall ist das COM1:
Me.myComPort = New IO.Ports.SerialPort("COM9")
' Die folgenden vier Einstellungen müssen denen der
' Gegenstelle entsprechen
Me.myComPort.BaudRate = 9600
Me.myComPort.DataBits = 8
Me.myComPort.StopBits = IO.Ports.StopBits.Two
Me.myComPort.Parity = IO.Ports.Parity.None
Me.myComPort.RtsEnable = False
Me.myComPort.DtrEnable = False Oder liegt es wohl daran, das ich die Daten in einem Stück übertrage:
Aufruf: Me.Send(TextBox2.Text) (TextBoxinhalt "4397000001")
Private Sub Send(ByVal command As String)
Me.myComPort.Write(command))
End Sub Für entsprechende Hilfe wäre ich sehr dankbar.
Gruß und schönen Sonntag | |
Re: Einrichten für Serielle Schnittstelle | | | Autor: Manfred X | Datum: 19.11.17 06:27 |
| Hallo!
[I]Jedes Byte besteht aus einem Start-Bit, 8 Daten-Bits
ohne Paritätsbit und 2 Stopp-Bits.[/I]
Bist Du Dir sicher ..... ????
Vielleicht sind es nur 5 Datenbits/Byte.
Oder die Start- und Stopp-Bits gehören nicht in jedes
einzelne gesendete Byte (sobdern nur in das erste bzw. letzte).
Ich denke, Du mußt die zu sendenden Zeichen zunächst in ein
geeignetes Bitmuster übertragen.
Ziehe diesbezüglich Deine Dokumentation des Transceivers zu Rate
oder nutze ein geeignetes Forum. | |
Re: Einrichten für Serielle Schnittstelle | | | Autor: Tommi467 | Datum: 19.11.17 10:57 |
| Hallo Manfred,
vielen Dank für deine Antwort. Ich hab dir mal ein Bild
auf dem Webserver abgelegt. Das ist die entsprechende
Seite aus der Dokumentation.
Das Startbit hat mich auch irritiert...
Der erste Transceiver ist von der gleichen Firma, aber
etwas neuer. Dort endet jede Anweisung einfach mit einem ";"
Wesentlich einfacher und funktioniert tadellos.
http://www.do3ge.de/temp/CAT-System.jpg | |
Re: Einrichten für Serielle Schnittstelle | | | Autor: Manfred X | Datum: 19.11.17 12:39 |
| Hallo!
Ich verstehe nichts von dem Transceiver.
Die Beschreibung ist z.T. fragwürdig.
Vielleicht so oder ähnlich:
Dim ba As New BitArray(7)
Dim startbit, stoppbit As Boolean
ba(0) = startbit '?
ba(1) = startbit
'Kommando_Teil (Hexadecimalwert) in Bitmuster wandeln und
'dieses Muster auf Position 2-6 des Array zuweisen
ba(7) = stoppbit '? Jedes Kommando besteht aus 5 solcher Bytes.
Falls das Kommando kürzer ist, sind an der entsprechenden
Stelle der nicht benötigten Bytes jeweils 5 Null-Bits zu einzutragen.
Beitrag wurde zuletzt am 19.11.17 um 12:42:44 editiert. | |
Re: Einrichten für Serielle Schnittstelle | | | Autor: eierlein | Datum: 19.11.17 13:23 |
| Versuch' mal
Me.myComPort.Write(chr(43) & chr(97) & chr(00) & chr(00) & chr(01)) | |
Re: Einrichten für Serielle Schnittstelle | | | Autor: GPM | Datum: 19.11.17 13:24 |
| Probiere das mal aus:
'Test ohne Gerät! Nur durch die Verbindung von RD+TD (9polig = Pin2 mit Pin3)
Imports System.IO.Ports
Public Class Form1
Dim Tb1 As New TextBox With {.Text = "4387000001", .Dock = DockStyle.Top, _
.Parent = Me}
Dim Tb2 As New TextBox With {.Dock = DockStyle.Bottom, .Parent = Me}
Dim WithEvents Btn As New Button With {.Text = "Senden", .Dock = _
DockStyle.Bottom, .Parent = Me}
'PortName einsetzen und Abweichung von der Standardeinstellung angeben
Dim WithEvents myComPort As New SerialPort("COM9") With {.StopBits = _
StopBits.Two}
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) _
Handles MyBase.Load
myComPort.Open()
End Sub
Private Sub Btn_Click(sender As Object, e As EventArgs) Handles Btn.Click
If Tb1.Text.Count = 10 Then ' 5 Hex-Zeichen-Befehle!
WriteHexString(Tb1.Text)
End If
End Sub
Private Sub WriteHexString(txt As String)
Dim b(4) As Byte
Dim nr As Int32
For i As Int32 = 0 To txt.Length - 1 Step 2
b(nr) = Convert.ToByte(txt.Substring(i, 2), 16)
nr += 1
Next
myComPort.Write(b, 0, b.Count)
End Sub
Private Sub myComPort_DataReceived(sender As Object, e As _
SerialDataReceivedEventArgs) Handles myComPort.DataReceived
Me.Invoke(Sub()
Dim txt As String = ""
Do While myComPort.BytesToRead > 0
txt &= " " & myComPort.ReadByte
Loop
Tb2.Text = txt ' Bytes in Tb2 ausgeben
End Sub)
End Sub
End Class MfG GPM | |
Re: Einrichten für Serielle Schnittstelle | | | Autor: Tommi467 | Datum: 19.11.17 14:12 |
| Danke erst einmal an Eierlein und GPM
Eierlein, habe ich noch nicht ausprobiert.
GPM, bekomme ich direkt zwei Fehler angezeigt.
Die erste ist klar, aber die zweite...
siehe Bild
http://www.do3ge.de/temp/Fehler.JPG | |
Re: Einrichten für Serielle Schnittstelle | | | Autor: GPM | Datum: 19.11.17 14:36 |
| Dann nimm .Length statt Count
MfG GPM | |
Re: Einrichten für Serielle Schnittstelle | | | Autor: Tommi467 | Datum: 19.11.17 15:07 |
| @eierlein - Nein, Negativ
@GPS - werde ich testen, melde mich später. | |
Re: Einrichten für Serielle Schnittstelle | | | Autor: eierlein | Datum: 19.11.17 15:36 |
| Ich hatte übersehen:
Alle CAT-Werte sind hexadezimal dargestellt
Versuch's mal mit:
Me.myComPort.Encoding = System.Text.Encoding.Default 'Wichtig, da Standard nur
' Ascii
Me.myComPort.Write(chr(67) & chr(151) & chr(00) & chr(00) & chr(01))
'Me.myComPort.Write(chr(&h43) & chr(&H97) & chr(00) & chr(00) & chr(01)) oder
Dim data() As Byte = {67, 151, 0, 0, 01}
Me.myComPort.Write(data, 0, 5)
'Kein Encoding erforderlich
Beitrag wurde zuletzt am 19.11.17 um 15:42:10 editiert. | |
Re: Einrichten für Serielle Schnittstelle | | | Autor: Tommi467 | Datum: 19.11.17 16:44 |
| ES GEHT !!!
Die Lösung von GPS ist es.
Mit .length in den Anweisungen funktioniert es astrein.
Super !!!
Vielen Vielen Dank !!!
Die Rückmeldungen stimmen zwar noch nicht, aber ich vermute
auch die werden im HEX-Code zurück geschickt und müssen
umgerechnet werden. Dann wird's wohl passen.
Aber der Transceiver reagiert schon mal, das ist die Hauptsache,
Vielen vielen Dank!!! | |
Re: Einrichten für Serielle Schnittstelle | | | Autor: Tommi467 | Datum: 20.11.17 13:27 |
| @GPS
Um das Ganze noch zum Abschluss zu bringen, ich weiß nicht was das sein soll
was der Transceiver zurück gibt, aber Hex ist das nicht.
Aber ich bin inzwischen durchgestiegen und kann es entschlüsseln.
Ich hab die Funktion mal YaesuToDec genannt
Function YaesuToDec(ByVal PortReceived As Integer) As String
Dim Bit1 As Integer
Dim Bit2 As Integer
Bit1 = Int(PortReceived / 16)
Bit2 = PortReceived - (Bit1 * 16)
YaesuToDec = Bit1 & Bit2
End Function | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
sevISDN 1.0
Überwachung aller eingehender Anrufe!
Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Weitere InfosTipp des Monats sevWizard für VB5/6
Professionelle Assistenten im Handumdrehen
Erstellen Sie eigene Assistenten (Wizards) im Look & Feel von Windows 2000/XP - mit allem Komfort und zwar in Windeseile :-) Weitere Infos
|