www.mikrocontroller.net

Forum: PC-Programmierung C# Daten über Serial Port empfangen und in Char speichern


Autor: Philipp Maricek (lord-maricek)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

ich möchte mit C# Daten empfangen die von einem Arduino Nano werden. Ich 
habe es schon geschafft daten zum Arduino zusenden und damit einen Servo 
zusteuern. Es werden immer 2 Daten gesendet werden, die dann in Char[0], 
Char[1] gespeichert werden sollen. Ich habe schon mal nach Tutorial im 
I-Net gesucht aber habe teilweise nur englische gefunden, die ich aber 
nicht sorichtig verstanden habe. Ich möchte es auch so haben, wenn 
möglich, dass wenn eine Datei an den PC gesendet wird, dass dann 
automatsich eine Funktion aufgerufen wird um diese Dateinen zu 
empfangen. Könnt ihr mir helfen?
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;


namespace Servo_GUI
{
    public partial class Form1 : Form
    {
        SerialPort sp;
        int modus = 0;
        char[] send;
        int _trackbar;

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (modus == 0)
            {
                sp = new SerialPort(comboBox1.SelectedItem.ToString(), Convert.ToInt32(comboBox2.SelectedItem.ToString()), Parity.None, 8, StopBits.One);
                sp.Open();
                modus = 1;
                button1.Text = "Trennen";
                label4.Text = "Verbunden";
                panel1.Enabled = true;
            }
            else if (modus == 1)
            {
                sp.Close();
                modus = 0;
                button1.Text = "Verbinden";
                label4.Text = "Getrennt";
                panel1.Enabled = false;
            }
        }

        private void trackBar1_Scroll(object sender, EventArgs e)
        {
            _trackbar = trackBar1.Value;
            label8.Text = _trackbar.ToString() ; // Wert_anzeige

            send = new char[2] { Convert.ToChar(_trackbar.ToString()[0]), Convert.ToChar(_trackbar.ToString()[1]) };
            sp.Write(send, 0, send.Length);

        }

    }
}

Autor: Ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vorne weg. Dein Programmstil ist nicht das gelbe vom Ei, aber das kommt 
hoffentlich mit der Erfahrung.
Du verwendest doch sicherlich VS2008 Express.
Statt deinen Serialport manuell hinzuzufügen kannst du ihn aus der 
Toolliste wählen und auf deine Form ziehen. In den Eigenschaften die 
Parameter einstellen und auch die Events anlegen. Fertig.

Wenn du es doch lieber manuell willst:
...
char[] receive = new char[2];
...
{
sp = new SerialPort(comboBox1.SelectedItem.ToString(), Convert.ToInt32(comboBox2.SelectedItem.ToString()), Parity.None, 8, StopBits.One);
sp.Open();
this.sp.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(this.sp_DataReceived);
...
}
...
private void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
int bytesrx = sp.BytesToRead;
byte[] data = new byte[bytesrx];
sp.Read(data, 0, bytesrx);
if(bytesrx>=2)
receive[0] = (char)data[0];
receive[1] = (char)data[1];
// Was machst du wenn du mehr als zwei Bytes empfängst?
}
else
{
//Was machst du wenn du nur ein Byte empfängst?
}
}

Autor: Olaf B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,
ich versuche mich eben auch an einem solchen Program.
Gibt es in C# eine Möglichkeit die empfangenen Daten in eine art 
Terminalfenster, innerhalb des Programms, anzuzeigen und welches Element 
sollte man dazu nutzen ?

bin dankbar für ein kleines Beispiel.

Olaf

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Gibt es in C# eine Möglichkeit die empfangenen Daten in eine art
> Terminalfenster, innerhalb des Programms, anzuzeigen und welches Element
> sollte man dazu nutzen ?
Nicht direkt mit "echtem" Terminalfenster o.ä., denn C# (+ IDE) ist eben 
eine Programmiersprache und hat sicher nicht den Fokus auf 
Schnittstellen etc.
Eine einfache Möglichkeit ist, den ReceiveEvent zu implementieren und 
mit einem Breakpoint zu gucken, welches Byte ankam. Wenn mich nicht 
alles täuscht, kann man das SerialPort-Control (vorhanden ab .NET 2.0) 
so einstellen, dass der ReceiveEvent erst nach einer bestimmten Anzahl 
an Bytes feuert. Somit müsstest du nicht Byte für Byte einlesen, sondern 
kannst dann den ganzen Buffer des SerialPort-Controls über die 
Debug-Fenster auslesen (je nach verwendeter IDE sogar bloß durch 
Draufzeigen mit der Maus :)

Ralf

Autor: Arc Net (arc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ralf schrieb:
>> Gibt es in C# eine Möglichkeit die empfangenen Daten in eine art
>> Terminalfenster, innerhalb des Programms, anzuzeigen und welches Element
>> sollte man dazu nutzen ?
> Nicht direkt mit "echtem" Terminalfenster o.ä., denn C# (+ IDE) ist eben
> eine Programmiersprache und hat sicher nicht den Fokus auf
> Schnittstellen etc.
> Eine einfache Möglichkeit ist, den ReceiveEvent zu implementieren und
> mit einem Breakpoint zu gucken, welches Byte ankam. Wenn mich nicht
> alles täuscht, kann man das SerialPort-Control (vorhanden ab .NET 2.0)
> so einstellen, dass der ReceiveEvent erst nach einer bestimmten Anzahl
> an Bytes feuert. Somit müsstest du nicht Byte für Byte einlesen, sondern
> kannst dann den ganzen Buffer des SerialPort-Controls über die
> Debug-Fenster auslesen (je nach verwendeter IDE sogar bloß durch
> Draufzeigen mit der Maus :)
>
> Ralf

Warum so kompliziert?
Häufig reicht schon die einfache Variante im DataReceived-Event, wenn's 
nur Text ist, das ganze in eine TextBox zu schreiben (Invoke nicht 
vergessen) bzw. wenn's Binärdaten sind, diese vorher eben in einen Text 
umzuwandeln.

Autor: Olaf B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, Ralf und Arc Net
vielen Dank für die Antworten. sorry ich habe die Version vergessen, ich 
habe Visual C# für dieses Projekt gewählt um eine schnelle 
Programmoberfläche zu schaffen, und die Serielle COM ohne Vorkenntniss 
zu haben. derzeit empfange ich Datensätze ca. 64 byte von einem Mega128 
welcher selbige über ein Zigbee Modul bekommt, lege diese in einen 
Buffer ab um Teile davon in Labels anzuzeigen. Jedoch der größte Teil 
davon soll in ein Fenster welches dann wie ein Terminal scollen kann, 
die Datensätze wiederholen sich im sec. Takt.
Ich suche nun ein Element im Visual welches ich dafür nutzen kann.
Dazu möchte ich noch betonen, by Hand kann ich so etwas nicht 
realisieren,
meine C Kenntnisse reichen nicht in den PC Bereich.

sorry sehr lang geworden, Ich bitte um Hilfestellung, Danke.

Olaf

Autor: Josef Bernhardt (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

ich habe ein RS232 (Serial Port) Testprogramm
in C# geschrieben, falls jemand Interesse hat gebe ich es gerne weiter !

meine mail Adresse

josef@bernhardt.de

viele Grüße

Josef

Autor: Josef Bernhardt (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier das C# Projekt

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.