Was ich bei meinem Beitrag vor einigen Tagen vergessen habe: Anregungen und Kritik sind natürlich immer erwünscht.
Außerdem kann ich bei Bedarf auch nur den Quellcode posten
Hallo.
In letzter Zeit gab es immer wieder Nachfragen wie man in C# Daten über die serielle Schnittstelle an einen Microcontroller sendet.
Deshalb habe ich mich dazu entschlossen mal als eine kleine Beispielanwendung ein kleines Terminalprogramm in C# geschrieben und kommentiert (Ok die Kommentare können noch ausgebaut werden)
Ich hoffe dass diese Beispielanwendung insbesondere Anfängern hilft den schnellen Einstieg in die Verwendung der seriellen Schnittstelle in C# ermöglicht.
Im Anhang findet ihr einmal die fertig erstellte Exe (.Net Framework 4)
und das gesamte Projekt samt Quellcode in Form einer Visualstudio Solution (Visualstudio 2010 C# Express)
liebe Grüße
shedepe
Geändert von shedepe (20.07.2011 um 15:20 Uhr)
Was ich bei meinem Beitrag vor einigen Tagen vergessen habe: Anregungen und Kritik sind natürlich immer erwünscht.
Außerdem kann ich bei Bedarf auch nur den Quellcode posten
hey
das sieht echt nett aus, sowas versuche ich grad zu verstehen
nur die ganzen einstellungen mache ich im code selbst
aber könntest du hier vllt einfach mal ganz simpel erzähle wie man sendet und empfängt?
und dazu bisschen was erzählen
das würde mir sehr helfen
vielen dank
Hallo, zum Verständnis allgemein erstmal (sollte auch die erste Anlaufstelle bei anderen Fragen bezüglich C# sein): http://msdn.microsoft.com/de-de/libr...erialport.aspx
Und nun zu deiner Frage:
Gesendet wird mit dieser Zeile: Es wird direkt der Inhalt der Textbox über die Serielleschnittstelle gesendet.
Es gibt auch die Möglichkeit mit "serialPort.Write(buffer[],int Offsize, int count);" Einzelne und mehrere Bytes zu senden, was man häufig bei einem Befehls bzw. Datenprotokoll braucht.
Das Empfangen ist etwas komplizierter:Code://Hier werden die eingebenen Daten über die serielle Schnittstelle gesendet serialPort.WriteLine(tbDataToSend.Text);
Zum einen muss man zuerst das SerialPort.DataRecieved Event abonnieren (Zur Eventbasierten Programmierung empfehle ich diesen Link hier: http://www.mycsharp.de/wbb2/thread.php?threadid=26116)
Zum anderen muss man die Daten dann verarbeiten wenn, das Event ausgelöst wird (also Daten angekommen sind)Code:serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived); //DataRecieved Event abonnieren
Code:void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) //Methode die Aufgerufen wird, wenn das Event ausgelöst wurde. Die Methode wurde oben festgelegt beim abonnieren { foreach (var item in serialPort.ReadLine()) //Lese alle verfügbaren Daten. Hier gibt es auch noch andere Auslesemöglichkeiten wie z.B. Read() bzw ReadToEnd() { lbRecieved.Invoke(lbRecievedDelegate,new object[]{item}); //Das wird für den Zugriff auf die Gui benötigt. (Thread übergreifende Zugriffe) } }
Hallo, ich hab grad noch entdeckt dass ich einen kleiner Fehler bei der Verarbeitung der ankommenden Daten gemacht hab. Ich hab das jetzt korrigiert. Im Anhang befindet sich die richtige Version.
hallo...
hab nun nen problem mitn empfangen
wird gesagt das es threadübergreifend ist..
bekanntes problem ich weiß... ich habe mich damit nun über 20std! beschäftigz....es versucht im internet zu erlesen
ich packs nicht, bin grad am verzeifeln
ich brauche irgendwie diesen invoke befehl
du bist grad meine letzte hoffnung
ich hoffe du hilfst mir und erklärst mir das problem beim empfangen beim serialport...
hab hier einfach mal mein ganzen code hochgeladen, kannst dir ja mal anschauen
schon mal vielen vielen dank
Geändert von bZzR (28.07.2011 um 00:01 Uhr)
Würde es dir was ausmachen den Code als Textdatei anzuhängen? Hab grad leider nichts zum .rar öffenen da.
Ganz einfach kannst du das Problem mit dem Threadübergreifenden zu Griff aber so lösen: (Ich beziehe mich bei der Namensgebung der Controls bzw. Objekte auf mein Beispielprogramm)
In meinem Programm habe ich das ganze mit einem Delegaten gelöst was den Vorteil hat dass man sich z.B. den Umweg über die globale Variable sparen kann.Code:void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) { //Hier die Daten die du ausgelesen hast in irgendeiner globalen Variable speichern lbRecieved.Invoke(new MethodInvoker(MethodeZumDatenInListboxSchreiben)); } void MethodeZumDatenInListboxSchreiben() { lbRecieved.Items.Add(<Daten aus der globalen Variable>); }
Hier kannst du das auch nochmal nachlesen:
http://www.mycsharp.de/wbb2/thread.php?threadid=33113
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports; //serielleSchnittstelle
using System.Collections; //ArrayListe
using System.Threading; //Delagation invoke (Threadübergreifend)
using System.Timers; //Timer
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
SerialPort Schnittstelle = new SerialPort("COM1"); //Deklaration
byte[] daten = new byte [3];
private void Form1_Load(object sender, EventArgs e)
{
}
private void buttonConnect_Click(object sender, EventArgs e)
{ //Festlegung Parameter=
Schnittstelle.BaudRate = 9600;
Schnittstelle.Parity = Parity.None;
Schnittstelle.DataBits = 8;
Schnittstelle.StopBits = StopBits.One;
Schnittstelle.Handshake = Handshake.None;
Schnittstelle.ReadTimeout = 500;
Schnittstelle.WriteTimeout = 500;
try
{
Schnittstelle.Open(); //Serialport öffnen
if (Schnittstelle.IsOpen)
{
buttonConnect.Enabled = false; //Connect_Button blass
buttonConnect.Text = "Erfolgreich";
}
}
catch
{
MessageBox.Show("Keine Verbindung möglich", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
Schnittstelle.DataReceived += new SerialDataReceivedEventHandler(Nebenthread); // Abo_Event abonnieren
}
void Nebenthread(object sender, SerialDataReceivedEventArgs e) //Diese Methode wird ausgelöst. Wurde vorher abonniert
{
//string serialIn = Schnittstelle.ReadLine();
//listBox1.Invoke(new EventHandler(delegate { listBox1.Items.Add(serialIn); }));
this.textBox1.Text = Schnittstelle.ReadExisting();
}
private void buttonDisconnect_Click(object sender, EventArgs e)
{
Schnittstelle.Close();
buttonConnect.Enabled = true;
buttonConnect.Text = "Connect";
}
private void buttonSenden_Click(object sender, EventArgs e)
{
daten[0] = 1;
daten[1] = 2;
if (Schnittstelle.IsOpen)
{
Schnittstelle.Write(daten, 0, daten.Length); //Daten senden
// oder//Schnittstelle.Write(daten, 0, 2);
}
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e) // Anwendungen schließen = Verbindung trennen
{
Schnittstelle.Close();
}
}
}
hoffe du blickst durch..
und wenn du mir da jetzt den passenden code schreibst, bin ich dir unendlich danklbar
versuche das jetzt natürlich noch selber und morgen auch
aber wäre dir echt dankbar wenn du was schreibst, ist ja ein leichtes für dich
DANKE
PS: ich möchte es auch ohne globale variabeln...hab das eben verucht, gefällt mir alles nicht so :/
Geändert von bZzR (28.07.2011 um 11:37 Uhr)
Lesezeichen