Arduino-ESP32连接WiFi对客户端和服务端进行TCP传输代码

3 篇文章 0 订阅
1 篇文章 0 订阅
流程

1.服务端设置WiFi热点账号密码。
2.服务端设置自身的IP和端口号。
3.客户端连接服务端的WiFi热点。
4.客户端通过服务端的IP和端口号建立TCP连接。
5.数据传输

下面的例子在 串口(URAT)—客户端----服务端----串口(URAT)是双向通的。

客户端TCP传输

#include <Arduino.h> //引用以使用ETH
#include <WiFiUdp.h> 
#include <WiFi.h>
#include <WiFiClient.h>
#include <HTTPClient.h>

#define MAX_SRV_CLIENTS 20
const char* ssid = "SSID_Board_Number_3"; //设置自身WiFi热点账号
const char* password = "12345678";  //设置自身WiFi热点密码
uint8_t str[]={"Happy New Year !"}; //给客户端传输的数据

uint8_t Client_Counts; //连接的客户端数量

WiFiServer server(8086); //设置服务端端口号
WiFiClient serverClients[MAX_SRV_CLIENTS];
String aa = "";//接收到客户端的数据
char Send[256]={0};
char Rece[128]={0};
char SN[]={1,7,7,3,6,3,9,4,8,8,4};

  IPAddress staticIP(192, 168, 4, 1);
  IPAddress gateway(192, 168, 4, 1);
  IPAddress subnet(255, 255, 255, 0);
  //IPAddress dns(192, 168, 0,1);
void setup() 
{
  
  Serial.begin(115200);   
  WiFi.mode(WIFI_AP);     //WiFi配置为AP模式
  
  if(WiFi.softAPConfig(staticIP, gateway, subnet)==false)// 设置静态IP地址
  {
    Serial.println("Configuration failed.");
  }
  
  IPAddress ip = WiFi.softAPIP(); // 获取AP的IP地址
  WiFi.softAP(ssid, password,1,0,4); //设置热点为显现,最大连接数量为4,生成WiFi热点
  //Serial.print("IP address: ");      
  Serial.println(WiFi.softAPIP());   // 显示IP地址
  server.begin();
  
}

void loop() 
{
  static uint16_t Rece_count;
  uint8_t i,j;
  //检测服务器端是否有活动的客户端连接
  if (server.hasClient()) //检测是否有客户端连接
  {
     
      //查找空闲或者断开连接的客户端,并置为可用
      if (!serverClients[Client_Counts] || !serverClients[Client_Counts].connected())
      {
        if(serverClients[Client_Counts]) serverClients[Client_Counts].stop();
        serverClients[Client_Counts] = server.available();
        Serial.print("New client: "); Serial.println(Client_Counts);
        Client_Counts++;

      }
    //若没有可用客户端,则停止连接
    WiFiClient serverClient = server.available();
    serverClient.stop();
  }
  j=0;
  while(Serial.available())  //接收串口发过来的数据
  { // 检查是否有数据可读
    Send[j++] = Serial.read(); // 读取串口数据
    
   // Serial.print("Received: ");
    //Serial.println(data); // 打印接收到的数据
  }
  delay(2);
  if(j>0)
  {
      for(i=0;i<Client_Counts;i++)
    {
      serverClients[i].write(Send,j); //通过TCP发送串口接收的数据给客户端
    }
  }
  
  
  serverClients[i].write(SN,11);//发送SN码
  for(i = 0; i < Client_Counts; i++)  //轮询前面连接的所有客户端
  {

    if (serverClients[i] && serverClients[i].connected()) //看是否还保持连接
    {
      /*count++;
      if(count==2000)
      {
        count=0;
        serverClients[i].write(SN,11);
      }*/
      
      
      if(serverClients[i].available())  //检测是否有客户端数据
      {
        while(serverClients[i].available())//接收客户端数据
        {
           Rece[Rece_count++]= serverClients[i].read();
           if(i==128)
         {
            break;
         }
        }
        
        delay(2);
        //Serial.println(aa);
        //serverClients[i].write(Rece,j);
        //serverClients[i].write(SN,11);
     }
     if(Rece_count>0)
    {
       Serial.write((byte*)&Rece, Rece_count); //把收到的客户端数据发给串口
    }
    Rece_count=0;
   }
  }

 /* WiFiClient client = server.available();
  if (client) 
  {
    while (client.connected())
     {
      if (client.available()) 
      {
        char c = client.read();
        // Handle client data here
        Serial.println(c);
      }
    }
  }
    delay(500);
    client.write(str,16);
    
    while (client.available())
    {
      Serial.println("Connected");
      char val = client.read();
      Serial.print("val:");
      Serial.println(val);
        if(val=='a')
        {
   
      delay(1000);
     
    client.print("bb");
    client.flush();
        }
    }  */
  
}
客户端TCP传输

