arduino双机通信新版本 (解决引脚不够用,专用于esp8266)

作用

实现将一个 arduino 中的多个 String 类型变量准确地传到另一个 arduino 中对应的多个 String 类型变量 
中。

接线图


(注意 TX 接另一个arduino的 RX !可以忽略图中的 LED )

代码

1 号机器

float data1=18.98;//要发送的数据
 float data2=56.73;//要发送的数据
 float data3=104.27;//要发送的数据

 float data4=0;//要接收的数据
 float data5=0;//要接收的数据
 float data6=0;//要接收的数据

void setup()
{

  Serial.begin(9600);//两机的波特率要求相同
}


void loop()
{
 transmit();//发送数据

 receive();//接收数据
     Serial.println(data4);//显示接收到的数据
      Serial.println(data5);//显示接收到的数据
      Serial.println(data6);//显示接收到的数据

}

void transmit(){


        Serial.print('a');
        Serial.print(data1);
        Serial.print('b');
        Serial.print(data2);
        Serial.print('c');
        Serial.print(data3);
        Serial.println('#');
        delay(100);
        //发送"a数据1b数据2c数据3#"的字符串必须停顿100毫秒

  }

void receive(){

  String comdata = "";//存放接收到的原始字符串
  String buf1="";//存放解析出的第一个字符串
  String buf2="";//存放解析出的第二个字符串
  String buf3="";//存放解析出的第三个字符串

    while (Serial.available() > 0)  
    {
        comdata += char(Serial.read());
        delay(2);//一个一个接收数据,每次停顿2毫秒
    }
    if (comdata.length() > 0)//如果有数据收到
    {
      int ja,jb,jc,jd;//存放收到的字符串中标志字母的下标

for(int i = 0; i < comdata.length(); i++){

  if(comdata[i]=='a'){ja=i;}
  if(comdata[i]=='b'){jb=i;}
  if(comdata[i]=='c'){jc=i;}
  if(comdata[i]=='#'){jd=i;}

  }//找到约定标志字母的下标

 for(int k=ja+1;k<jb;k++){
  buf1+=char(comdata[k]);
  }
  for(int k=jb+1;k<jc;k++){
  buf2+=char(comdata[k]);
  }
  for(int k=jc+1;k<jd;k++){
  buf3+=char(comdata[k]);
  }//根据约定字母所在的位置依次解析出各个数据
         data4=buf1.toFloat();//将解析得到的字符串转换为float类型
         data5=buf2.toFloat();
         data6=buf3.toFloat();


    }

  }

2 号机器

float data4=22.23;//要发送的数据
 float data5=49.18;//要发送的数据
 float data6=347.59;//要发送的数据

float data1=0;//要接收的数据
float data2=0;//要接收的数据
float data3=0;//要接收的数据

void setup()
{
    Serial.begin(9600);//两机的波特率要求相同
}

void loop()
{
   transmit();//发送数据
   receive();//接收数据
      Serial.println(data1);//显示接收到的数据
      Serial.println(data2);//显示接收到的数据
      Serial.println(data3);//显示接收到的数据
}



void receive(){

  String comdata = "";//存放接收到的原始字符串
  String buf1="";//存放解析出的第一个字符串
  String buf2="";//存放解析出的第二个字符串
  String buf3="";//存放解析出的第三个字符串

    while (Serial.available() > 0)  
    {
        comdata += char(Serial.read());
        delay(2);//一个一个接收数据,每次停顿2毫秒
    }
    if (comdata.length() > 0)//如果有数据收到
    {
      int ja,jb,jc,jd;//存放收到的字符串中标志字母的下标

for(int i = 0; i < comdata.length(); i++){

  if(comdata[i]=='a'){ja=i;}
  if(comdata[i]=='b'){jb=i;}
  if(comdata[i]=='c'){jc=i;}
  if(comdata[i]=='#'){jd=i;}

  }//找到约定标志字母的下标

 for(int k=ja+1;k<jb;k++){
  buf1+=char(comdata[k]);
  }
  for(int k=jb+1;k<jc;k++){
  buf2+=char(comdata[k]);
  }
  for(int k=jc+1;k<jd;k++){
  buf3+=char(comdata[k]);
  }//根据约定字母所在的位置依次解析出各个数据
         data1=buf1.toFloat();//将解析得到的字符串转换为float类型
         data2=buf2.toFloat();
         data3=buf3.toFloat();


    }

  }
void transmit(){
        Serial.print('a');
        Serial.print(data4);
        Serial.print('b');
        Serial.print(data5);
        Serial.print('c');
        Serial.print(data6);
        Serial.println('#');
        delay(100);
//发送"a数据1b数据2c数据3#"的字符串必须停顿100毫秒
  }

类型转换

由于以上双机通信传的是String类型,真正使用时肯定需要类型转换,所以特地收集了以下的转码大合集,总有几款适合你。

char fc[50];
char ic[20];

void setup() {
  Serial.begin(9600);
}

void loop() {

String s="123.43212";//从一个String开始

float f=s.toFloat();//String转float

int i=s.toInt();//String转int

dtostrf(f,1,5,fc);//将float转为char的数组,其中第三个传入值(5)是保留的位数(5位)

snprintf (ic, 75, "%d", i);//将int转为char的数组.

//以下为串口打印验证
Serial.println(f,5);//打印保留float变量后五位的数
delay(1000);
Serial.println(i);//打印int变量
delay(1000);
Serial.println(fc);//打印float转成的char的数组
delay(1000);
Serial.println(ic);//打印int转成的char的数组
delay(1000);
}




  • 6
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
ESP8266双机通信是一种通过SPI(串行外设接口)进行通信的方式。在ESP8266双机通信中,主机发送数据的格式是通过写信号0X02开始,然后在每个时钟跳边沿采集32位的数据。\[2\]需要注意的是,改变数据长度可能会导致从机接收不完整或接收不正确的数据,因此按照官方给出的HSPI主机例程,数据长度被设置为32位。\[2\] 在实际使用中,由于双机通信传输的是String类型的数据,可能需要进行类型转换。可以使用一些转码方法将String类型转换为其他类型,例如将String转换为float可以使用s.toFloat(),将String转换为int可以使用s.toInt()。\[3\]同时,还可以使用一些函数将float或int类型转换为char数组,例如使用dtostrf()函数将float转换为char数组,使用snprintf()函数将int转换为char数组。\[3\] 以上是关于ESP8266双机通信的一些基本信息和类型转换的方法。如果你在具体实现中遇到了问题,可以提供更多细节,我将尽力帮助你解决。 #### 引用[.reference_title] - *1* *2* [STM32F4_UCOSIII esp8266_free_rtos 双机SPI通信](https://blog.csdn.net/qq_36690796/article/details/90543867)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [arduino双机通信新版本 (解决引脚不够用,专用esp8266)](https://blog.csdn.net/qq_35174914/article/details/52757904)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值