总线传输数据出了问题
本帖最后由 shihaipeng04 于 2014-3-5 10:45 编辑我还是不绕弯了, 就是i2c怎么读int型的数据?
I2C是个好玩的东西,可以让多个arduino之间通讯,让一个主机控制很多个从机协同工作,比如控制100个LED各种亮虽然有脱裤子放屁的嫌疑。。。
今天试验了一下,1个uno板子GND,SDA(A4),SCL(A5) 3线连到一个Mirco板子的 GND,SDA(2),SCL(3)。
此图找了很久才知道 mirco的sda是哪条腿。
连好后,让uno做主机,mirco做从机,主机发指令让从机返回一个随机数,然后主机按返回的数值控制led亮度。 程序很顺利。
主机程序
#include <Wire.h> //声明I2C库文件
void setup()
{
Serial.begin(9600);
Wire.begin(); // 加入 i2c 总线,作为主机
}
void loop()
{
Wire.requestFrom(0x97, 1); //通知从机上传1个字节
while(Wire.available()>0) // 当主机接收到从机数据时
{
byte c = Wire.read(); //接收一个字节赋值给c
analogWrite(9,c); //pin9有个led灯
Serial.println(c);
}
delay(1000);//延时1s
}
从机程序
#include <Wire.h>
void setup()
{
Wire.begin(0x97); // 加入 i2c 总线,设置从机地址为 #0x97
Wire.onReceive(receiveEvent); //注册接收到主机字符的事件
Wire.onRequest(requestEvent); // 注册主机通知从机上传数据的事件
Serial.begin(9600); //设置串口波特率
}
void loop()
{
}
void receiveEvent(int howMany)
{
//接收函数无内容
}
//当主机通知从机上传数据,执行该事件
void requestEvent()
{
//产生一随机数上传给主机
byte q = random(255);
Wire.write(q); //将q返回主机
Serial.println(q); //监视检测用
}
上面2段代码运行的很顺利,后来想研究一下更复杂数据的传输,比如int或long型的数据,改动如下
从机requestEvent函数代码
void requestEvent()
{
//产生一随机数上传给主机
int q = random(32768);
Wire.write(q); // <<---直接返回int型数据,后来又试验过,分2次write2个byte数据
Serial.println(q); //监视检测用
}
主机代码改动也不大
void loop()
{
Wire.requestFrom(0x97, 2); //《--- 此处有改动,一次读取2个字节,long型就读取4个字节
while(Wire.available()>0) //<---读取字节超过1个就会循环执行,直到全部读取完毕
{
byte c = Wire.read(); //接收int型数据的一半
Serial.println(c,HEX); //分2部分读取一个int,并将结果直接打印
}
delay(1000);//延时1s
}
主机只是分2次读取那个int的上下2部分,并直接打印到串口。但是结果不正确。 如果从机显示 0x"1234",而主机的结果是34 FF,只能读取后半截。后来又试验过,修改从机,不发送int数,而是连续write2次发送byte型数据,也是同样的结果。不知道是从机发送的不对?还是主机的读取方式不正确? 而long型数据也是失败告终。
最后测字符串到是很成功,只要字符串长度确认,就没有任何问题。请高人指点一下。后来代码是哪的错误? 目的在于测试IIC通讯 和“脱裤子放屁”没半毛钱关系
可以尝试通讯其他IIC设备 比如运动轨迹传感器等其他传感器
还有就是IIC作为一个多设备总线 还是有很大的优势的对于并非需要大数据量但设备较多的状况很有价值。 试想即便是2560的所有其他口加起来也就那么点,但是一个IIC能通讯127个设备(某些设备的IIC地址只能2选1所以最多只能2个 但是不会影响其他设备的)。还是很强悍的。 如果要单纯的控制IO或者RGB彩色LED的话,都有专门的IIC总线IO模块或者PWM模块的,没必要摆一堆Arduino的。可以搜搜“ IIC IO扩展” 或者 “IIC LED模块”
“脱裤子放屁” 然后走人,呵呵。 幻生幻灭 发表于 2014-3-4 18:34 static/image/common/back.gif
如果要单纯的控制IO或者RGB彩色LED的话,都有专门的IIC总线IO模块或者PWM模块的,没必要摆一堆Arduino的。可 ...
服了~~ 我回传的数据总得有个去处吧。弄个led直观点而已,我是研究i2c咋用。不是led好吗? darkorigin 发表于 2014-3-4 08:46
目的在于测试IIC通讯 和“脱裤子放屁”没半毛钱关系
可以尝试通讯其他IIC设备 比如运动轨迹传感器等其他 ...
哪个啥,我主要是想问问I2c传输int型数咋搞? shihaipeng04 发表于 2014-3-5 10:45 static/image/common/back.gif
哪个啥,我主要是想问问I2c传输int型数咋搞?
传输出来的默认就是数值啊
字符是按照ASCII传输的
整型也是数值类型的一个子集嘛
IIC传输建议你看看精华区的几个帖子
1是2个ARDUINO用IIC进行通讯的例子
2是IIC地址扫描程序 本帖最后由 shihaipeng04 于 2014-3-5 11:46 编辑
darkorigin 发表于 2014-3-5 11:11 static/image/common/back.gif
传输出来的默认就是数值啊
字符是按照ASCII传输的
整型也是数值类型的一个子集嘛
主机只是分2次读取那个int的上下2部分,并直接打印到串口。但是结果不正确。 如果从机显示 0x"1234",而主机的结果是34 FF,只能读取后半截。后来又试验过,修改从机,不发送int数,而是连续write2次发送byte型数据,也是同样的结果。不知道是从机发送的不对?还是主机的读取方式不正确?
地址扫描的那个我看到了,前天还发了个新的程序呢,1.5可以运行的,原来帖子里的程序1.5已经不能编译了,需要修改。
你说的通讯的那个例子,我似乎没找到。
页:
[1]