zoukankan      html  css  js  c++  java
  • Arduino IIC 主从设备连接通信

    目的:
           实现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请求时,从机响应,开始发送数据
  • 相关阅读:
    编码 原码 反码 补码
    java垃圾收集器与内存分配策略
    MYSQL 索引 性能优化
    jvm内存溢出性能调优
    JVM内存模型
    线程相关
    Java 设计模式
    synchronized 与 volatile
    ActivityGroup相关--getLocalActivityManager() 以及intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)用法
    [Android] Activity 重复使用
  • 原文地址:https://www.cnblogs.com/anandexuechengzhangzhilu/p/10706524.html
Copyright © 2011-2022 走看看