Hallo Leute
ich sitze gerade an einem Programm mit GUI, welches eine menge Daten per
Serial Port einlesen soll. Leider hängt es bei mir immer wieder an der
Datenrate. Um dies besser zu untersuchen, habe ich den betreffenden code
in eine extra konsolen Anwendung gepackt:
1 | class UART_c
|
2 | {
|
3 | private SerialPort sport;
|
4 | private Thread arbeterThreat;
|
5 | public bool RUN = true;
|
6 |
|
7 | public List<int> Liste = new List<int>();
|
8 |
|
9 | public UART_c()
|
10 | {
|
11 | arbeterThreat = new Thread(arbeiterMethode);
|
12 | arbeterThreat.Start();
|
13 | }
|
14 |
|
15 | public void Stop()
|
16 | {
|
17 | RUN = false;
|
18 | arbeterThreat.Join();
|
19 | StreamWriter sw = new StreamWriter(new FileStream("out.txt", FileMode.OpenOrCreate));
|
20 | for (int i = 0; i < Liste.Count; i = i + 3)
|
21 | {
|
22 | sw.WriteLine(Liste[i].ToString("0000") + " " + Liste[i + 1].ToString("0000") + " " + Liste[i + 2].ToString("0000"));
|
23 | }
|
24 | sw.Flush();
|
25 | sw.Close();
|
26 | }
|
27 |
|
28 | private void arbeiterMethode()
|
29 | {
|
30 | sport = new SerialPort("COM8", 500000, Parity.None, 8, StopBits.One);
|
31 | sport.DataReceived += new SerialDataReceivedEventHandler(dongleDatenEmpfangEvent);
|
32 | sport.Open();
|
33 | while(RUN)
|
34 | {
|
35 | Thread.Sleep(10);
|
36 | }
|
37 | sport.DataReceived -= new SerialDataReceivedEventHandler(dongleDatenEmpfangEvent);
|
38 | sport.Close();
|
39 | }
|
40 |
|
41 | private void dongleDatenEmpfangEvent(object sender, SerialDataReceivedEventArgs e)
|
42 | {
|
43 | SerialPort sp = (SerialPort)sender;
|
44 | int eins = sp.BytesToRead;
|
45 | byte[] bArry = new byte[sp.BytesToRead];
|
46 | int zwei = bArry.Length;
|
47 | sp.Read(bArry, 0, bArry.Length);
|
48 | //string zeichen = sp.ReadExisting();
|
49 | //int zwei = zeichen.Length;
|
50 | int drei = sp.BytesToRead;
|
51 |
|
52 | Liste.Add(eins);
|
53 | Liste.Add(zwei);
|
54 | Liste.Add(drei);
|
55 | }
|
56 | }
|
Am anderen Ende des Serieal Ports hängt ein einfacher Arduino Mega per
USB am Rechenr, der mit 500000 Baut Zeichenfolgen mit \n als endzeichen
sendet. Diese Zeichenfolgen sind im wechsel mal 60 bytes mal 50 bytes
lang.
Mit den integern eins zwei und drei dokumentiere ich die die Bufferlänge
der lesbaren Daten vor dem ausnlesen, die bufferlänge meiner
ausgelesenen Daten und die bufferlänge der lasbaren Daten nach dem
auslesen.
Mit folgendem Coode rufe ich die Methoden auf und lasse mir nachdem ich
zum abbrechen die Enter Taste gedückt habe die eins, zwei und drei werte
in eine Datei schreiben (in Methode Stop()):
1 | static void Main(string[] args)
|
2 | {
|
3 | UART_c uart = new UART_c();
|
4 | Console.ReadLine();
|
5 | uart.Stop();
|
6 | }
|
Jetzt zu den ergebnissen:
eins zwei drei
3968 3968 0000
1213 1281 2687
2687 2687 0000
1184 1249 2719
2719 2719 0000
1439 1502 1574
2466 2466 0000
1323 1383 2154
2443 2577 0008
0008 0008 0000
1490 1556 1797
2023 2070 0342
0342 0342 0000
0849 0951 1034
1304 1357 0381
0509 0566 0357
0483 0536 0427
0558 0558 0000
1468 1583 1023
1569 1630 0755
0755 0755 0000
1479 1539 1207
1495 1550 0879
0879 0879 0000
Und nun zu meinen Problem. Nach dem ersten dongleDatenEmpfangEvent sind
schon 3968 Zeichen im Buffer. Ok könnte sein, dass das Programm beim
Starten etwas braucht aber beim zweiten Event sind schon wieder mehr als
1000 Zeichen da. Dabei erwarte ich ja eigentlich nur knapp 100 Zeichen.
Ok vielleicht ist das Windows 10 System im Hintergrund etwas langsamer.
So könnte es passieren, dass das Event zwei oder drei Datenpakete (50er
oder 60er Zeichenfolge) später kommt aber doch nicht 20 oder 40
Datenpakete später. Schießlich abreite ich auf einem i7-4500U Prozessor,
da kann doch nich der popelige Arduino, der die Zeichenketten sich jedes
mal neu zusammenbaut, schneller sein?
Ist das C# so langsam oder habe ich ein Windows Resourcen Problem?