• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Решено Передача данных на компьютер по UDP

Abel

New member
Доброго времени суток! Есть скетч(1) Esp8266 который принимает данные от ардуино и передает их в браузер. Требуется передать это значение val в серийный порт по wi-fi. Я так понял, что с esp на пк значения будут передаваться по udp, а уже потом в серийный порт, но когда я пытаюсь использовать класс WiFiUDP компилятор выдает ошибку для платы Esp8266
(1)
Код:
#include <SoftwareSerial.h>
SoftwareSerial programSerial(10, 11);
int incomingByte = 0, incomingByte1 = 0;
char str[10];
char instr[10];

void setup() 
{
  programSerial.begin(57600);
  Serial.begin(57600);
}

void loop() 
{    
  int i = 0;
  incomingByte = analogRead(0);
  itoa(incomingByte, str, 10);//преобразуем incomingByte в символьный массив для передачи
  programSerial.write(str, sizeof str);
  while(programSerial.available()==0)
  {delay(1);}
  if(programSerial.available()>0)
  {
    while(programSerial.available()>0 && i<10)
    {
      delay(1);
      incomingByte1=programSerial.read();
      instr[i]=incomingByte1;
      i++;
    }
  }
  if(i!=0)
  {
    int val=atoi(instr);//преобразуем полученный из порта массив в число
    Serial.println(val);
  }
}

(2)
Код:
#include <SPI.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <WiFiServer.h>
#include <WiFiUdp.h>
#include <string.h>
int incomingByte = 0;
char str[10]; 
char outstr[10];  
const char* ssid = "ithome-nn.ru";
const char* password = "9519178980";

WiFiServer server(80);
WiFiUdp Udp;
void setup() 
{
  Serial.begin(57600);
  delay(10);  
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) 
  {delay(500);}
  server.begin();
  Udp.begin(5555);
}

void loop() 
{ 
  WiFiClient client = server.available();
  int i=0;
  while(Serial.available()==0)//ждем данных из порта
  {delay(1);}
  if(Serial.available()>0)
  {
    delay(1);
    while(Serial.available()>0 && i<10)
    {
      delay(1);
      incomingByte=Serial.read();
      str[i]=incomingByte;
      i++;
    }
  }
  if(i!=0)
  {
    int val=atoi(str);//преобразуем символьный массив str в число val 
    itoa(val, outstr, 10);//преобразуем число val в символьный массив для отправки
    Serial.write(outstr, sizeof outstr);
    String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\n<head>\r\n<meta http-equiv='Refresh' content='0.01' />\r\n";
    s += val;
    s += "</html>\n";
    Upd.beginPacket(Udp.remoteIP(), Udp.remotePort());
    Udp.write(outstr, sizeof outstr);
    Udp.endPacket();
    client.print(s);
    delay(1);
  }
}
Собственно вопрос: как организовать передачу значения val по wi-fi?
 

Maxim Zhuravlev

New member
У меня такой кусок кода отлично работает

Код:
unsigned long time_out;
memset(net_buffer, 0, 128);
net_buffer[0] = 0;
net_buffer[1] = 0;
net_buffer[2] = 0;
net_buffer[3] = mac[WL_MAC_ADDR_LENGTH - 6];
net_buffer[4] = mac[WL_MAC_ADDR_LENGTH - 5];
net_buffer[5] = mac[WL_MAC_ADDR_LENGTH - 4];
net_buffer[6] = mac[WL_MAC_ADDR_LENGTH - 3];
net_buffer[7] = mac[WL_MAC_ADDR_LENGTH - 2];
net_buffer[8] = mac[WL_MAC_ADDR_LENGTH - 1];
if (DEFAULT_DEBUG) {
Serial.print(" : ");
for (int i=0; i<9; i++) {
Serial.print(net_buffer[i], HEX);
Serial.print(":");
}
}
net_tube.beginPacket("192.......", localPort);
net_tube.write(net_buffer, 128);
net_tube.endPacket();
memset(net_buffer, 0, 128);
if (DEFAULT_DEBUG) {
Serial.println(" Sended ... ");
}
time_out = millis();
do {
  packetSize = net_tube.parsePacket();
   }
while ((packetSize != 128) or ((millis()-time_out) < 5000));

if (packetSize == 128) {
int len = net_tube.read(net_buffer, 128);
if (DEFAULT_DEBUG) {
Serial.print("...  : ");
for (int i=0; i<4; i++) {
Serial.print(net_buffer[i], HEX);
Serial.print(":");
}
}
if ((net_buffer[0] == 255) && (net_buffer[1] == 0) && (net_buffer[8] == (net_buffer[9] + net_buffer[10]))) {
scena = net_buffer[11];
}
else {
  scena=0;
}
}
else {
if (DEFAULT_DEBUG) {
Serial.print("Time Out ...  : ");
}
 
}

if (DEFAULT_DEBUG) {
Serial.print("  scena : ");
Serial.println(scena);
}
 
Сверху Снизу