SerialPort funktioniert nicht

Gast #4289595
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
Gast #4290715
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
Gast #4290794
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
Gast #4291489
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(...)
Gast #4291578
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...
Gast #4292194
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
Gast #4293286
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...
Gast #4293979
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren