Arduino 双机通信 +类型转换(解决nodemcu引脚不够用咋办的问题)(此方案已经淘汰,查看最新版本)

                       arduino的双机通信+类型转换

1.作用

以主问从答的方式,实现将一个arduino中的多个String类型变量准确地传到另一个arduino中对应的多个String类型变量中。

2.接线图

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

3.代码

    先说说单向的通信

      主机代码(接收端的arduino):

 

int tr=0;//询问计数器

String tem="";//待接收的数据
String hum="";
String tu="";

void setup() {
  Serial.begin(9600);//波特率要保持一致
}

void loop() {//主循环
    getdata();//获取数据的函数
  Serial.println( ' ');//打印出来验证是否正确
  Serial.println(tem);
  Serial.println(hum);
  Serial.println(tu);
     delay(100);//必须延时100毫秒及以上
}

void getdata(){
  String te="";
    if (tr <1000) {//循环1000次,保证收到数据
     tr=tr+1;
     Serial.print("a");//向从机发出指令a
      te=commandstring();//接收从机返回的数据
     if(te!=""){//当返回的数据不为空时
      tem=te;//将数据放入指定变量中
     }
    }
    tr=0;
    te="";
    //以下套路相同,可以根据个人喜好添加多个指令与数据
  if (tr < 1000) {
     tr=tr+1;
     Serial.print("b");
     te=commandstring();
     if(te!=""){
      hum=te;
     }
    }
    tr=0;
    te="";
 if (tr < 1000) {
     tr=tr+1;
     Serial.print("c");
     te=commandstring();
     if(te!=""){
      tu=te;
     }
    }
    tr=0;
    te="";
  }

String commandstring(){//接收串口收到的字符串,并返回此字符串
  
  String r;
  String hu="";
    for(int i=0;r==""&&i<1000;i++){
            for(int j=0;Serial.available()&&j<1000;j++) {
                  hu+=char(Serial.read()); 
                  delay(5);
                 }
  if(hu.indexOf("")!=-1)  { r=hu.substring(0);  } 
  } 
  return r;
}


  从机代码(发送端的arduino):

 

 

 

 

String tem="666";//要发送的数据
String hum="777";
String tu="888";

long last = 0;//计时器1

void setup() {
    Serial.begin(9600);//波特率要保持一致
}

void loop (){//主循环
       answer();//发送数据的函数
}

String commandstring(){//接收串口收到的字符串,并返回此字符串
  
  String r;
  String hu="";
    for(int i=0;r==""&&i<1000;i++){
            for(int j=0;Serial.available()&&j<1000;j++) {
                  hu+=char(Serial.read()); 
                  delay(5);
                 }
  if(hu.indexOf("")!=-1)  { r=hu.substring(0);  } 
  } 
  return r;
}

void answer(){
 long nownow=millis();//计时器2
 last = millis();
      while (nownow - last <1000) {//每次循环1秒钟
      nownow=millis();
  String op= commandstring();//接收主机的指令
 if(op=="a"){//如果指令时a
     Serial.print(tem);//就发送tem变量的值
    }
if(op=="b"){//如果指令时b
     Serial.print(hum);//就发送hum变量的值
    }
if(op=="c"){//如果指令时c
     Serial.print(tu);//就发送tu变量的值
    }    
if(op=="d"){//可继续添加其他指令
     Serial.print("null");
    } 
  }
  }


再讲讲双向的通信(既发送数据,又接收数据),原理和单向通信完全一样,就不再注释了。

 

1号机:

 

int tr=0;//询问计数器

String tem="";//待接收的数据
String hum="";
String tu="";

String q="111.11";//要发送的数据
String w="222.22";
String e="333.33";

long last = 0;//计算时间的变量

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

void loop() {
    answer();
    getdata();
  Serial.println( ' ');
  Serial.println(tem);
  Serial.println(hum);
  Serial.println(tu);
     delay(100);
}

void getdata(){
  String te="";
    if (tr <1000) {
     tr=tr+1;
     Serial.print("a");
      te=commandstring();
     if(te!=""){
      tem=te;
     }
    }
    tr=0;
    te="";
  if (tr < 1000) {
     tr=tr+1;
     Serial.print("b");
     te=commandstring();
     if(te!=""){
      hum=te;
     }
    }
    tr=0;
    te="";
 if (tr < 1000) {
     tr=tr+1;
     Serial.print("c");
     te=commandstring();
     if(te!=""){
      tu=te;
     }
    }
    tr=0;
    te="";
  }

String commandstring(){
    String r;
  String hu="";
for(int i=0;r==""&&i<1000;i++){
for(int j=0;Serial.available()&&j<1000;j++) {
  hu+=char(Serial.read()); 
  delay(5);
  }
  if(hu.indexOf("")!=-1)  { r=hu.substring(0);  } 
  } 
  return r;
}

void answer(){
 long nownow=millis();
 last = millis();
      while (nownow - last <1000) {
      nownow=millis();
  String op= commandstring();
 if(op=="z"){
     Serial.print(q);
    }
if(op=="y"){
     Serial.print(w);
    }
if(op=="x"){
     Serial.print(e);
    }    
if(op=="w"){
     Serial.print("null");
    } 
  }
  }

2号机:

 

 

String tem="666.66";//要发送的数据
String hum="777.77";
String tu="888.88";

int tr=0;//询问计数器

String q="";//待接收的数据
String w="";
String e="";

long last = 0;//时间变量

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

void loop (){
   answer();
   getdata();
  Serial.println( ' ');
  Serial.println(q);
  Serial.println(w);
  Serial.println(e);
    delay(100);
}

String commandstring(){
    String r;
  String hu="";
for(int i=0;r==""&&i<1000;i++){
for(int j=0;Serial.available()&&j<1000;j++) {
  hu+=char(Serial.read()); 
  delay(5);
  }
  if(hu.indexOf("")!=-1)  { r=hu.substring(0);  } 
  } 
  return r;
}

void answer(){
 long nownow=millis();
 last = millis();
      while (nownow - last <1000) {
      nownow=millis();
  String op= commandstring();
 if(op=="a"){
     Serial.print(tem);
    }
if(op=="b"){
     Serial.print(hum);
    }
if(op=="c"){
     Serial.print(tu);
    }    
  }
  }

void getdata(){
  String te="";
    if (tr <1000) {
     tr=tr+1;
     Serial.print("z");
     te=commandstring();
     if(te!=""){
      q=te;
     }
    }
    tr=0;
    te="";
  if (tr < 1000) {
     tr=tr+1;
     Serial.print("y");
      te=commandstring();
     if(te!=""){
      w=te;
     }
    }
    tr=0;
    te="";
 if (tr < 1000) {
     tr=tr+1;
     Serial.print("x");
  te=commandstring();
     if(te!=""){
      e=te;
     }
    }
    tr=0;
    te="";
  }


4.类型转换

 

 由于以上双机通信传的是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);

}

 

 

 

 

 

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值