Forum: PC-Programmierung SerialPort funktioniert nicht


von Hssig 7. (Gast)


Lesenswert?

Hallo Leute,

versuche gerade mit C# (Visual Studio 2013, wpf) eine serielle Konsole 
ans Laufen zu bekommen. Mit einem anderen Terminal-Programm weiss ich, 
dass
über Port15 Daten von der Gegenstelle empfangen werden.

Das ist mein bisheriger Code:
1
using System;
2
using System.IO.Ports;
3
using System.Collections.Generic;
4
using System.Linq;
5
using System.Text;
6
using System.Threading.Tasks;
7
using System.Windows;
8
using System.Windows.Controls;
9
using System.Windows.Data;
10
using System.Windows.Documents;
11
using System.Windows.Input;
12
using System.Windows.Media;
13
using System.Windows.Media.Imaging;
14
using System.Windows.Navigation;
15
using System.Windows.Shapes;
16
17
namespace SerialConsole
18
{
19
    /// <summary>
20
    /// Interaction logic for MainWindow.xaml
21
    /// </summary>
22
    public partial class MainWindow : Window
23
    {
24
        string RxString;
25
        static SerialPort serialPort1;
26
27
        public MainWindow()
28
        {
29
            InitializeComponent();
30
            serialPort1 = new SerialPort();
31
            serialPort1.Handshake = System.IO.Ports.Handshake.None;
32
            serialPort1.Parity = Parity.None;
33
            serialPort1.DataBits = 8;
34
            serialPort1.StopBits = StopBits.One;
35
            serialPort1.ReadTimeout = 500;
36
            serialPort1.WriteTimeout = 500;
37
            serialPort1.ReadBufferSize = 10000;
38
            serialPort1.WriteBufferSize = 10000;
39
40
            serialPort1.DataReceived += serialPort1_DataReceived;
41
42
        }
43
44
              
45
46
47
        private void buttonStart_Click(object sender, RoutedEventArgs e)
48
        {
49
            serialPort1.PortName = "COM15";
50
            serialPort1.BaudRate = 115200;
51
52
            serialPort1.Open();
53
54
            if (serialPort1.IsOpen)
55
            {
56
                buttonStart.IsEnabled = false;
57
                buttonStop.IsEnabled = true;
58
                textBox1.IsReadOnly = false;
59
60
            }
61
        }
62
63
        private void buttonStop_Click(object sender, RoutedEventArgs e)
64
        {
65
            if (serialPort1.IsOpen)
66
            {
67
                serialPort1.Close();
68
                buttonStart.IsEnabled = true;
69
                buttonStop.IsEnabled = false;
70
                textBox1.IsReadOnly = true;
71
            }
72
        }
73
74
75
76
        private void textBox1_KeyUp(object sender, KeyEventArgs e)
77
        {
78
            // If the port is closed, don't try to send a character.
79
            if (!serialPort1.IsOpen) return;
80
81
           // MessageBox.Show("COM is open");
82
83
            // If the port is Open, declare a char[] array with one element.
84
            char[] buff = new char[1];
85
86
            // Load element 0 with the key character.
87
            buff[0] = Convert.ToChar(e.Key);
88
89
            // Send the one character buffer.
90
            serialPort1.Write(buff, 0, 1);
91
92
            // Set the KeyPress event as handled so the character won't
93
            // display locally. If you want it to display, omit the next line.
94
            e.Handled = true;
95
        }
96
97
98
99
100
        private void DisplayText(object sender, EventArgs e)
101
        {
102
            textBox1.AppendText(RxString);
103
        }
104
105
106
        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
107
        {            
108
            RxString = serialPort1.ReadExisting();
109
            Application.Current.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Background, new EventHandler(DisplayText));
110
        }
111
112
113
114
    }
115
}


1. Wenn ich auf den Start-Button klicke, weiss ich, dass COM15 
erfolgreich geöffnet wird (mittels MessageBox geseehen).

Danach passiert nichts. Ich würde erwarten, dass ständig empfangene 
Daten (von denen ich ja weiss, dass sie von der Gegenstelle versendet 
werden) in der Textbox ausgegeben werden.


2. Wenn ich jetzt mal etwas in die Textbox eintippe, erhalte ich 
folgende Fehlermeldung:
1
System.Reflection.TargetParameterCountException was unhandled
2
  _HResult=-2147352562
3
  _message=Parameteranzahlkonflikt.
4
  HResult=-2147352562
5
  IsTransient=false
6
  Message=Parameteranzahlkonflikt.
7
  Source=mscorlib
8
  StackTrace:

Hängen Punkt 1 und 2 miteinander zusammen?

Danke für Eure Hilfe.

hssig

von TK (Gast)


Lesenswert?

Hallo,

ich kann jetzt nicht direkt was mit den Fehlermeldungen anfangen, jedoch 
hatte ich vor einiger Zeit auch mal ein Problem mit COM >9. Ab COM10 
solltest Du mal folgenden String probieren:
serialPort1.PortName = "\\\\.\\COM15";
Das hatte bei mir geholfen.

Gruß
TK

von Hssig 7. (Gast)


Lesenswert?

Hallo TK,

danke für deine Antwort.

Wenn ich deine COM15-Schreibweise ausprobiere, so erhalte ich beim 
Klicken des Start-Button die Fehlermeldung "{"Der Anschlussname darf 
nicht mit \"\\\" beginnen.\r\nParametername: PortName"}.

Daher denke ich, dass meine Schreibweise schon OK war.


Gruß, hssig

von Marcus H. (Firma: www.harerod.de) (lungfish) Benutzerseite


Lesenswert?

Hast Du Unicode Strings?
Was Du schreiben willst ist "\\.\COM15".
Bei C++ mit 8bit-char sieht das halt aus, wie TK geschrieben hat - 
"\\\\.\\COM15".
Probier mal die Version, wie in der zwoten Zeile geschrieben.

Grüße,
 Marcus

von Hssig 7. (Gast)


Lesenswert?

Hallo Markus,


>"\\.\COM15".
>>Error  1  Unrecognized escape sequence


Wie gesagt, das scheint ja nicht das Problem zu sein, weil
"serialPort1.IsOpen"



Gruß, hssig

von Peter II (Gast)


Lesenswert?

Hssig 7. schrieb:
> Wie gesagt, das scheint ja nicht das Problem zu sein, weil
> "serialPort1.IsOpen"

das denke ich auch.

mache doch einfach mal ein Read ohne Event.
1
serialPort1 = new SerialPort();
2
serialPort1.Handshake = System.IO.Ports.Handshake.None;
3
serialPort1.Parity = Parity.None;
4
serialPort1.DataBits = 8;
5
serialPort1.StopBits = StopBits.One;
6
serialPort1.ReadTimeout = 500;
7
serialPort1.WriteTimeout = 500;
8
serialPort1.ReadBufferSize = 10000;
9
serialPort1.WriteBufferSize = 10000;
10
serialPort1.PortName = "COM15";
11
serialPort1.BaudRate = 115200;
12
serialPort1.Read(...)

von Marcus H. (Firma: www.harerod.de) (lungfish) Benutzerseite


Lesenswert?

Hssig 7. schrieb:
>>"\\.\COM15".
>>>Error  1  Unrecognized escape sequence
> Wie gesagt, das scheint ja nicht das Problem zu sein, weil
> "serialPort1.IsOpen"

Danke für die Rückmeldung. War nur so eine Vermutung, weil ein Kollege 
die Tage das Problem hatte. Marcus

von c-hater (Gast)


Lesenswert?

Hssig 7. schrieb:

>         private void serialPort1_DataReceived(object sender,
> System.IO.Ports.SerialDataReceivedEventArgs e)
>         {
>             RxString = serialPort1.ReadExisting();
> 
Application.Current.Dispatcher.BeginInvoke(System.Windows.Threading.Disp 
atcherPriority.Background,
> new EventHandler(DisplayText));
>         }

Das ist kompletter Schwachsinn. Sehr wahrscheinlich irgendwoher aus dem 
I-Net ohne jedes Verständnis des Sachverhaltes per C&P übernommen...

Auch nur die minimalste Andeutung eigenständigen Denkens sollte 
zumindest diese Frage produzieren: Was passiert hier eigentlich mit 
"RxString", was ja die begehrten Inhalte von der Quelle in's Ziel 
transportieren sollte...

OMG, wo soll das alles noch enden...

von Hssig 7. (Gast)


Lesenswert?

>Auch nur die minimalste Andeutung eigenständigen Denkens sollte
>zumindest diese Frage produzieren:

Die Frage wurde produziert ;-)


Ich habe mal das mit dem Threading ersteinmal weggelassen, hier der 
geänderte Ansatz, bei dem ich mit jedem Event "serialPort1_DataReceived" 
eine Funktion (über Delegate) aufrufe, in der "RxString" ausgegeben 
wird.
Ich sehe leider immer noch keine Daten, nachdem ich den COM-Port 
geöffnet habe.

Hier der Code:
1
using System;
2
using System.IO.Ports;
3
using System.Collections.Generic;
4
using System.Linq;
5
using System.Text;
6
using System.Threading.Tasks;
7
using System.Windows;
8
using System.Windows.Controls;
9
using System.Windows.Data;
10
using System.Windows.Documents;
11
using System.Windows.Input;
12
using System.Windows.Media;
13
using System.Windows.Media.Imaging;
14
using System.Windows.Navigation;
15
using System.Windows.Shapes;
16
17
namespace SerialConsole
18
{
19
    /// <summary>
20
    /// Interaction logic for MainWindow.xaml
21
    /// </summary>
22
    public partial class MainWindow : Window
23
    {
24
        string RxString;
25
        static SerialPort serialPort1;
26
27
        private delegate void Display(string s);
28
29
        public MainWindow()
30
        {
31
            InitializeComponent();
32
            serialPort1 = new SerialPort();
33
            serialPort1.Handshake = System.IO.Ports.Handshake.None;
34
            serialPort1.Parity = Parity.None;
35
            serialPort1.DataBits = 8;
36
            serialPort1.StopBits = StopBits.One;
37
            serialPort1.ReadTimeout = 500;
38
            serialPort1.WriteTimeout = 500;
39
            serialPort1.ReadBufferSize = 10000;
40
            serialPort1.WriteBufferSize = 10000;
41
            serialPort1.Encoding = Encoding.Default;
42
43
            serialPort1.DataReceived += serialPort1_DataReceived;
44
45
            
46
47
        }
48
49
              
50
51
52
        private void buttonStart_Click(object sender, RoutedEventArgs e)
53
        {
54
            serialPort1.PortName = "COM15";            
55
56
            serialPort1.BaudRate = 115200;
57
58
            serialPort1.Open();
59
60
            if (serialPort1.IsOpen)
61
            {
62
                buttonStart.IsEnabled = false;
63
                buttonStop.IsEnabled = true;
64
                textBox1.IsReadOnly = false;
65
66
            }
67
        }
68
69
        private void buttonStop_Click(object sender, RoutedEventArgs e)
70
        {
71
            if (serialPort1.IsOpen)
72
            {
73
                serialPort1.Close();
74
                buttonStart.IsEnabled = true;
75
                buttonStop.IsEnabled = false;
76
                textBox1.IsReadOnly = true;
77
            }
78
        }
79
80
81
82
        private void textBox1_KeyUp(object sender, KeyEventArgs e)
83
        {
84
            // If the port is closed, don't try to send a character.
85
            if (!serialPort1.IsOpen) return;
86
87
           // MessageBox.Show("COM is open");
88
89
            // If the port is Open, declare a char[] array with one element.
90
            char[] buff = new char[1];
91
92
            // Load element 0 with the key character.
93
            buff[0] = Convert.ToChar(e.Key);
94
95
            // Send the one character buffer.
96
            serialPort1.Write(buff, 0, 1);
97
98
            // Set the KeyPress event as handled so the character won't
99
            // display locally. If you want it to display, omit the next line.
100
            e.Handled = true;
101
        }
102
103
104
105
106
        //private void DisplayText(object sender, EventArgs e)
107
        //{
108
        //    textBox1.AppendText(RxString);
109
        //}
110
111
        private void DisplayText(string s)
112
        {
113
            textBox1.AppendText(RxString);
114
        }
115
116
117
        
118
119
120
        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
121
        {
122
            Display myDisplay = new Display(DisplayText);
123
            RxString = serialPort1.ReadExisting();
124
            //Application.Current.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Background, new EventHandler(DisplayText));
125
            myDisplay(RxString);            
126
        }
127
128
129
130
    }
131
}

