Forum: PC-Programmierung C# SerialPort aus lesen


von Ben S. (theben)


Lesenswert?

Hallo,

ich arbeit gerade daran meinen Microkontroller mit dem PC zu verbinden.
Um eine Maschiene gescheit steuern zu können reichen mir die ganzen 
Terminal Programme nicht aus, drum wollte ich es mal mit einem Windows 
Forms in C# veruchen.

Ich habe jetzt ein Programm geschieben wo ich einen String in eine 
TextBox schreibe und dieser mit Enter drücken an den Microkontroller 
gesendet wird. Bis hier hin klappt alles. doch nun soll der 
Microkontroller eine bestätigung zurück senden aber nix passiert nur 
eine Fehlermeldung kommt:

Eine nicht behandelte Ausnahme des Typs "System.IO.IOException" ist in 
System.dll aufgetreten.

Zusätzliche Informationen: Der E/A-Vorgang wurde wegen eines Threadendes 
oder einer Anwendungsanforderung abgebrochen.

Mein coode:
1
private void textBox1_KeyDown(object sender, KeyEventArgs e)
2
        {
3
            if (e.KeyCode == Keys.Enter)
4
            {
5
                
6
                serialPort1.WriteLine(textBox1.Text);
7
               
8
                textBox1.Clear();
9
                
10
            }
11
        }
12
13
        private void Form1_Load(object sender, EventArgs e)
14
        {
15
            CheckForIllegalCrossThreadCalls = false;
16
            serialPort1.Open();
17
        }
18
19
        private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
20
        {
21
            label1.Text = serialPort1.ReadLine();
22
        }

von Peter II (Gast)


Lesenswert?

Ben S. schrieb:
> Eine nicht behandelte Ausnahme des Typs "System.IO.IOException" ist in
> System.dll aufgetreten.

dann behandle doch mal die Ausnahme und lies die Fehlermeldung aus.

von Ben S. (theben)


Lesenswert?

ich bin mit c# noch nicht so dicke.
wie mach ich das?

von Peter II (Gast)


Lesenswert?

Ben S. schrieb:
> ich bin mit c# noch nicht so dicke.

dann sollte du erstmal anfangen die Sprache zu lernen, lies das Kapitel 
über ExceptionHandling.

von Arc N. (arc)


Lesenswert?

Ben S. schrieb:
> ich bin mit c# noch nicht so dicke.
> wie mach ich das?

In dem Fall gar nicht...
Fehlerursache ist, wie in dem anderen Thread vor einigen Wochen
Beitrag "Serielle Daten empfangen mit C#"

- DataReceived wird aufgerufen, wenn Daten vorhanden sind
- DataReceived läuft in einem (eigenen) Thread,
- ReadLine blockiert den Thread in dem DataReceived läuft
- Was passiert wenn jetzt neue Daten angekommen?

von bluppdidupp (Gast)


Lesenswert?

CheckForIllegalCrossThreadCalls = false;
...das hätte MS niemals einbauen sollen ;D
http://kristofverbiest.blogspot.com/2007/02/simple-pattern-to-invoke-gui-from.html

von Ben S. (theben)


Lesenswert?

der Beitrag "Serielle Daten empfangen mit C#" hat ja nun das selbe 
problem schön das er geschafft hat das problem zu lösen aber selber 
nicht weis warum. der hat einfach nur noch mal alles neu programmiert 
und da hats geklappt. der einzige wesentliche unterschied zu zu meinem 
programm und seinem endprogramm ist nur die try catch anweisung. wenn 
ich die bei mir ein setzte kommt zwar keine fehlermeldung mehr aber die 
daten wurden immer noch nicht empfangen.

von Ben S. (theben)


Lesenswert?

hat noch jemand rat?

von Ben S. (theben)


Lesenswert?

Geschafft!!!
Seit 18:00 Uhr sitze ich an dem scheiß Programm und nun fehlt es an 
einem Zeichen. dem newline zeichen.

dachte es reicht wenn ich das Null zeichen 0x00 hinten mit an hänge doch 
das Programm funtzt nur wenn ich einen Zeichenvorschub verwende dem LF 
also 0x0A

Erfolgserlebniss für Heute gehabt. Ich geh jetzt penn...

von Arc N. (arc)


Lesenswert?

Ben S. schrieb:
> Geschafft!!!
> Seit 18:00 Uhr sitze ich an dem scheiß Programm und nun fehlt es an
> einem Zeichen. dem newline zeichen.
>
> dachte es reicht wenn ich das Null zeichen 0x00 hinten mit an hänge doch
> das Programm funtzt nur wenn ich einen Zeichenvorschub verwende dem LF
> also 0x0A
>
> Erfolgserlebniss für Heute gehabt. Ich geh jetzt penn...

http://msdn.microsoft.com/de-de/library/system.io.ports.serialport.newline.aspx

von DropsMan (Gast)


Lesenswert?

Hier ein kleines Beispiel mit C#, Forms, .Net4. Die benutzte Textbox 
muss natürlich in der Forms-Anwendung existieren.

1
using System;
2
using System.Windows.Forms;
3
using System.IO.Ports;
4
5
namespace SerialPortWinForms
6
{
7
  public partial class Form1 : Form
8
  {
9
    SerialPort myport;
10
    delegate void UpdateCallback(string s);
11
    
12
    public Form1()
13
    {
14
      InitializeComponent();
15
      myport = new SerialPort("com1", 9600);
16
      myport.DataReceived += OnDataReceived;
17
      myport.Open();
18
    }
19
20
    void OnDataReceived(object sender, SerialDataReceivedEventArgs e)
21
    {
22
      SerialPort sp = (SerialPort) sender;
23
      textBox1.Invoke(new UpdateCallback(this.UpdateTheTextbox), sp.ReadExisting());
24
    }
25
26
    void UpdateTheTextbox(string s)
27
    {
28
      textBox1.Text += s;
29
    } 
30
  }
31
}

DropsMan

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.