zoukankan      html  css  js  c++  java
  • arduino双机通信 (解决引脚不够用)

    作用

    实现将一个 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);

    }
      }
  • 相关阅读:
    boost::function和boost::bind 介绍
    va_list 简介
    tcp异常断开的重连解决方法
    Nginx作为代理服务之反向代理
    Nginx作为代理服务之正反代理
    Nginx作为静态资源web服务之防盗链
    Nginx作为静态资源web服务之跨域访问
    Nginx作为静态资源web服务之缓存原理
    Nginx作为静态资源web服务之文件读取
    阿里云环境中配置tomcat7可能出现的问题及解决方法
  • 原文地址:https://www.cnblogs.com/anandexuechengzhangzhilu/p/10719017.html
Copyright © 2011-2022 走看看