Entwickler-Ecke

Netzwerk - TCP/IP - Daten senden


GURKE deluxe - So 26.05.13 00:08
Titel: TCP/IP - Daten senden
Hallo,
Ich habe mir ein AVR-NET-IO-Board gekauft. Dieses ist über LAN ansteuerbar. Dazu benutzt es TCP/IP.

Nun will ich ein Programm schreiben, dass dieses Board anschreibt. Um es zu steuern reichen einfache Befehle wie: "getadc 1". Ich habe keine Ahnung, wie sich das realisieren lässt und meine bisherige Internet-Recherche hat mich nur zu sehr großen relativ komplexen Programmen geführt.

Ich habe leider auch kein richtigen Ansatz, was ich in etwa machen soll, auf dem ich aufbauen könnte. Gibt es nicht eine einfache Möglichkeit, solch ein Befehl an das Board zu schicken und die Antwort als string direkt wieder abzuspeichern?

Schöne Grüße
Julian


jfheins - So 26.05.13 01:01

Probiere es mal damit: http://msdn.microsoft.com/de-de/library/system.net.sockets.tcpclient.aspx

Wahrscheinlich bekommst du die Strings aber nur byteweise, d.h. du musst selber dafür sorgen die Bytes zu sinnvollen Antworten zu gruppieren.


GURKE deluxe - So 26.05.13 01:11

Ich habe jetzt bereits folgendes:

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:
private static byte[] toASCIIArray(string s)
        {
            byte[] result = new byte[s.Length];
            for (int i = 0; i < s.Length; i++)
            {
                if (s[i] <= 0xFF)
                    result[i] = (byte)s[i];
            }
            return result;
        }

        private static void write(Stream stream, string s)
        {
            byte[] bytes = toASCIIArray(s);
            stream.Write(bytes, 0, bytes.Length);
        }

        private void bKomandoSenden_Click(object sender, EventArgs e)
        {
            TcpClient c = new TcpClient("192.168.178.77"50290);
            write(c.GetStream(), tbKomando.Text + "\r\n");
            NetworkStream s = c.GetStream();
            s.ReadTimeout = 1000;
            string Text = "";
            while ((Text += (char)s.ReadByte()).Last() != 13);
            MessageBox.Show(Text);
            c.Close();
        }


Das funktioniert soweit auch. Das Problem ist, wenn die Rückgabe mehr als eine Zeile hat, dann wird der Rest einfach weggelassen. Gibt es da eine gute Möglichkeit, herauszufinden, wann das Ende kommt?


jfheins - So 26.05.13 09:46

user profile iconGURKE deluxe hat folgendes geschrieben Zum zitierten Posting springen:
Das Problem ist, wenn die Rückgabe mehr als eine Zeile hat, dann wird der Rest einfach weggelassen.

Ja, kein Wunder. Hier liest du ja nur genau so lange ein, bis ein Zeilenumbruch (13) kommt:

C#-Quelltext
1:
while ((Text += (char)s.ReadByte()).Last() != 13);                    


Du musst dir da jetzt etwas überlegen. Ein Ansatz wäre: "Sobald ich 100ms nichts mehr empfangen habe, ist die Nachricht bestimmt zu Ende", da musst du dann schauen wann das read() mit dem Timeout zurückkommt. Ganz nett sind natürlich Trennzeichen, die Nahrichten trennen, und sonst nicht vorkommen. Ich weiß jetzt nicht wie viel Einfluss du auf die Gegenseite hast.