vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
TOP-Angebot: 17 bzw. 24 Entwickler-Vollversionen zum unschlagbaren Preis!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Einrichten 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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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))
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Einrichten für Serielle Schnittstelle 
Autor: GPM
Datum: 19.11.17 14:36

Dann nimm .Length statt Count

MfG GPM
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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!!!
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Einrichten für Serielle Schnittstelle 
Autor: GPM
Datum: 20.11.17 14:37

Auf Code Project gibt es ein c# Programm:
FT857D Manager Ham Radio Controller

Schau Dir mal den Code an.
Eventuell einen C#-Vb.Net Übersetzer verwenden.

https://www.codeproject.com/articles/1087312/ft-d-manager-ham-radio-controller

MfG GPM
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel