Entwickler-Ecke

IO, XML und Registry - Serielle Schnittstelle: Nicht alle Daten kommen an!


andy11 - Fr 21.05.10 21:09
Titel: Serielle Schnittstelle: Nicht alle Daten kommen an!
ich habe mir HERCULES runtergeladen und habe mal die Daten, die ich vom STK500, über die ein ATMEGA16 Daten zurückschickt, bekomme ausgelesen.
Dann habe ich gestoppt und mit meinem Programm ausgelesen.
Siehe da: Es kommen genau die Hälfte der Daten an. Dh: ein Wert wird immer ausgelassen, aber wieso`?
Es kann einmal nicht and der Hardware liegen und alle EInstellungen vom HERCULES stimmen mit meinem Programm überein.
Irgend eine Idee was da der Hund sein kann?

lg andy


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
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.Threading;

namespace SerielleSchnitschtelle
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            CheckForIllegalCrossThreadCalls = false//Da sonst: Ungültiger threadübergreifender Vorgang
        }

        private void cmdclose_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void cmdReceive_Click(object sender, EventArgs e)
        {
            serialPort1.BaudRate = Convert.ToInt16(cBBaud.Text);    //übernehme neue Einstellungen
            serialPort1.PortName = cBSchnitt.Text;                  //port usw...
            Schluss = false;
            backgroundWorker1.RunWorkerAsync();
        }
        
        bool Schluss = false;   
        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            do
            {
                serialPort1.Open();
                rtxtReceive.Text += serialPort1.ReadLine() + "\n";
                serialPort1.Close();
            }
            while (Schluss != true);
        }

        private void cmdStop_Click(object sender, EventArgs e)
        {
            Schluss = true;
            backgroundWorker1.CancelAsync();
        }

        private void cmdClear_Click(object sender, EventArgs e)
        {
            rtxtReceive.Text = null;
        }

    }
}


Christian S. - Fr 21.05.10 22:46

Also, in einem BackgroundWorker den Port zu öffnen und zu schließen, das ist auf jeden Fall der falsche Weg.

Du öffnest den Port so lange Du Daten empfangen willst und erst wenn Du nichts mehr "hören" willst, schließt Du den Port. Währenddessen reagierst Du auf das DataReceived-Event des Ports. In dem rufst Du dann ReadLine auf.