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


von Philipp M. (lord-maricek)


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?
1
using System;
2
using System.Collections.Generic;
3
using System.ComponentModel;
4
using System.Data;
5
using System.Drawing;
6
using System.Linq;
7
using System.Text;
8
using System.Windows.Forms;
9
using System.IO.Ports;
10
11
12
namespace Servo_GUI
13
{
14
    public partial class Form1 : Form
15
    {
16
        SerialPort sp;
17
        int modus = 0;
18
        char[] send;
19
        int _trackbar;
20
21
        public Form1()
22
        {
23
            InitializeComponent();
24
        }
25
26
        private void button1_Click(object sender, EventArgs e)
27
        {
28
            if (modus == 0)
29
            {
30
                sp = new SerialPort(comboBox1.SelectedItem.ToString(), Convert.ToInt32(comboBox2.SelectedItem.ToString()), Parity.None, 8, StopBits.One);
31
                sp.Open();
32
                modus = 1;
33
                button1.Text = "Trennen";
34
                label4.Text = "Verbunden";
35
                panel1.Enabled = true;
36
            }
37
            else if (modus == 1)
38
            {
39
                sp.Close();
40
                modus = 0;
41
                button1.Text = "Verbinden";
42
                label4.Text = "Getrennt";
43
                panel1.Enabled = false;
44
            }
45
        }
46
47
        private void trackBar1_Scroll(object sender, EventArgs e)
48
        {
49
            _trackbar = trackBar1.Value;
50
            label8.Text = _trackbar.ToString() ; // Wert_anzeige
51
52
            send = new char[2] { Convert.ToChar(_trackbar.ToString()[0]), Convert.ToChar(_trackbar.ToString()[1]) };
53
            sp.Write(send, 0, send.Length);
54
55
        }
56
57
    }
58
}

von Ich (Gast)


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:
1
...
2
char[] receive = new char[2];
3
...
4
{
5
sp = new SerialPort(comboBox1.SelectedItem.ToString(), Convert.ToInt32(comboBox2.SelectedItem.ToString()), Parity.None, 8, StopBits.One);
6
sp.Open();
7
this.sp.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(this.sp_DataReceived);
8
...
9
}
10
...
11
private void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
12
{
13
int bytesrx = sp.BytesToRead;
14
byte[] data = new byte[bytesrx];
15
sp.Read(data, 0, bytesrx);
16
if(bytesrx>=2)
17
receive[0] = (char)data[0];
18
receive[1] = (char)data[1];
19
// Was machst du wenn du mehr als zwei Bytes empfängst?
20
}
21
else
22
{
23
//Was machst du wenn du nur ein Byte empfängst?
24
}
25
}

von Olaf B. (Gast)


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

von Ralf (Gast)


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

von Arc N. (arc)


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.

von Olaf B. (Gast)


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

von Josef Bernhardt (Gast)


Angehängte Dateien:

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

von Josef Bernhardt (Gast)


Angehängte Dateien:

Lesenswert?

Hier das C# Projekt

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.