Probleme socket arduino wifi

Bonjour,
Je viens vers vous après avoir galéré un max

J'ai une arduino uno avec un shield wifi de la marque Cytron.
J'essaie de communiquer avec via une socket réseau.

Coté Recepteur (arduino) voici le code

#include <CytronWiFiShield.h>
#include <CytronWiFiServer.h>
#include <Servo.h>

//Wifi settings
#define ssid "ssid"
#define password "passwd" 
#define port 1234

//Hardware settings
#define pinServo 9

Servo servoMoteur;
ESP8266Server server(port);

String angle;
int angleInt;

void setup()
{
  Serial.begin(9600);
  if (!wifi.begin(2, 3))
  {
    Serial.println("WiFi shield not present");
    while (true)
    {
      // don't continue. Here we can put a reset function. 
      // The good way is to connect a wire output<->resetPin and set High/Low
    }       
  }
  
  Serial.println("trying to connect");
  while (!wifi.connectAP(ssid, password))
  {
    Serial.print(".");
  }
  Serial.print("Connected with ip : ");
  Serial.println(wifi.localIP());

  server.begin(); //Start listening
  servoMoteur.attach(pinServo);
  servoMoteur.write(0);
}

void loop() {
  ESP8266Client client = server.available(); //Get a connection
  if(client)
  {
    while(client.connected())
    {
      Serial.println(client.read());
    }
    Serial.println("disconnected");
  }
  //client.stop();
}

Pour le moment j'affiche juste ce que je recoit sur la socket.

Et coté emetteur j'ai fait un petit bout de code python (je l'ai aussi fait en C mais meme probleme)

import socket
import time
import asyncio

SERVER_IP = "192.168.0.107"
SERVER_PORT = 1234

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect((SERVER_IP, SERVER_PORT))

values = [45, 90, 180]
for value in values:
    client_socket.send(value.to_bytes(1, byteorder='big'))
    time.sleep(1)
client_socket.close()

Dans la theorie parfaite j'aimerais recevoir sur l'output de l'arduino 45, 90, 180

Mais, tel quel je recoit 45, 13, 10, -1, -1 puis disconnected
13 et 10 sont visiblement \r et \n.

Si je ne met pas de time.sleep() du tout,

je recoit
45 90 180 13 10 48 44 67 76 79 83 69 68 13 10

Ce qui peut se traduire par 45 90 180 \r \n 0,CLOSED \r \n

J'ai tester pas mal de choses differente mais je ne trouve rien de fonctionnel.

J'aimerais simplement émettre plusieurs valeurs, avec un delais entre chaque, et les recevoir proprement (pour les envoyer sur un servo)

Quelqu'un saurait ce qu'il se passe ?
Merci beaucoup

Je crois que ton shield communique avec l'ESP8266 via le port série, il faut donc supprimer les caractères de contrôle du port série, si ceux si ne t'intéresse pas.

Donc si tu utilise time.sleep, la fonction send, envois un paquet TCP/IP à chaque caractère.
Si tu enlève le time.sleep, il peut y avoir plusieurs send par paquet TCP/IP réellement envoyés.
Pour ce genre de chose, l'idéal, serait que tu envois une séquence pour être sur de ne pas confondre 0,C(48 44 67) avec une séquence qui t'intéresse.

Pourquoi avec le time.sleep() les données 90 et 180 ne sont pas envoyées ?

Bonjour ethamin

Tu as un exemple de la bibliothèque de comment recevoir cette chaîne,
String line = client.readStringUntil('\n');

Intégré dans ton programme, ça donne ceci (pas essayé en vrai):

	if(client)
	{
		String lineRx = client.readStringUntil('\n');
		lineRx.trim();     // Pour nettoyer les données reçues https://www.arduino.cc/reference/en/language/variables/data-types/string/functions/trim/

		int servo1 = lineRx[0];     // Extraction de la première valeur
		int servo2 = lineRx[1];     // Extraction de la 2ème valeur
		int servo3 = lineRx[2];     // Extraction de la 3ème valeur
	}
	while(client.available()>0)
	{
		client.flush();
	}

Avec lineRx[n] tu peux extraire la valeur sous forme numérique, de chaque caractère de la chaîne lineRx.

A+
Cordialement
jpbbricole

Je dirais que ce n'est pas forcément qu'elles ne sont pas envoyées, mais plutôt que c'est qu'elles ne sont pas lues.
Après comme ça, je ne sais pas trop pourquoi ESP8266Client pense qu'il y a une déconnection après le premier envois.
Tu pourrais modifier ton

Serial.println(client.read());

en

Serial.print("Data:");Serial.println(client.read());

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.