-         

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 29

Thema: UART Control mit VB.NET

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.05.2005
    Ort
    Kaiserslautern
    Beiträge
    794

    UART Control mit VB.NET

    Anzeige

    Hi,

    auf Anfrage kommt hier der Thread für mein Controlprogramm.

    Dieses Controlprogramm soll mehrere Funktionen haben / bekommen:
    1) Ausgabe von ein- und ausgehenden Daten mit
    _a) Dezimalwerten
    _b) Binärwerte
    _c) ASCII-Zeichen

    2) Senden von Daten per manueller Eingabe

    3) Senden von Daten durch Makros
    _a) Zeitgesteuert
    _b) Nach Empfang vorher definierter Werte

    4) Anzeige von eingehenden Daten als graphische Kurve (mit Skala)

    5) Eure Wünsche

    Das ganze dauert eventuell ein wenig länger, ich werde zwischen Versionen hier veröffentlichen. Ihr benötigt das .NET 2.0 Framework, dieses bekommt ihr u.a. bei Microsoft.

    Ich hoffe, dieses Projekt findet ein wenig Anklang :P

    Gruß, CowZ

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    29.09.2006
    Ort
    Kempen / Ndrh.
    Alter
    54
    Beiträge
    60
    Hi !

    Ich finde das klasse, dass Du sowas machen willst. Wird das im Prinzip einer "Einführung in die Programmierung einer seriellen Schnittstelle unter VB.Net" sein, oder wie muss ich mir das vorstellen ? Kann man Deine Beispiele unter dem kostenlosen Visual Basic Express nachvollziehen und laufen lassen ?

    Gruß, Andreas

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.05.2005
    Ort
    Kaiserslautern
    Beiträge
    794
    Hi,
    Die direkte Kommunikation mit der seriellen Schnittstelle ist ziemlich einfach - es handelt sich um wenige Zeilen Code. Der Rest ist dann "nur noch" das drumherrum. Das zu erklären ist sehr schwierig, wenn ich nicht weiß, von welchem Startpunkt (==Kenntnisstand) anfangen kann.

    Daher wird es eher auf ein fertiges Programm hinauslaufen, dessen Code man auch im kostenlosen VBEE laufen lassen kann (hoffentlich ). Ich werde versuchen den Code möglichst gut zu kommentieren und bei Fragen stehe ich immer zur Verfügung.

    Wenn sich allerdings ein paar finden, die so eine Einführung gerne haben wollen und man sich auf ein "Mindestkenntnisstand" einigt, kann ich das auch gerne hier und später im Wiki erläutern

    Schlagt vor, wie ihr euch das vorstellt

    Gruß, CowZ

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    11.01.2005
    Ort
    Bayern
    Alter
    29
    Beiträge
    161
    Super Idee
    (-_-)

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    29.09.2006
    Ort
    Kempen / Ndrh.
    Alter
    54
    Beiträge
    60
    Zitat Zitat von CowZ
    Daher wird es eher auf ein fertiges Programm hinauslaufen, dessen Code man auch im kostenlosen VBEE laufen lassen kann (hoffentlich ). Ich werde versuchen den Code möglichst gut zu kommentieren und bei Fragen stehe ich immer zur Verfügung.
    Genau das würde mir persönlich schon reichen ... kommt ja auch ganz auf die Güte der Kommentare an

    Gruß, Andreas

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.05.2005
    Ort
    Kaiserslautern
    Beiträge
    794
    Hi,

    hier kurz der Code für die Kommunikation mit der Seriellen:
    (ohne Kommentare und ausm Kopf aufgeschrieben und teilweise gecopypastet. Anpassung an die Applikation sind notwendig )

    Code:
    ' Declaration:
    Public WithEvents Connection As System.IO.Ports.SerialPort
    
    ' Settings:
    Connection.BaudRate = 9600
    Connection.DataBits = 8
    Connection.Handshake = IO.Ports.Handshake.None
    Connection.Parity = IO.Ports.Parity.None
    Connection.PortName = "COM1"
    Connection.Encoding = System.Text.Encoding.ASCII
    Connection.StopBits = IO.Ports.StopBits.One
    Connection.Open()
    
    ' Threadworkaround:
    Private Sub Connection_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles Connection.DataReceived
       Invoke(New ReceiveHandler(AddressOf Receive), Connection.ReadExisting())
    End Sub
    Delegate Sub ReceiveHandler(ByVal data As String)
    
    Public Sub Receive(ByVal text As String)
       MessageBox.Show(text)
    End Sub
    Gruß, CowZ

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    29.09.2006
    Ort
    Kempen / Ndrh.
    Alter
    54
    Beiträge
    60
    Zitat Zitat von CowZ
    Hi,

    hier kurz der Code für die Kommunikation mit der Seriellen:
    (ohne Kommentare und ausm Kopf aufgeschrieben und teilweise gecopypastet. Anpassung an die Applikation sind notwendig )

    Code:
    ' Declaration:
    Public WithEvents Connection As System.IO.Ports.SerialPort
    
    ' Settings:
    Connection.BaudRate = 9600                          // 9600 Bit/s
    Connection.DataBits = 8                             // 8 Datenbits
    Connection.Handshake = IO.Ports.Handshake.None      // kein Handshake (XON/XOFF oder RTS/CTS)
    Connection.Parity = IO.Ports.Parity.None            // kein Paritätsbit
    Connection.PortName = "COM1"                        // Schnittstelle 
    Connection.Encoding = System.Text.Encoding.ASCII    // Codierung = ASCII ???
    Connection.StopBits = IO.Ports.StopBits.One         // 1 Stopbit
    Connection.Open()                                   // Verbindung öffnen
    // Connection. Close()                              // Verbindung schließen
    
    ' Threadworkaround:
    Private Sub Connection_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles Connection.DataReceived
       Invoke(New ReceiveHandler(AddressOf Receive), Connection.ReadExisting())
    End Sub
    Delegate Sub ReceiveHandler(ByVal data As String)
    
    Public Sub Receive(ByVal text As String)
       MessageBox.Show(text)
    End Sub
    Ich habe bei der Initialisierung mal reingeschrieben, was ich denke, was es heißen soll

    Nur durch die beiden Programmroutinen steige ich nicht durch. Empfängt die Schnittstelle jetzt IMMER, und puffert alles, bis ich das nächste Mal "Receive" aufrufe ? Und wie geht entsprechend das Senden von Daten ?
    Und das eine Setting "Encoding", wozu braucht VB das ? Der muss doch mir überlassen, ob ich Text oder Daten übertrage Und was sind die alternativen Einstellungen zu "ASCII" ?

    Aber ein erstes "Danke " ist Dir gewiss

    Gruß, Andreas

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.05.2005
    Ort
    Kaiserslautern
    Beiträge
    794
    Hi,
    genau, die Initialisierungen sind so richtig kommentiert.
    Die Zeile mit dem Encoding kannst du auch weg lassen. aber wenn du da Big Endian (die anderen Möglichkeiten stehen alle in System.Text.Encoding) oder so reinschreibst, interpretiert die Schnittstelle die eingehenden Daten nicht richtig (weil die anders angeordnet sind als reine ASCII Zeichen).

    Zu den Methoden:
    Die Schnittstelle läuft ab dem Connection.Open. Ab da empfängt sie Daten. Kommen nun Daten, so wird ein Event ausgelöst. Dieses Ereignis / Event heißt DataReceived.

    Dieses Event wird in
    Code:
    Private Sub Connection_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles Connection.DataReceived 
       Invoke(New ReceiveHandler(AddressOf Receive), Connection.ReadExisting()) 
    End Sub
    behandelt ("Handles...").
    Da dieses Event allerdings in einem anderen Thread als das Hauptprogramm läuft, musst du den umständlichen Weg über Delegate und Invoke gehen. Entweder es reicht dir so, oder du musst dir das inner Hilfe durchlesen, besser erklären kann ich das auch nich :P

    Die Methode Receive wird so jedes Mal aufgerufen, wenn die Schnittstelle Daten empfängt. Als Parameter "text" werden dabei dann die empfangenen Daten übergeben.

    Gruß, CowZ

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    29.09.2006
    Ort
    Kempen / Ndrh.
    Alter
    54
    Beiträge
    60
    Zitat Zitat von CowZ
    Da dieses Event allerdings in einem anderen Thread als das Hauptprogramm läuft, musst du den umständlichen Weg über Delegate und Invoke gehen. Entweder es reicht dir so, oder du musst dir das inner Hilfe durchlesen, besser erklären kann ich das auch nich :P
    Bahnhof ? Koffer klauen ? Ich hatte gehofft, dass Du genau aber der Stelle mal genau erklären könntest, was da geproggt werden muss, denn die Initialisierung hätte ich auch noch hinbekommen, aber das Senden und das Empfangen von Zeichen ist unter VB.net nicht so ganz einfach zu durchschauen, denke ich.

    Zitat Zitat von CowZ
    Die Methode Receive wird so jedes Mal aufgerufen, wenn die Schnittstelle Daten empfängt. Als Parameter "text" werden dabei dann die empfangenen Daten übergeben.
    Wird diese Methode nach JEDEM empfangenen Zeichen aufgerufen ? Und was passiert, wenn ich mich um das Retten dieser Zeichen nicht kümmere ? Werden die dann überschrieben, oder werden die neuen Zeichen an die alten angehängt, so dass ich den "Receive-String" dann mittels String-Manipulation auseinandernehmen kann ?

    Hast Du mal ein lauffähiges Beispiel, an dem man das ganze auch mal praktisch durchgehen kann ?

    Gruß, Andreas

  10. #10
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.05.2005
    Ort
    Kaiserslautern
    Beiträge
    794
    Hi,

    das oben genannte Beispiel ist nach leichten Anpassungen lauffähig. Diese Methode wird nach allen empfangenen Daten aufgerufen, normalerweise sollte das ein Zeichen sein, näheres müsstest du der Hilfe entnehmen. Der Receivestring ist dann immer nur das neueste empfangene. Wenn du dich um das "Retten" nicht kümmerst, sind die Daten nach "Receive ... End Sub" weg.

    Das lauffähige Beispiel kann ich dir vllt heut nachmittag schicken, bin grad busy... Außerdem steht alles wichtige oben, das solltest du auch "verpacken" können

    Gruß, CowZ

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •