YPHFree 发表于 2015-1-23 11:03:54

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


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

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

}
void loop()
{
   Wire.beginTransmission(0x97); //发送数据到设备号为 的从机
   
   Wire.write("ABC");      // 发送字符串
delay(1000);//延时1s
   Wire.endTransmission();    // 停止发送
   
   digitalWrite(led1,HIGH);
   delay(1000);
   digitalWrite(led1,LOW);
   
   Wire.endTransmission();    // 停止发送
   Wire.requestFrom(0x97, 1);    //通知从机上传1个字节
    while(Wire.available()>0)// 当主机接收到从机数据时
       {
          char c = Wire.read(); //接收一个字节赋值给c
         Serial.print(c);
         delay(1000);//延时1s
      }
      
}从机程序:#include <Wire.h>

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


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

Super169 发表于 2015-1-23 17:40:31

你每次發出 "ABC" 後, 只是單一個 byte 的 request, 自然是只可以收到一個了.
你的程式中的註解不是已清楚說明嗎, 為何還會這樣的問?

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

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

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

另外, 在 receiveEvent 及 requestEvent 中, 是否適合用 Serial.print 及 delay 我也不太肯定.
页: [1]
查看完整版本: 主从Arduino之间IIC通信,从机返回主机信息丢失