#include <Arduino.h> //引用以使用ETH
#include <WiFiUdp.h> 
#include <WiFi.h>
#include <WiFiClient.h>
#include <HTTPClient.h>

#define MAX_SRV_CLIENTS 10
const char* ssid = "SSID_Board_Number_3"; //服务端的热点账号
const char* password = "12345678"; //服务端的热点密码
//uint8_t str[]={"Happy New Year !"};
const char *host = "192.168.4.1";//要连接的tcp服务端地址
WiFiClient client;
const int tcpPort = 8086;//要连接的服务端的端口号
uint8_t str[]={"client2"};
uint8_t Rece[256]={0};
uint8_t Send[128]={0};

  IPAddress staticIP(192, 168, 5, 12);
  IPAddress gateway(192, 168, 5, 12);
  IPAddress subnet(255, 255, 255, 0);
  IPAddress dns(192, 168, 0,1);
void setup() 
{
  // 设置静态IP地址
  Serial.begin(115200);//打开串口(URAT)   
  WiFi.mode(WIFI_STA);     //配置为STA模式
  //WiFi.setSleep(false); //关闭STA模式下wifi休眠,提高响应速度
  /*if(WiFi.config(staticIP, gateway, subnet, dns, dns)==false)
  {
    Serial.println("Configuration failed.");
  }*/
  /*IPAddress ip = WiFi.localIP(); // 获取AP的IP地址
  Serial.print("IP address: ");      
  Serial.println(WiFi.localIP());   // 显示IP地址*/
  WiFi.begin(ssid, password);//连接WiFi热点
   while (WiFi.status() != WL_CONNECTED) //等待WiFi热点连接成功
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println("WiFi connected");
  while (!client.connected())//开始连接tcp服务器
    {
        if (!client.connect(host, tcpPort))
        {
            Serial.println("connection....");
            //delay(5);
 
        }
    }
     Serial.println("TCP connected Succeed");
}

void loop()
{
  static uint8_t i,j;
  static uint16_t count;
  
    while(Serial.available())  // 检查是否有数据通过串口发过来
  { 
    Send[j++] = Serial.read(); // 读取数据
    
   // Serial.print("Received: ");
    //Serial.println(data); // 打印接收到的数据
  }
  if(j>0)
  {
    client.write(Send,j); //把从串口收到的数据发送给服务端
    j=0;
  }
   
    /*if(count==20000)
    {
      count=0;
      client.write(str,7);
    }
    count++;*/
    
    while (client.available())  //检测服务端是否有数据发过来
    {
      //Serial.println("Connected");
      Rece[i++] = client.read();//接收服务端发过来的数据
      //Serial.println(Rece[i]);
      if(i==256)
      {
        break;
      }
    }  
    if(i>0)
    {
      Serial.write((byte*)&Rece, i); //把接收到的服务端的数据发送给串口
    }
    
    /*for(j=0;j<i;j++)
    {
      Serial.println(Rece[j]);
    }*/
    i=0;
}



