Обмен данными по Ethernet между Arduino и Processing

Нет ответов
kipman
Offline
Зарегистрирован: 29.01.2019

Уважаемые форумчане, помогите решить следующую проблему.

Нужно организовать обмен массивами данных по Ethernet между Arduino с Ethernet Shield W5100 и оболочкой на ПК, написанной в Processing. Нужно чтобы данные обновлялись раз в секунду. Упрощенный вариант скетчей привожу ниже. Значение счетчика заносится в массив и пересылается клиенту, клиент пересылает обратно значения своего счетчика.

Ардуино

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


byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(10, 100, 0, 72);
EthernetServer server(80);

byte sendBytes[] = {0, 15};
byte receiveBytes[] = {0,0};
long lastTime = 0;
byte count = 0;
void setup() 
{
  Serial.begin(9600);
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}

void loop() {
 EthernetClient client = server.available();
  if (client)
  {
    Serial.println("New Client Connected:");
    while (client.connected())
    {
      if (client.available())
      {
        byte dataSize = client.available(); 
        Serial.print("Data size is ");
        Serial.println(dataSize);
        for (byte m = 0; m <= 2; m++)
        {
         receiveBytes[m] = client.read();
         if (m==1)
        { 
        Serial.println("DATA RECEIVED");
        
        client.write(sendBytes,HEX);
        client.stop();
        break;
        }
       }
    }
  }
  }

 Serial.print("Receive Bytes = ");
 for (byte i = 0; i<2; i++)
 {
  Serial.print(receiveBytes[i]);
 }
 Serial.println(" | ");
  Serial.print("Send Bytes = ");
 for (byte j = 0; j<2; j++)
 {
 Serial.print(sendBytes[j]);
 }
Serial.println(" | ");
delay(500);
long now = millis();

if (now > (lastTime + 1000))
{
  count = count +1;
  lastTime = now;
}
if (count == 127)
count = 0;

sendBytes[1] = count; 

}

Processing

import processing.net.*;
byte sendByte[] ={0,8};
byte[] receiveByte = new byte[2];
int count = 0;
long lastTime = 0;

Client MyClient;

void setup()
{
  size(800,600);
  textSize(20);
} 

void draw()
{
  background(0);
  MyClient = new Client(this, "10.100.0.72",80);
  MyClient.write(sendByte); 
  delay(100);
  if (MyClient.available() > 0) 
   { 
     for (int i = 0; i<2; i++)
     receiveByte[i] = byte(MyClient.read());
     fill(100);
     text("MyClient Available",100,400);
   }
   delay(100);
   MyClient.stop();
   fill(250);
   text("sendBytes =", 50,100);
   text("receiveBytes =", 50,200);
   fill(250,250,0);
   for (int i = 0; i<2; i++)
   {
    text(sendByte[i], 200+i*30,100);
    text(receiveByte[i], 200+i*30,200);
   }
long now = millis();
if (now > (lastTime + 1000))
{
  count = count +1;
  lastTime = now;
}
if (count==127)
count = 0;
sendByte[1] = byte(count);
}

 

Проблема заключается в следующем - данные с ПК на Ардуино передаются без проблем, а вот в обратном направлении массив обновляется раз в 5-30 секунд, и промежутки времени все время разные. Бъюсь уже неделю, перепробовал разные варианты, но пока прогресса не добился. Помогите, пожалуйста, советом.