|
|
本帖最后由 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型数据也是失败告终。
最后测字符串到是很成功,只要字符串长度确认,就没有任何问题。请高人指点一下。后来代码是哪的错误? |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|