Gruß, hssig

von nicht"Gast" (Gast)


Lesenswert?

was sagt denn der Debugger?

wird serialPort1_DataReceived überhaupt angesprungen und wenn jam was 
steht denn nach dem Lesevorgang in deinem RxString drin?

von Hssig 7. (Gast)


Lesenswert?

Hallo,

der Debugger zeigt, dass "serialPort1_DataReceived" und "RxString" auch 
mit (richtigem) Inhalt gefüllt wird, dennoch sehe ich keinen Inhalt in 
der Textbox.


Gruß, hssig

von c-hater (Gast)


Lesenswert?

Hssig 7. schrieb:

> Die Frage wurde produziert ;-)

Selbst wenn ich das tatsächlich glauben würde (was ich nicht tue): Das 
wäre nur ein sehr kleiner Lichtblick.

Denn: Die unmittelbare Konsequenz wäre, sich die Funktionsweise und 
Anwendung von Delegaten reinzuziehen. Was du ganz offensichtlich nicht 
getan hast...

Und nein: es würde dir nicht wirklich nützen, wenn ich dir den 
korrekten Quelltext für dein konkretes Problem vorbeten würde. Deswegen 
tue ich das auch nicht. Ich weise dich aber gern darauf hin, daß es 
schätzungweise einige zehntausend Codebeispiele zu dieser Sache im 
Internet gibt. Du mußt einfach nur diesen Scheiß (ein Stück weit) 
durcharbeiten, um das KONZEPT zu begreifen. Hast du das erstmal 
tatsächlich begriffen, kannst du dir den Rest der Lektüre sparen, denn 
dann bist du erstmal in der Lage, jegliche Delegaten korrekt zu 
deklarieren und ihre Implementierungen korrekt mit Parametern zu 
füttern.

Dann bleibt nur noch eins: Die Sache auch noch multithreaded mit 
Invoke/BeginInvoke umzusetzen. Das ist dann vergleichweise sehr trivial, 
denn die Methoden benötigen nur die Adresse des Delegaten und dessen 
Parameterliste als Object-Array. Das bereitzustellen erfordert dann 
endgültig nur noch einen kleine Auswahl absolut grundlegender 
Sprachkentnisse.

Die du hoffentlich hast oder bereit bist, mit Schweiß und Tränen zu 
erwerben. Von nix kommt nix...

von Hssig 7. (Gast)


Lesenswert?

c-Hater,

du musst dich an der Diskussion nicht beteiligen.

Mein zuletzt geszeigter Code stellt doch eine Diskussionsgrundlage dar.
Die Thread-Geschichte habe ich wie gesagt rausgenommen und werde ich mir
später nochmal antun. Wie gesagt ...

Kann jemand mir einen Tipp geben, wieso der Inhalt von RxString nicht in
der Textbox ausgegeben wird?

Gruß, hssig

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.