目的:
       实现Arduino主从设备之间的互相IIC通信,掌握IIC通信协议的使用方法。
器材:
Arduino UNO R3 一块
Arduino Nano 三块
面包板   导线
3K电阻 2个
连接方法:

    由于Arduino IIC接口总线没有上拉电阻,在连接布线时需要提供两个上拉电阻。
 
首先给出程序:
Master程序
   #include <Wire.h>
void setup() {
  Wire.begin(); // join i2cbus (主机,不用写IIC地址)
  Serial.begin(9600); // 串口输出
 }
 
int i = 1;
 
 void loop()
 {
     //向从机写入数据
     Wire.beginTransmission(2);
     Wire.write(i);
     Wire.endTransmission();
     //读数据
     Wire.requestFrom(2, 6); // 要求2号IIC设备,通过Wire传送 6个 char过来
     while(Wire.available()) // 如果Wire上有 char 等读取
     {
           char c = Wire.read(); // 从Wire 上读取一个char
            Serial.print(c); //输出到串口监视器查看
     }
     delay(2000); // 等2秒
     Serial.println( ); // 输出到下一行方便查看       
    
     //向从机写入数据
     Wire.beginTransmission(3);
     Wire.write(i);
     Wire.endTransmission();
     //读数据
     Wire.requestFrom(3, 6); // 要求2号IIC设备,通过Wire传送 6个 char过来
     while(Wire.available()) // 如果Wire上有 char 等读取
     {
           char c = Wire.read(); // 从Wire 上读取一个char
            Serial.print(c); //输出到串口监视器查看
     }
      delay(2000); // 等2秒
      Serial.println( ); // 输出到下一行方便查看           
   
     //向从机写入数据
     Wire.beginTransmission(4);
     Wire.write(i);
     Wire.endTransmission();
     //读数据
     Wire.requestFrom(4, 6); // 要求2号IIC设备,通过Wire传送 6个 char过来
     while(Wire.available()) // 如果Wire上有 char 等读取
     {
           char c = Wire.read(); // 从Wire 上读取一个char
            Serial.print(c); //输出到串口监视器查看
     }
      delay(2000); // 等2秒
      Serial.println( ); // 输出到下一行方便查看     
   
     i++;
     i = i%4;
 
 }// loop
 
 
