主从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
你每次發出 "ABC" 後, 只是單一個 byte 的 request, 自然是只可以收到一個了.
你的程式中的註解不是已清楚說明嗎, 為何還會這樣的問?
Wire.requestFrom(0x97, 1); //通知从机上传1个字节
而且你做的方法, 是主機向從機送出資料, 共非發出請求的做法.你接收到的, 亦不是從機回傳的資料.
你看看自己的程式吧, 有可能由從機回傳 "C" 嗎?
要向從機發出請求回傳多個 bytes, 詳細的做法可以參考 I2Cdev 庫 中的 readBytes, 又或直接使用它吧.
另外, 在 receiveEvent 及 requestEvent 中, 是否適合用 Serial.print 及 delay 我也不太肯定.
页:
[1]