注意不要用字符串的方式收数据,String response = clients[i].readStringUntil(‘\n’);这样回限制接收速度。误以为是发送方发的速度慢。
  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Arduino-ESP32ModbusRTU是一个基于Arduino平台和ESP32芯片的Modbus RTU通信协议库。Modbus RTU是一种常用的串行通信协议,用于在不同设备之间实现通信和数据交换。ESP32是一款强大的Wi-Fi和蓝牙芯片,具有丰富的资源和功能。 利用Arduino-ESP32ModbusRTU库,我们可以轻松地在ESP32上实现Modbus RTU通信功能。通过这个库,我们可以将ESP32作为Modbus RTU的主机或从机,并与其他Modbus RTU设备进行通信。在主机模式下,ESP32可以向其他设备发送Modbus RTU命令,并接收其响应。在从机模式下,ESP32可以接收其他设备发送的Modbus RTU命令,并作出相应的响应。 使用Arduino-ESP32ModbusRTU库,我们可以使用简单的代码实现Modbus RTU通信功能。我们可以指定串口用于与其他设备进行通信,并设置自己的Modbus地址。我们可以使用库提供的函数来读取和写入寄存器或线圈,以及进行其他Modbus操作。 Arduino-ESP32ModbusRTU库还支持异步通信功能,可以在不阻塞主线程的情况下进行Modbus通信操作。这使得我们可以同时处理其他任务,而不会影响Modbus通信的性能和稳定性。 总之,Arduino-ESP32ModbusRTU是一个方便实用的库,可以帮助我们在ESP32上实现Modbus RTU通信功能。无论是作为主机还是从机,通过这个库,我们可以轻松地与其他Modbus RTU设备进行数据交换和通信。 ### 回答2: arduino-esp32modbusrtu是一种基于Arduino开发平台和ESP32微控制器的Modbus RTU通信库。Modbus是一种通信协议,常用于工业自动化领域中的设备间通信。 arduino-esp32modbusrtu库为ESP32提供了实现Modbus RTU通信的功能,可以让ESP32作为Modbus RTU主机或从机来与其他设备进行通信。通过该库,用户可以轻松地对Modbus RTU数据进行读取和写入。 使用arduino-esp32modbusrtu库,用户首先需要在Arduino开发平台上导入该库,并在代码中包含相应的头文件。然后,需要设置串口参数,并创建一个Modbus RTU对象。用户可以根据需要选择将ESP32配置为主机或从机,并指定Modbus设备的地址。 在主机模式下,用户可以使用ModbusRTUMaster类的方法来发送读取或写入请求,并获取设备的响应。用户可以指定读取或写入的寄存器地址以及读取的数量或写入的值。在从机模式下,用户可以使用ModbusRTUSlave类的方法来处理主机的请求,并返回相应的数据。 arduino-esp32modbusrtu库提供了许多示例代码和详细的文档,帮助用户快速上手,并实现其Modbus RTU通信需求。使用该库,用户可以自定义设置通信参数、处理各种Modbus功能码,并与其他Modbus RTU设备进行稳定可靠的通信。 总之,arduino-esp32modbusrtu是一款强大而灵活的Modbus RTU通信库,为基于ESP32的项目提供了方便快捷的Modbus功能支持。 ### 回答3: Arduino-ESP32ModbusRTU是一种基于ESP32微控制器的Modbus RTU通信协议库。该库允许使用Arduino编程语言和开发工具与Modbus RTU设备进行通信。 Modbus RTU是一种在串行通信介质上实现的开放式通信协议。使用Modbus RTU协议,可以实现数据在不同设备之间的传输和控制。通常,Modbus RTU是在RS485物理层上实现的,允许多个设备共享通信线路。 Arduino-ESP32ModbusRTU库通过处理Modbus RTU帧格式,实现了Master和Slave两种角色的操作。作为Master,ESP32可以通过发送请求到Slave设备来读取或写入数据。而作为Slave,ESP32可以接收Master设备发送的请求,并根据请求进行数据读取或写入。 使用Arduino-ESP32ModbusRTU库,我们可以通过Arduino编程语言轻松地实现Modbus RTU通信。我们可以设定串行通信参数(如波特率、数据位、停止位等),并使用预定义的函数来读取或写入Modbus寄存器中的数据。此外,该库还支持不同种类的Modbus寄存器,如输入寄存器、保持寄存器、线圈和离散输入寄存器。 总结而言,Arduino-ESP32ModbusRTU库为我们提供了一种简单而高效的方式来实现ESP32与其他Modbus RTU设备之间的通信。无论是作为Master还是Slave,ESP32都可以通过这个库与Modbus RTU设备进行数据的读取和写入。这个库的使用使得我们可以很方便地将ESP32应用于各种Modbus RTU通信场景中,如工业自动化、设备监控等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值