TCP Kommunikation übertragung per char Frage

Moin,

ich versuche grade den unten stehenden Code zu verstehen. Ich bastle seit einiger Zeit an einem Routerbot (über ein Netzwerk gesteuerter Roboter) und habe dieses Beispiel gefunden. Es funktioniert auch, der Arduino ist der Server und mit dem Java Programm als Client kann ich auch eine Verbindung aufbauen. An den Text, den der Client an den Server schickt, wird ein "You said:" angehängt und der Server schickt es dem Client zurück. Das wird auch korrekt angezeigt.

Nur will ich den Sketch jetzt so verändern, dass man die Werte eines Joysticks im Javaprogramm ausließt, diese dann in eine einzige Nachricht packt (Wert1#Wert2#Wert3#Wert4) und das dann an den Arduino schickt. Der Arduino soll dann die Werte wieder auseinander nehmen und die einzelnen Werte auf die analogen Ausgänge setzen. Daran sind 4 Transistoren (TIP120), mit denen man die 4 Motoren steuern kann. So weit so gut.

Jetzt versuche ich grade erstmal eine Nachricht vom Java Client an den Arduino Server zu schicken und diese dort auf einen Außgang zu setzen. Z.b. ich gebe im Java Programm 256 ein und der Arduino steuert den Motor voll an, ich gebe 100 ein und der Arduino steuert den Motor zu 40% an. Der Rest soll nach und nach kommen.

Leider habe ich das mit dem Empfangen und dem char nicht wirklich verstanden. char ist doch nur ein einzelnes Zeichen oder? Wie kann ich denn dann mit char c = client.Read(); die Empfangene Nachricht speichern? Packt man die Zeichen nach und nach in den String (clientMsg+=c;)? Leider tut sich bei meinem Sketch weiter unten garnichts. Transistor und Motor sind korrekt angeschlossen, direkt angesteuert funktioniert das.

Der originale Sketch:

Java:

import java.io.*;
import java.net.*;
 
class Client
{
    //Ip Adress and Port, where the Arduino Server is running on
    private static final String serverIP="192.168.195.214";
    private static final int serverPort=8888;
 
     public static void main(String argv[]) throws Exception
     {
          String msgToServer;//Message that will be sent to Arduino
          String msgFromServer;//recieved message will be stored here
 
          Socket clientSocket = new Socket(serverIP, serverPort);//making the socket connection
          System.out.println("Connected to:"+serverIP+" on port:"+serverPort);//debug
          //OutputStream to Arduino-Server
          DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
          //BufferedReader from Arduino-Server
          BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));//
 
          msgToServer = "Hello Arduino Server";//Message tha will be sent
          outToServer.writeBytes(msgToServer+'\n');//sending the message
          System.out.println("sending to Arduino-Server: "+msgToServer);//debug
          msgFromServer = inFromServer.readLine();//recieving the answer
          System.out.println("recieved from Arduino-Server: " + msgFromServer);//print the answer
 
          clientSocket.close();//close the socket
          //don't do this if you want to keep the connection
     }
}

Arduino:

#include <SPI.h>
#include <Ethernet.h>
 
// Enter a MAC address, IP address and Portnumber for your Server below.
// The IP address will be dependent on your local network:
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress serverIP(192,168,195,214);
int serverPort=8888;
 
// Initialize the Ethernet server library
// with the IP address and port you want to use
EthernetServer server(serverPort);
 
void setup()
{
  // start the serial for debugging
  Serial.begin(9600);
  // start the Ethernet connection and the server:
  Ethernet.begin(mac, serverIP);
  server.begin();
  Serial.println("Server started");//log
}
 
void loop()
{
  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
    String clientMsg ="";
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        //Serial.print(c);
        clientMsg+=c;//store the recieved chracters in a string
        //if the character is an "end of line" the whole message is recieved
        if (c == '\n') {
          Serial.println("Message from Client:"+clientMsg);//print it to the serial
          client.println("You said:"+clientMsg);//modify the string and send it back
          clientMsg="";
        }
      }
    }
    // give the Client time to receive the data
    delay(1);
    // close the connection:
    client.stop();
  }
}

So habe ich den Code verändert:

Java:

import java.io.*;
import java.net.*;
 
class main
{
    
    private static final String serverIP="192.168.2.123";
    private static final int serverPort=80;
    
 
     public static void main(String argv[]) throws Exception
     {
          String msgToServer;
          String msgFromServer;
 
          Socket clientSocket = new Socket(serverIP, serverPort);
          System.out.println("Connected to:"+serverIP+" on port:"+serverPort);


          DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());          
          BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));//
 
         
          msgToServer = "8";
          outToServer.writeBytes(msgToServer+'\n');
          System.out.println("sending to Arduino-Server: "+msgToServer);
          
          
     }
}

Arduino:

#include <SPI.h>
#include <Ethernet.h>
 


byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress serverIP(192,168,2,123);
int serverPort=80;
 
EthernetServer server(serverPort);
 
void setup()
{
 
  Ethernet.begin(mac, serverIP);
  server.begin();
  pinMode(9, OUTPUT);
 
}
 
void loop()
{
  
  EthernetClient client = server.available();
  if (client) {
    String clientMsg ="";
    while (client.connected()) {
      if (client.available()) {
        char c= client.read();

        clientMsg+= c;
       
        if (c == '\n') {
          
          int Wert = clientMsg.toInt();
          analogWrite(9, Wert);
          
          
        }
      }
    }
    
    delay(1);
    
    client.stop();
  }
}

Danke schonmal!

Gruß Philipp

Wenn du unbedingt auf der Arduino Seite String Objekte verwenden willst, sollte es (min. so ähnlich) gehen.

Eine mehrstellige Zahl aus aufeinanderfolgenden Zeichen im Bereich '0' .. '9'
kriegt man ganz ohne String mit

static int zahl;
zahl = zahl * 10 + c- '0';

Wenn man nicht weiss was passiert, hilft evtl. Serial.println...

Richtig spannend wird es erst, wenn du mit

msgToServer = "128";

testest.
Ein Zeichen sollte doch einfach sein, sagst du :wink: