Autor Beitrag
GURKE deluxe
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 91
Erhaltene Danke: 1

Win 7 Home Premium x64, Win XP Home Edition v2002
C# Microsoft Visual C# 2010 Express
BeitragVerfasst: So 26.05.13 00:08 
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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 868
Erhaltene Danke: 144

Win7
VS 2013, VS2015
BeitragVerfasst: So 26.05.13 01:01 
Probiere es mal damit: msdn.microsoft.com/d...ckets.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.

Für diesen Beitrag haben gedankt: GURKE deluxe
GURKE deluxe Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 91
Erhaltene Danke: 1

Win 7 Home Premium x64, Win XP Home Edition v2002
C# Microsoft Visual C# 2010 Express
BeitragVerfasst: So 26.05.13 01:11 
Ich habe jetzt bereits folgendes:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 868
Erhaltene Danke: 144

Win7
VS 2013, VS2015
BeitragVerfasst: 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:
ausblenden 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.