Hi,
ich versuche gerade mittels C# einen µC und meinen Computer zu
verbinden.
Ich habe ein funktionierendes Windows Programm und will dieses nun durch
ein eigenes Programm ersetzen.
Generell funktioniert es so, dass der PC am µC einen Parameter anfrägt
und der µC diese dann eben zurück sendet.
Das Problem hierbei ist, dass mein c#-Programm keine Daten empfängt.
Mit dem Oszi sehe ich aber, dass der µC auf meine Anfrage vom PC
antwortet.
Ich habe mal ein Bild angehängt. Oben sieht man die Kommunikation mit
der alten Originalprogramm, das funktioniert --> KEIN C#!
Unten ist mein c#-Programm welches nicht funktioniert. Es sieht für mich
so aus, als würde bei meinem Programm die Übertragunsrichtung vom
Com-Port nicht umgeschalten werden.
Sieht man glaub ganz schön daran, dass die Pegel der µC-Antwort zu klein
sind, hier arbeiten wohl die beiden Treiber gegeneinander, oder!?
Ich habe mal den relevanten code angehängt und die Fehlerbehandlung
heraus genommen damit es etwas übersichtlicher wird.
Könnt ihr erkennen woran das Problem liegt? mir ist nicht bekannt dass
ich nach serialPort.Write die Übertragungsrichtung manuell umschalten
muss, oder etwa doch!?
1 | private void InitComPort()
|
2 | {
|
3 | serialPort = new SerialPort(comStructure.PortName, comStructure.BaudRate, comStructure.Parity, comStructure.DataBits, comStructure.StopBits);
|
4 | serialPort.Handshake = this.comStructure.Handshake;
|
5 |
|
6 | serialPort.ReadTimeout = 500;
|
7 | serialPort.WriteTimeout = 500;
|
8 | serialPort.Open();
|
9 | }
|
10 |
|
11 |
|
12 | // Frägt eine Parameter am Gerät an und ließt Antwort nach einer Delayzeit aus.
|
13 | private Int32 ReadData(byte[] Data)
|
14 | {
|
15 | serialPort.Write(Data, 0, Data.Length); // sollten immer 5 bytes!?
|
16 |
|
17 | Thread.Sleep(50); // warte bis Antwort da ist
|
18 | return (GetResponse()); // lese Antwort und Prüfe Daten auf konsitenz
|
19 | }
|
20 |
|
21 |
|
22 |
|
23 |
|
24 |
|
25 | // Liest Empfangsbuffer aus nachdem ein Parameter vom PC beim Geber angefragt wurde (wird von 'ReadData()' aufgerufen)
|
26 | private Int32 GetResponse()
|
27 | {
|
28 | Int32 Value;
|
29 | int AnzBytes = serialPort.BytesToRead;
|
30 |
|
31 | byte[] u8aCommandBuffer = new byte[AnzBytes];
|
32 | serialPort.Read(u8aCommandBuffer, 0, AnzBytes);
|
33 |
|
34 |
|
35 | if (AnzBytes != 0x0a) // FEHLER!!! - Anzahl Empfangener Byts falsch!
|
36 | {
|
37 | LogWindows("Fehler bei Anzahl empfangener Bytes");
|
38 | return (0);
|
39 | }
|
40 |
|
41 |
|
42 | Value = u8aCommandBuffer[6]; // Byte 0...4 - senden, 5...9 Antwort (senden wird gespiegelt!)
|
43 | Value <<= 8; // Byte 5 Befehlsbyte wie senden (0x83, 0x81...)
|
44 | Value |= u8aCommandBuffer[7]; // Byte 9 Endbyte: immer 0x0d
|
45 | Value <<= 8;
|
46 | Value |= u8aCommandBuffer[8];
|
47 |
|
48 | return (Value);
|
49 |
|
50 | }
|
51 | }
|