SALVE程序
#include <Wire.h>
void ggyy();
//接收主机命令
int revData = 0;
void receiveData(int byteCount) {  
  while (Wire.available()) {
    int number = Wire.read();
    Serial.print("data received1: ");
    Serial.println(number);
    revData = number;
    } 
 
void setup()
{
  Wire.begin(3); //通知IIC总线, 是2 号IIC设备地址
  Wire.onReceive(receiveData);
  Wire.onRequest(ggyy); // 注册当收到主机信息时相应的调用函数ggyy( )
  Serial.begin(9600);
  pinMode(13,OUTPUT);
  digitalWrite(13,LOW);
}
void loop()
{ // 从机,代码空
      int b = revData;
      revData = 0;
      for(int i = 0; i < b; i++){
      digitalWrite(13,HIGH);
      delay(200);
      digitalWrite(13,LOW);
      delay(200);
    }
}
// 信息处理函数,必须在 setup( ) 內用onRequest( ) 注册
void ggyy()
{
  Wire.write("World "); // 送出 6 个char给IC 上的主机
}
 
 
程序要点分析:
Master程序用Wire.begin();设置,表示本机为Master
  主机向从机写入数据格式
     Wire.beginTransmission(从机地址号);
     Wire.write(数据byte);
     Wire.endTransmission();
Master从Salve读数据
     Wire.requestFrom(从机地址, 字符个数);
     while(Wire.available()) // 如果Wire上有 char 等读取
     {
           char c = Wire.read(); // 从Wire 上读取一个char
            Serial.print(c); //输出到串口监视器查看
     }
SLAVE用Wire.begin(地址号)表示本机为SLAVE,并设置地址号
5.  注册用于接收和发送的函数
Wire.onReceive(receiveData);
     Wire.onRequest(sendData);
两个函数的格式:
void receiveData(int byteCount);
void sendData ();
 
当主机发出requestForm请求时,从机响应,开始发送数据

Arduino IIC 主从设备连接通信的更多相关文章

  1. STM32作为主设备,Arduino作为从设备进行IIC通讯的注意要点

    近日公司的项目重心要往米思齐的Arduino图形化编程上转移了,需要我将STM32和Arduino的IIC通讯调通.之前Arduino并没怎么使用过,仅仅是将超声波的代码移植成TOF激光测距而已.网上 ...

  2. 基于HTML5的Web跨设备超声波通信方案

    前言:Chirp在iPhone上掀起了有声传输文件的序幕,我们再也不需要彩信.蓝牙配对.IM来传送数据.它通过“叽叽喳喳”的小鸟叫声来分享数据,简单有趣,而且可以快速的实现一对多的分享. 此外支付宝曾 ...

  3. USB协议-检测设备连接与速度

    在USB设备连接时,USB系统能自动检测到这个连接,并识别出其采用的数据传输速率.USB采用在D+或D-线上增加上拉电阻的方法来识别低速和全速设备. USB支持3种类型的传输速率:1.5Mb/s的低速 ...

  4. android usb Host模式下与usb Hid 设备的通信

    做android 与USB HID设备的通信有段时间了,总结一下遇到的问题和解决方法: 1,第一次遇到的问题:android 版本低不支持usb hid, 被要求做相关项目的时候,就从mUsbMana ...

  5. Niagara解决设备连接应用的软件框架平台技术。

    Niagara 是Tridium公司所研发的设计用于解决设备连接应用的软件框架平台技术. Niagara是一种应用框架,或者说是软件框架,特别设计用于应对智能设备所带来的各种挑战,包括设备连接到企业级 ...

  6. Android和BLE模块连接通信

    首先,进行一下科普: 1.BLE(Bluetooth Low Energy),蓝牙4.0核心profile,主要特点是快速搜索,快速连接,超低功耗保持连接和数据传输,缺点:数据传输速率低,由于其具有低 ...

  7. 理解主从设备模式(Master-Slave)

    前言 在给定上下文的软件体系结构中,为了解决某些经常出现的问题而形成的通用且可重用的解决方案称之为架构模式,而常见的体系架构模式主要有以下十种 分层模式 客户端-服务器模式 主从设备模式 管道-过滤器 ...

  8. Android BLE设备蓝牙通信框架BluetoothKit

    BluetoothKit是一款功能强大的Android蓝牙通信框架,支持低功耗蓝牙设备的连接通信.蓝牙广播扫描及Beacon解析. 关于该项目的详细文档请关注:https://github.com/d ...

  9. C++服务器设计(六):设备连接的生命周期管理

    生命周期介绍 每一个服务器系统的新连接从建立开始时,均会经历多个阶段.比如连接的建立,登录的验证,退出前的资源释放等.同时在具体的消息处理中,还会遇到不可识别的消息事件,或者消息处理时出现数据错误等. ...

随机推荐

  1. springCloud 之 Eureka注册中心高可用配置

    springCloud的eureka高可用配置方案思路是:几个服务中心之间相互注册,比如两个注册中心,A注册到B上,B注册到A上,如果是三个注册中心则是:A注册到BC上,B注册到AC上,C注册到AB上 ...

  2. extjs开发———用extJS简单写一个饼状图

    先上效果图: js编写部分简单如下,先插入一个模块,然后给模块中添加内容. var myChart1 = echarts.init(document.getElementById('myChart1' ...

  3. lamp-module

    要求:    (1) 三者分离于两台主机: (2) 一个虚拟主机用于提供phpMyAdmin:另一个虚拟主机用于提供wordpress: (3) xcache (4) 为phpMyAdmin提供htt ...

  4. Mysql多对多关系的查询

    1.创建user表 2.创建gateway表 3.创建user_gateway表 4.创建device表 5.创建gateway_device表 6.创建一个实体类 public class Devi ...

  5. Centos 8下命令行界面支持鼠标

    yum install gpm* service gpm start systemctl enable gpm.service

  6. C# MQTT M2MQTT

    MQTT 入门介绍 MQTT是基于二进制消息的发布/订阅编程模式的消息协议 实现MQTT协议需要客户端和服务器端通讯完成,在通讯过程中,MQTT协议中有三种身份:发布者(Publish).代理(Bro ...

  7. GNS3 模拟icmp目标不可达

    目标不可达: R1 : conf t int f0/0 no shutdown ip add 192.168.1.1 255.255.255.0 end R2 f0/0: conf t int f0/ ...

  8. 【LeetCode】合并两个有序数组

    [问题] 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明:初始化 nums1 和 nums2 的元素数量分别为 m ...

  9. usb摄像头驱动的移植

    相关软件下载地址:http://pan.baidu.com/s/16yo8Y 1.使用摄像头型号ov9650 ①修改.配置内核 1.修改vi drivers/i2c/busses/Kconfig (参 ...

  10. js ajax跨域调用

    正常使用ajax调用java.com $.ajax({ type: 'get', url: 'http://www.java.com/custinfo?id=888', dataType: 'json ...