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);

}

}

原文地址:https://www.cnblogs.com/anandexuechengzhangzhilu/p/10719017.html

时间: 2024-10-30 15:32:29

arduino双机通信 (解决引脚不够用)的相关文章

单片的双机通信

通常单片机的双机通信有以下4中方式通信: TTL电平通信(双机串行口直接互连).RS-232C通信.RS-422A通信.RS-485通信等. TTL电平通信时,单片机A的TXD端接单片机B的RXD端,单片机B的RXD端接B的TXD端.但是两个单片机的地线必须要共地,即把他们的系统电源地线要接在一起. 主机按键 #include <reg52.h> #define uchar unsigned char #define uint unsigned int void delayms(uint xm

Linux can双机通信(2440+MCP2515 &amp;&amp; 51+SJA1000)

2012-01-12 22:43:24 上图: 自收发成功完成后,那么双机通信就比较容易了.关键就是CAN波特率.ID标识.滤波设置正确即可双机通信了. 原文地址:https://www.cnblogs.com/AppleCai/p/10778176.html

NetworkComms c#通信框架与Java的Netty框架通信 解决粘包问题

上次写了一篇文章  基于networkcomms V3通信框架的c#服务器与java客户端进行通信之Protobuf探讨 其中没有解决粘包问题,抛砖引玉,文章得到了失足程序员 老师的点评,并给出了解决方案:[最多评论]java netty socket库和自定义C#socket库利用protobuf进行通信完整实例(10/591) » 于是马上开始学习,并把c#服务器端换成了我比较熟悉的networkcomms v3 c#通信框架(商业版,本文并不提供) ,以方便与已经存在的系统进行整合. 客户

VMware Workstation 11网络桥接可以通,NAT不能与主机通信解决办法

前一段时间,NAT模式可以正常工作,今天打开却无法通信,先将解决办法汇总如下: 在编辑-->虚拟网络编辑器中设置: 1.NAT设置里面网管设置成自己需要的网段 2.DHCP设置里面设置自己需要的网络的起始IP段: 设置完成后就可以了.

两个arduino的通信

1 两个arduino板进行串口通讯实验 (2012-10-27 08:39:51)转载▼ 2 标签: 杂谈 3 购得两块arduino板子,想试试其通讯能力,于是写下如是程序,居然没有打麻烦,奇怪! 4 接线:两个板子各用电池供电,将两块板子的 D1.D0交叉联接. 5 char ss; 6 int i=10; 7 void setup() 8 { 9 Serial.begin(9600); //设置串口速度 10 pinMode(13,OUTPUT);//一般13口上都有一个已经接好的LED

STM32 IIC双机通信—— HAL库硬件IIC版

参考传送门 关于IIC的原理这里我就不多说了,网上有很多很好的解析,如果要看我个人对IIC的理解的话,可以点击查看,这里主要讲一下怎样利用STM32CubeMx实现IIC的通讯,经过个人实践,感觉HAL库的硬件IIC要比标准库的稳定.好了,下面就从STM32CubeMx 配置开始一步步实现IIC通讯. STM32CubeMx的配置,这里关于新建工程的步骤我就不细说了,如果还不会操作STM32CubeMx 的可以点击链接查看, 这里主要对IIC的配置进行说明. 了解IIC的都知道,IIC通信有主从

udp 双机通信(服务器循环检测)2

此文摘自:http://blog.csdn.net/qinpeng100423/article/details/8980423,谢谢了 自己上一篇写的udp通信,只能运行一次,参考了这位博主的,只是把receive的方法处改为循环,这样即可实现服务器循环检测,然后接受数据和回复 受到项目要求,将文件分离,读者引用该类,实例化调用方法即可. 一. UDP协议定义 UDP协议的全称是用户数据报,在网络中它与TCP协议一样用于处理数据包.在OSI模型中,在第四层——传输层,处于IP协议的上一层.UDP

Socket编程:之双机通信

服务端: 1 #include<sys/socket.h> 2 #include<sys/types.h> 3 #include<stdio.h> 4 #include<unistd.h> 5 #include<stdlib.h> 6 #include<string.h> 7 #include<netdb.h> 8 #include<netinet/in.h> 9 #include<arpa/inet.h

Arduino连接SHT10温湿度传感器--返回值不正常解决办法

如题目,arduino中连接温湿度传感器,用的是一个github开源项目,地址:点击打开,其实这个就是一个封装好的库,下载后把解压的文件夹复制到Arduino目录下的librarys文件夹内,重启Arduino,到此就算是到库成功了.下面看电路连接图: 注意DATA和SCK两个脚对于Arduino上的数字引脚,在写程序的时候要用到,如图所示:将 SHT15 的 Data 脚接到 pin11, SCK 接到 pin10 电路图片: 导入库的路径: 其实库里面提供了一个实例代码,你可以直接拿过来使用