Wenn du sowieso was neues lernen musst wäre es besser gleich C# zu lernen. Das ist wesentlich besser als VB 
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)