Visual Basic

Hallo,

Brauche hilfe wie empfange ich vom arduino gesendete daten in Visual Basic?
Eine Led ansteuern über Visual basic habe ich hinbekommen aber das ich zb. Eine Textbox einfüge und dort Led on oder off anzeigen lassen kriege ich nicht hin.
Könnt ihr mir helfen?

Danke im Voraus

Helfen können wir bestimmt, wenn du etwas mehr Input lieferst.

Wie Du sie in VB empfängst, wirst Du wohl in einem VB-Forum fragen müssen.
Auf der Arduino-Seite sendest Du die Information über Serial.print/println.

Ich würde immer empfehlen, das Senden mit Prrintln (also Zeilenvorschub) zu beenden, da weiß das empfangende Programm, wann eine Übertragung zu Ende ist.

Alles Andere kannst Du selbst gestalten. Alsi z.B.

Serial.println("LED aus");

Gruß Tommy

Hallo,

Was für infos brauchst du noch?
Meine frage wäre wie muss die syntax in vb aussehen?

Beachte den Absatz zur Thread-Sicherheit. Aus dem Serial Eventhandler heraus direkt auf ein GUI Element zuzugreifen geht meistens schief. Also immer mit der Invoke() bzw. BeginInvoke() Methode der entsprechenden Komponente arbeiten. In dem Code Beispiel ist das nicht implementiert weil das eine Konsolenanwendung ist. Der MethodInvoker Delegate ist dabei sehr praktisch.

Hallo,

hier mal was ich in arduino programmiert habe:

int led=13;
char data;

void setup() {
 Serial.begin(9600);
 pinMode(led,OUTPUT);
}

void loop() {
 if(Serial.available()){
   data=Serial.read();
    }

   if (data=='0'){
     digitalWrite(led,HIGH);
     Serial.println("LED ON");

   }
   if(data=='1'){
     digitalWrite(led,LOW);
     Serial.println("LED OFF");
   }
}

In VB:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace arduino

