PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : COM Port auslesen



Sinner1990
26.08.2013, 15:27
Hallo ich habe ein Problem mit C# 2010.
Ich will ein COM Port auslesen. Aber ich bin noch ein Anfänger. Weiter wie in mein Code komme ich nicht. Die Hilfen im Netz haben bis jetzt auch nicht geholfen. Ich will einfach nur die Daten in einer Textbox ausgeben. Kann mir jemand weiterhelfen?? :)



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;
using System.IO; //serielle Schnittstelle
using System.Collections; //Array Liste
using System.Threading; //Delagation invoke (Threadübergreifend)
using System.Timers; //Timer

namespace Serielle_Schnitt.Lesen
{
public partial class Form1 : Form
{


SerialPort Schnittstelle = new SerialPort("COM3");

public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
button2.Enabled = true;

//Parameter Festlegen

Schnittstelle.BaudRate = 9600;
Schnittstelle.Parity = Parity.None;
Schnittstelle.DataBits = 8;
Schnittstelle.StopBits = StopBits.One;
Schnittstelle.Handshake = Handshake.None;
Schnittstelle.ReadTimeout = 500;
Schnittstelle.WriteTimeout = 500;

//Serialport öffnen
try
{
Schnittstelle.Open();

if (Schnittstelle.IsOpen)
{
MessageBox.Show("Verbindung erfolgreich");
}
}
catch
{
MessageBox.Show("Keine Verbindung möglich");
}

Schnittstelle.DataReceived += new SerialDataReceivedEventHandler(Schnittstelle_DataR eceived);
}


void Schnittstelle_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
throw new NotImplementedException();
}




private void button2_Click(object sender, EventArgs e)
{
Schnittstelle.Close(); //COM Port schließen
button2.Enabled = false; //"schließen" Button deaktivieren
}
}
}

seite5
26.08.2013, 22:29
Hi,
sehr mutig, gleich mit einem eigenen event handler für die serielle Schnitte anzufangen !
Vielleicht solltest Du erst mal mit den vorhandenen buffern arbeiten. Ein eigener event
handler ist eigentlich nur nötig, wenn die Daten quasi "unangefordert", also ohne Aufforderung
an den Sender "eintrudeln".
Ansonsten müsstest Du Dir erst mal entsprechenden receive buffer anlegen, in die Du in
Deinem event handler die ankommenden Zeichen einsortierst und evtl. bewertest (ob Satz
komplett oder so)
mfg
Achim

Wsk8
26.08.2013, 23:32
Port öffnen/schließen etc.

private void Form1_Load(object sender, EventArgs e) {
string[] ports = SerialPort.GetPortNames();
comboBox1.Items.AddRange(ports);


if (ports.Length > 0)
{
comboBox1.SelectedIndex = 0;
btnOpen.Enabled = true;
}
}


private void btnOpen_Click(object sender, EventArgs e)
{
if (btnOpen.Text == "Open")
{
serialPort1.PortName = comboBox1.Text;
serialPort1.Open();
btnOpen.Text = "Close";
comboBox1.Enabled = false;
groupBox1.Enabled = true;
timer1.Enabled = true;
}
else
{
serialPort1.Close();
btnOpen.Text = "Open";
comboBox1.Enabled = true;
groupBox1.Enabled = false;
timer1.Enabled = false;
}
}

Daten rausschreiben

serialPort1.Write(dataSend.ToArray(), 0, dataSend.Count);

Daten empfangen

// check for new data
while (serialPort1.BytesToRead > 0)
{
byte rxByte = (byte)serialPort1.ReadByte();


protocol_ParseByte(rxByte);
}

Sind nur Bruchstücke aus meinem Code, sollte aber alles nötige drin sein.

mfg

Sinner1990
27.08.2013, 08:27
Danke für die Hilfe. Es funktioniert jetzt. Hier ein kleiner ausschnitt.

Schnittstelle.DataReceived += new SerialDataReceivedEventHandler(Schnittstelle_DataR eceived);
}


private void Schnittstelle_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
Dateneingang = Schnittstelle.ReadExisting();
this.BeginInvoke(new EventHandler(DoUpdate));
}

private void DoUpdate(object s, EventArgs e)
{
richTextBox1.AppendText(Dateneingang); // schreibe Daten von Dateneingang(string) in Textbox
}

shedepe
27.08.2013, 21:48
Hey, ich hab vor einiger Zeit das ganze außerdem mal als Beispielprojekt gemacht und hier im Forum veröffentlicht.
Dort wird auch gezeigt wie man korrekt aus einem anderen Thread auf GUI Elemente schreibt. Deine Variante mag zwar gehen, ist aber in diesem Anwendungsfall eher schlecht. (Man sollte z.b. lieber direkt das Steuerelement das man aktualisieren will "invoken" anstatt das komplette Form)

Sinner1990
29.08.2013, 08:34
Okay, kannst du mal n Link zu dein Beispielprojekt posten?

oberallgeier
29.08.2013, 08:48
Hi, willkommen im Forum.

... kannst du mal n Link zu dein Beispielprojekt posten?Nur so nebenbei - als Ratschlag zum Umgang mit der Suchfunktion hier im Forum, nicht als Vorwurf.

Es gibt rechts oben in der Buttonleiste den Punkt [Erweiterte Suche]. Dort könntest Du selbst suchen. Benutzer [shedepe], rechts daneben das Fenster umstellen von [Die neuesten Beiträge vom Benutzter suchen] auf [Themen vom Benutzer suchen] - und EVTL. links über dem Benutzer einen Suchbegriff eingeben (hier also Port - wenns nix wird, dann mit COM versuchen oder so). Danach bekommst Du eine Liste, da findest Du bestimmt den gewünschten Link SELBST. Ohne dass andere für Dich suchen müssen. Übrigens - wenn ICH schlecht drauf bin, würde ich auf Deine Frage lapidar und extrem kurz antworten: Ja. *ggg*.

shedepe
29.08.2013, 20:09
Ich dachte eigendlich ich hätte den Link mit geposted....ist wohl untergegangen...
https://www.roboternetz.de/community/threads/53894-Beispiel-Anwendung-C-Zugriff-auf-SerialPort