Fragensteller
Problem mit SerialWrite beim Start

Allgemeine Diskussion
-
Hallo,
erstmal danke für die Hilfe. Ich habe eine kleine Interfaceanwendung, letztendlich für einen Arduino, geschrieben welcher ein paar LEDs steuert. Unter anderem soll beim Start des Programmes ein paar Strings in den seriellen Port geschrieben werden. Das Problem ist nun das dies immer nur nach dem zweiten Mal, nachdem der Arduino angeschlossen wurde, funktioniert, d.h. ich schließe den Arduino an öffne die C# Anwendung und es passiert nichts, nun schließe ich das Programm und öffne es wieder und der Arduino bringt die gewünschte Reaktion. Dies geschieht immer nur nachdem der Arduino angeschlossen wurde. Sonst funktioniert alles wie es soll. Vielleicht weiß jemand woher dieser Fehler kommt.
Der C# Code:
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 Hintergrundlicht { public partial class Form1 : Form { public Form1() { InitializeComponent(); if(Autostart.Checked) { if (!serialPort1.IsOpen) { serialPort1.Open(); } serialPort1.WriteLine(">g0200<"); serialPort1.WriteLine(">b0250<"); serialPort1.WriteLine(">r0100<"); } } private void OK_Click(object sender, EventArgs e) { if(!serialPort1.IsOpen) { serialPort1.Open(); } string data = textBox1.Text; serialPort1.WriteLine(data); } private void Flush_Click(object sender, EventArgs e) { if (!serialPort1.IsOpen) { serialPort1.Open(); } serialPort1.WriteLine(">g0000<"); serialPort1.WriteLine(">b0000<"); serialPort1.WriteLine(">r0000<"); } } }
Der Arduino Code:
int ledRot = 3; int ledBlau = 5; int ledGrun = 4; int bufferCount; char buffer[80]; int valRot; int valBlau; int valGrun; void setup() { // start serial port at 9600 bps: Serial.begin(9600); } void loop() { analogWrite(ledRot, valRot); analogWrite(ledGrun, valGrun); analogWrite(ledBlau, valBlau); #if defined(__AVR_ATmega32U4__) if (Serial.available()) serialEvent(); #endif } void serialEvent() { char ch = Serial.read(); buffer[bufferCount] = ch; bufferCount++; if (ch == 10) { evalSerialData(); } } void evalSerialData(){ // Serial.println(buffer); if ((buffer[0] == '>') && (buffer[bufferCount - 2] == '<')) { //wegen ++ und ch switch (buffer[1]) { case 'r': valRot = (buffer[2] - 48) * 1000 + (buffer[3] - 48) * 100 + (buffer[4] - 48) * 10 + (buffer[5] - 48); break; case 'b': valBlau = (buffer[2] - 48) * 1000 + (buffer[3] - 48) * 100 + (buffer[4] - 48) * 10 + (buffer[5] - 48); break; case 'g': valGrun = (buffer[2] - 48) * 1000 + (buffer[3] - 48) * 100 + (buffer[4] - 48) * 10 + (buffer[5] - 48); break; } } bufferCount = 0; }
vielen Dank und mit freundlichen Grüßen
niklas4591
- Typ geändert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 28. Oktober 2016 08:51 Warten auf Rückmeldung
Alle Antworten
-
Hi,
ich würde den Code aus dem Konstruktur der Form rausnehmen und ihn in einen Eventhandler, bspw. des Load Events der Form oder ähnliches packen.
Zum Problem an sich die Frage: Kann es sein, dass das Gerät zwar angeschlossen, von Windows aber noch nicht zugeordnet ist? Das dauert ja u.U. ein paar Sekunden. Wenn Du jetzt vorher schon was sendest, landet das evtl. im Nirvana. Um das zu testen, warte mit dem Öffnen deiner Anwendung einfach mal eine gewisse Zeit lang.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community