AEQ-WEB

Arduino Serial COM Connection Windows Visual Basic
Arduino
28.08.2018

Arduino Serial in VB App

Zu diesem Artikel gibt es auch ein Video auf Youtube: Arduino Serial Port (COM) zu Visual Basic Software - Windows


Arduino Serial & Visual Basic

Dieser Artikel beschreibt, wie Daten (z.B. Messwerte) von einem Arduino Board über die serielle Schnittstelle (COM-Port) an einen Windows Computer gesendet werden können. Als Software wurde ein kleines Programm in Visual Basic geschrieben, dass drei Parameter von Arduino Board auslesen kann und in Textfeldern anzeigt.


Wring Shematics Arduino Seriel Connection to Visual Basic - Schaltlan

Funktionsweise der Datenübertragung

In diesem Beispiel werden Daten vom Arduino zum Computer übertragen. Selbstverständlich ist es auch ohne großen Aufwand möglich, Daten vom Computer an den Arduino zu senden. Die Daten vom Arduino werden mit 9600 Baud gesendet. Dieser Wert ist bei sowohl beim Beispielcode vom Arduino als auch von der Windows Software fest eingestellt und muss immer an beiden Seiten angepasst werden. Der Arduino überträgt drei Parameter. Das ist die Laufzeit in Sekunden, der Wert vom Potentiometer(0 – 1024) und ein statischer Wert (1234). Diese drei Parameter werden gleichzeitig übertragen und mit einem Beistrich getrennt. Die gesamte Zeile hat am Ende ein Semikolon, dass das Ende der Datenreihe kennzeichnet. In unserem Visual Basic Beispiel Code werden dann die Parameter-Pakete in einzelne Werte gesplittet. Dies funktioniert über den Beistrich, der das Ende eines einzelnen Parameters kennzeichnet. Zuletzt werden diese Werte in eine TextBox geladen und bei jedem neuen Datenpaket aktualisiert.


Arduino Serial COM Port Connection with Visual Studio Programm - Windows Software
Windows Software

Die in Visual Basic geschriebene Software empfängt die Datenpakte über den COM-Port und zeigt diese in drei Felder an. In der Mitte wird der analoge Wert vom Potentiometer an Pin A5 angezeigt. Das erste Feld zeigt die Laufzeit in Sekunden an. Das letzte Feld zeigt den dritten Wert, der vom Arduino gesendet wird und in diesem Beispiel statisch ist.


Arduino Quellcode
long timer;

void setup() {
  Serial.begin(9600);
}

void loop() {
  if(millis() > timer+500){
    timer = millis();
    SendToSerial();
  }
}

void SendToSerial(){
  int val = analogRead(A5);
  Serial.print(millis()/1000);
  Serial.print(",");
  Serial.print(val);
  Serial.print(",");
  Serial.print("1234");
  Serial.println(";");
}

Visual Basic Code
Imports System
Imports System.IO.Ports

Public Class Form1

    Dim SerialPort As String
    Dim RxData As String = ""

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Timer1.Enabled = False
        SerialPort = ""
        For Each sp As String In My.Computer.Ports.SerialPortNames
            com_port.Items.Add(sp)
        Next
    End Sub


    Private Sub SerialPort_ComboBox_SelectedIndexChanged(sender As Object, e As EventArgs) Handles com_port.SelectedIndexChanged
        If (com_port.SelectedItem & lt;> "") Then
            SerialPort = com_port.SelectedItem
        End If
    End Sub


    Private Sub connect_BTN_Click(sender As Object, e As ventArgs) Handles connect_btn.Click
        If (connect_btn.Text = "Connect") Then
            If (SerialPort & lt;> "") Then
                SerialPort1.Close()
                SerialPort1.PortName = SerialPort
                SerialPort1.BaudRate = 9600
                SerialPort1.DataBits = 8
                SerialPort1.Parity = Parity.None
                SerialPort1.StopBits = StopBits.One
                SerialPort1.Handshake = Handshake.None
                SerialPort1.Encoding = System.Text.Encoding.Default
                SerialPort1.ReadTimeout = 10000

                SerialPort1.Open()
                connect_btn.Text = "Disconnect"
                Timer1.Enabled = True
            Else
                MsgBox("Please choose Serial Port")
            End If
        Else
            SerialPort1.Close()
            connect_btn.Text = "Connect"
            Timer1.Enabled = False
        End If


    End Sub


    Private Sub Timer1_Tick(sender As Object, e AsEventArgs) Handles Timer1.Tick

        'Read Serial Data and split it to text boxes
        RxData = ReceiveSerialData()
        Dim rxpacket As String() = RxData.Split(";")
        Dim rxprams As String() = rxpacket(0).Split(",")
        TB_P1.Text = rxprams(0)
        TB_P2.Text = rxprams(1)
        TB_P3.Text = rxprams(2)

    End Sub


    Function ReceiveSerialData() As String
        Dim Incoming As String
        Try
            Incoming = SerialPort1.ReadExisting()
            If Incoming Is Nothing Then
                Return "no-data" & vbCrLf
            Else
                Return Incoming
            End If
        Catch ex As TimeoutException
            Return "Error: Serial Port timeout."
        End Try

    End Function

End Class


Von Alex @ AEQ-WEB 161