{
   public partial class Form1 : Form   
   {   
       public Form1()
       {
           InitializeComponent();
           serialPort1.Open();        
       }

       private void button1_Click(object sender, EventArgs e)
       {
           serialPort1.Write("0");
       }

       private void button2_Click(object sender, EventArgs e)
       {
           serialPort1.Write("1");
       }

Was? und wo? füge ich was ein damit ich damit ich die gesendeten daten vom arduino (LED ON/Off) auf meiner VB form anzeigen lassen kann?

Ich finde nirgends eine richtige Beschreibung dafür.

Danke nochmal!!!

Das ist der Arduino-Teil.
Du hast da die Antwort schon drin. Auf Arduino-Seite ist nichts mehr zu tun.

Du musst im VB Serial lesen und "LED ON" bzw. "LED OFF" erkennen.

Gruß Tommy

Du musst im VB Serial lesen und "LED ON" bzw. "LED OFF" erkennen

Du musst überhaupt erstmal die Variable serialPort1 definieren, und den richtigen Seriellen Port finden und mit den passenden Parametern (Geschwindigkeit) öffnen. (Das wichtigste hast du wohl nur nicht gepostet)

Dann kannst du es einfach oder kompliziert machen. "Kompliziert" ist ein EventHandler, der drankommt, wenn etwas empfangen wird, der aber selbst leider nicht auf deine Forms Objekte zugreifen kann.
Einfacher wäre ein Timer Objekt in deiner Form, das zyklisch (am geöffneten) serialPort1.Read() macht und etwas mit dem gelesenen Text macht.

Ich finde nirgends eine richtige Beschreibung dafür.

Das ist eine .net Frage und hat nix mit Arduino zu tun. System.IO.Ports.SerialPort

Kosta:
Was? und wo? füge ich was ein damit ich damit ich die gesendeten daten vom arduino (LED ON/Off) auf meiner VB form anzeigen lassen kann?

Wieso hast du jetzt plötzlich C# Code? Da könnte ich dir sofort ein fertiges Programm liefern. Aber nicht in VB.

Das ist aber trotzdem gut dokumentiert. MSDN hat massig Beispiel Code. Du musst nur beachten dass das meistens für Konsolenanwendung ist. Deshalb der deutliche Hinweis mit dem Threadzugriff wenn du mit einem Event Handler arbeitest.

michael_x:
Einfacher wäre ein Timer Objekt in deiner Form, das zyklisch (am geöffneten) serialPort1.Read() macht und etwas mit dem gelesenen Text macht.

In einer Anwendung musste ich das sogar mal machen weil der Event Handler nicht immer getriggert hat und es dadurch zu deutlich merkbaren Verzögerungen kam. Sonst ging es aber immer.
Ist auch sehr einfach. Timer Objekt anlegen und z.B. alle 50ms auslösen lassen. Und eine Methode aufrufen die abfragt ob was im Eingangspuffer ist.

Das mit dem MethodInvoker Delegate ist auch nicht so kompliziert wenn man es mal hat. Aber zu VB kann und will ich nichts sagen.

Das mit dem MethodInvoker Delegate ist auch nicht so kompliziert wenn man es mal hat

Ja stimmt, ist eigentlich kein Problem, aber wer so fragt, ist erstmal froh ohne eine solche Konstruktion.
(Wenn ich mich an meine ersten .net Versuche zurückerinnere…)

In VB:

using System;

Ooops, stimmt auch, VB ist das ohne Semikolons :wink: (ist auf MSDN aber nur ein Klick Unterschied )

Serenifly:
Wieso hast du jetzt plötzlich C# Code? Da könnte ich dir sofort ein fertiges Programm liefern. Aber nicht in VB.

Daran soll es nun wirklich nicht scheitern :slight_smile:

Convert VB2C# (Und vice versa)
Bzw. kann man auch in C# kompilierte Programme in VB dekompilieren. Bzw. um genau zu sein, die CLI zurück übersetzen. Der Reflection isses egal.

Die Allumfassende Erklärung, samt Lösung findet man (wie häufig) auf CodeProject:
Serial Comms for Beginners
Dort ist alles genauestens erklärt, sogar fast schon zu detailliert. Man kann es entweder als Anleitung heranziehen und beim lesen mit programmieren, oder einfach die Projektmappe herunterladen.
Wobei ich natürlich dem Verständnis halber den ersten Weg empfehle.

Frei nach Andi Möller:
Egal ob C# oder VB, Hauptsache Italien!

Hallo,

achso mein code ist nicht Visual Basic sondern C#. Kenne mich da nicht so gut aus.

Dann konvertiere ich das in Visual Basic und mache da weiter.

Könnte mir jemand einen Bsp. Code in Visual Basic senden wie ich das gesendete vom Arduino in einer Textbox anzeigen lassen kann.

Danke für eure Hilfe!

Wenn du sowieso was neues lernen musst wäre es besser gleich C# zu lernen. Das ist wesentlich besser als VB :slight_smile:

Im Anhang ist ein Demo GUI und ein Arduino Test Programm. Das GUI ist in etwa an den seriellen Monitor angelehnt. Der Code zeigt auch wie man den Com Port automatisch detektiert.

Das geht aber nicht mit USB-seriell Wandlern. In dem Fall wird er aber trotzdem angezeigt und kann per Hand ausgewählt werden. Selbst ohne die Auto-Detektierung (was nur darauf beruht dass ein Gerät “Arduino” im Namen hat) ist das so zuverlässiger als das primitive GetComPorts() der SerialPort Klasse. Das fragt nämlich nur die Registry ab.
Siehe CreateComPortMenuItems()

Das was ich angesprochen hatte läuft hier ab:

private void TextBoxPrint(string text)
{
  if (communicationOutput.InvokeRequired)
  {
     communicationOutput.BeginInvoke((MethodInvoker)delegate
    {
       communicationOutput.AppendText(text);
     });
  }
  else
  {
     communicationOutput.AppendText(text);
  }
}

Mit InvokeRequired fragt man ab ob man auf dem gleichen Thread ist. Wenn nein, macht man BeginInvoke über einen MethodInvoker delegate, der den Methoden Aufruf verpackt. Das ist schon alles

Die eigentliche serielle Kommunikation ist in der SerialCommunicator Klasse. Diese Klasse kannst du auch einfach in andere Projekte einbinden
Der kann man über den Konstruktor ein oder zwei Delegates (Actions) übergeben um die Daten bzw. Fehlermeldungen an das eigentliche Programm weiterzureichen. Das Beispiel Programm verwendet nur einen, aber wenn man die Daten z.B. nicht als Text anzeigt sondern graphisch darstellt kann man so die Fehlerausgaben abtrennen.

Also nur beim Erstellen mitteilen, wie die Klasse mit deinem Programm kommuniziert:

_serial = new SerialCommunicator(TextBoxPrint);

Dann werden alle empfangenen Texte in diese Methode umgeleitet (die Methode hat ein string als Parameter). Das könnte z.B. auch ein Parser sein der den Text analysiert statt direkt ausgibt.
Und das würde z.B. die Fehlermeldungen komplett ignorieren:

_serial = new SerialCommunicator(TextBoxPrint, null);

Statt null ist auch ein zweiter Delegate mit einem String Parameter für die Fehler möglich

Der eigentliche Empfang findet hier statt:

 private void DataReceived(object sender, SerialDataReceivedEventArgs e)
 {
   try
   {
     string str = _serialPort.ReadExisting();

     if (_dataCallback != null)
       _dataCallback(str);
   }
   catch (Exception ex)
   {
     if (_errorCallback != null)
     {
        _errorCallback("Fehler beim Lesen!");
        _errorCallback(ex.Message);
     }
   }
}

ReadExisting() liest alles was da ist. Das geht meistens. Was aber auch gut geht, ist auf dem Arduino immer eine ganze Zeile mit println() senden und dann statt dessen ReadLine() zu verwenden. Das liest dann die ganze Zeile komplett ein. Allerdings geht so das CR/LF auch unter. Wenn man Daten sendet ist das egal. Wenn man Text auf dem PC aber so darstellen will wie er auf dem Arduino gesendet wird macht das natürlich Probleme.

Das Arduino Programm erwartet Daten in folgendem Format:
[Zahl],an
[Zahl],aus

Also z.B. “1,an” für “LED 1 an” oder “5,aus” für “LED 5 aus”. Das kann natürlich auch anders machen. Das steht dir völlig frei

Wichtig ist dass das Programm ein CR oder LF als Endzeichen erwartet!! Also Stelle das auf dem PC so ein. Dazu gibt es unten eine Liste!

SerialDemo.zip (85.4 KB)

SerialRead.ino (833 Bytes)