极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10008|回复: 1

主从Arduino之间IIC通信,从机返回主机信息丢失

[复制链接]
发表于 2015-1-23 11:03:54 | 显示全部楼层 |阅读模式

菜鸟初学主从Arduino之间IIC通信,实现的功能为:主机发送字符串到从机(例如发送ABC),从机接收后显示到从机监视窗口,(此步正常,可显示ABC),然后主机通知从机返回字符串,显示在主机监视窗口,只剩下字符串最后一个字母C,求大神指点一下。谢谢!

主机程序:
  1. #include <Wire.h> //声明I2C库文件

  2. void setup()
  3. {
  4.    Serial.begin(9600);
  5.   Wire.begin(); // 加入 i2c 总线,作为主机

  6. }
  7. void loop()
  8. {
  9.    Wire.beginTransmission(0x97); //发送数据到设备号为 的从机
  10.    
  11.    Wire.write("ABC");        // 发送字符串
  12.   delay(1000);//延时1s
  13.    Wire.endTransmission();    // 停止发送
  14.    
  15.    digitalWrite(led1,HIGH);
  16.    delay(1000);
  17.    digitalWrite(led1,LOW);
  18.    
  19.    Wire.endTransmission();    // 停止发送
  20.    Wire.requestFrom(0x97, 1);    //通知从机上传1个字节
  21.     while(Wire.available()>0)  // 当主机接收到从机数据时
  22.        {
  23.           char c = Wire.read(); //接收一个字节赋值给c
  24.            Serial.print(c);
  25.            delay(1000);//延时1s
  26.         }
  27.       
  28. }
复制代码
从机程序:
  1. #include <Wire.h>

  2. void setup()
  3. {
  4.    Wire.begin(0x97);                // 加入 i2c 总线,设置从机地址为 #0x97
  5.    Wire.onReceive(receiveEvent); //注册接收到主机字符的事件
  6.    Wire.onRequest(requestEvent); // 注册主机通知从机上传数据的事件
  7.    Serial.begin(9600);           //设置串口波特率
  8.    pinMode(13,OUTPUT);
  9. }
  10. void loop()
  11. {
  12.      delay(100);//延时1s
  13.    
  14. }
  15. void receiveEvent(int howMany)
  16. {
  17.      while(Wire.available()>0)     // 循环执行,直到数据包只剩下最后一个字符
  18.     {
  19.       char c= Wire.read(); //接收一个字节赋值给
  20.       Serial.print(c);
  21.       delay(1000);//延时1s
  22.    }
  23. }


  24. //当主机通知从机上传数据,执行该事件
  25. void requestEvent()
  26. {
  27.      char c = Wire.read(); //接收一个字节赋值给c
  28.      Wire.write("c"); //将q返回主机
  29.       
  30.      Serial.print(c);
  31.      digitalWrite(13,HIGH);
  32.      delay(1000);
  33.      digitalWrite(13,LOW);  
  34.      delay(1000);//延时1s
  35. }
复制代码
主机发送"ABC",从机接收显示ABC,再发送回主机,只显示C
回复

使用道具 举报

发表于 2015-1-23 17:40:31 | 显示全部楼层
你每次發出 "ABC" 後, 只是單一個 byte 的 request, 自然是只可以收到一個了.
你的程式中的註解不是已清楚說明嗎, 為何還會這樣的問?

  1. Wire.requestFrom(0x97, 1);    //通知从机上传1个字节
复制代码


而且你做的方法, 是主機向從機送出資料, 共非發出請求的做法.  你接收到的, 亦不是從機回傳的資料.
你看看自己的程式吧, 有可能由從機回傳 "C" 嗎?

要向從機發出請求回傳多個 bytes, 詳細的做法可以參考 I2Cdev 庫 中的 readBytes, 又或直接使用它吧.

另外, 在 receiveEvent 及 requestEvent 中, 是否適合用 Serial.print 及 delay 我也不太肯定.  
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-17 09:02 , Processed in 0.038448 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表