arduino i2c通信_OpenMV IDE 自带demo分析.Ar_i2c_slave

8a03c8925f9852b3058c4e541fca5dd0.png

cf8f5bf289267a0281c19d3b70fdefc3.png

有200多个代码之多.我可以分析的完嘛

d3ac1da707e90ff27a92f34e1575ee4d.png

i2c,spi,uart被放在了第一个文件夹中.是在讲述Arduino的地位呢?

还是说指通信能力呢?我想都是有的,但是我不是设计者,就不知道了

import pyb, ustructtext = "Hello World!\n"data = ustruct.pack(" % len(text), text)bus = pyb.I2C(2, pyb.I2C.SLAVE, addr=0x12)bus.deinit() # Fully reset I2C device...bus = pyb.I2C(2, pyb.I2C.SLAVE, addr=0x12)print("Waiting for Arduino...")while(True):    try:        bus.send(ustruct.pack(", len(data)), timeout=10000) # Send the len first (16-bits).        try:            bus.send(data, timeout=10000) # Send the data second.            print("Sent Data!") # Only reached on no error.        except OSError as err:            pass    except OSError as err:        pass 

这份文件一开始是Ardunio写的

#include #define BAUD_RATE 19200#define CHAR_BUF 128void setup(){    Serial.begin(BAUD_RATE);    Wire.begin();    delay(1000); // Give the OpenMV Cam time to bootup.}void loop(){    int32_t temp = 0;    char buff[CHAR_BUF] = {0};    Wire.requestFrom(0x12, 2);    if (Wire.available() == 2)    { // got length?        temp = Wire.read() | (Wire.read() << 8);        delay(1); // Give some setup time...        Wire.requestFrom(0x12, temp);        if (Wire.available() == temp)        { // got full message?            temp = 0;            while (Wire.available())                buff[temp++] = Wire.read();        }        else        {            while (Wire.available())                Wire.read(); // Toss garbage bytes.        }    }    else    {        while (Wire.available())            Wire.read(); // Toss garbage bytes.    }    Serial.print(buff);    delay(1); // Don't loop to quickly.}

我把代码放上来,就是就是在原有的Arduino的这个文件下做的改动

为了好比较的样子把

bbab716bb56edae0fd3d5579ec4f0c9d.png

先引入一个库,定于俩宏

adc6e97096ed9b08566e3bb7c4f54f7c.png

配置,启动

d5e221c77c0495b61880556245b8616a.png

先缩进来看看是什么样的

267fe6cd628df919f46aa5bfc38d17a5.png

内部变量定义,

bc818d534f14a7ebb069442abe152c00.png

没什么好说的

18f0b45754a346fc5c98958f441762fb.png

else

6fdf08beab0932ba9d7d3b523240fd68.png

最后的俩句

c59b7561875175e90db6d38ead9ebd89.png

我们先来看第一个I2C的例子,一开始就是3个关于通信的例子。

#I2C,以Arduino为主要设备,OpenMV Cam为从属设备。

#OpenMV Cam Master I2C数据(P5)-Arduino Uno数据(A4)

#OpenMV Cam Master I2C时钟(P4)-Arduino Uno时钟(A5)

# OpenMV Cam Ground                - Arduino Ground

import pyb, ustructtext = "Hello World!\n"data = ustruct.pack(" % len(text), text)
https://docs.openmv.io/library/ustruct.html
https://docs.python.org/3/library/struct.html

以上是两个参考的文件,可以看看

#使用“ ustruct”构建要发送的数据包。

#“ 

#“%ds”在数据流中放入一个字符串。 例如。 “ Hello World!\ n”为“ 13s”(13个字符)。

导入了2个库,Python的味道有点了哈,以及处理结构体的struct+u

68ffe67606d94d3cf19d9326e9902348.png

f3c8b253409b1b84c855115113f2d84a.png

bus = pyb.I2C(2, pyb.I2C.SLAVE, addr=0x12)bus.deinit() #完全重置I2C设备...bus = pyb.I2C(2, pyb.I2C.SLAVE, addr=0x12)print("Waiting for Arduino...")

#请理解,当你的OpenMV Cam不是I2C主设备时,它可能会错过响应

#无论你是在Interupt回调中还是在内部回调中调用“ i2c.send()”,都作为I2C从设备发送数据

#下面的主循环。 发生这种情况时,Arduino将获得NAK,必须尝试从

#再次使用OpenMV Cam。 请注意,Arduino和OpenMV Cam I2C驱动程序都不擅长获取

#遇到任何I2C错误后松开。 在OpenMV Cam和Arduino上,您可以通过以下方式恢复

#取消初始化,然后重新初始化I2C外设。

# The hardware I2C bus for your OpenMV Cam is always I2C bus 2.#OpenMV Cam的硬件I2C总线始终是I2C bus 2bus = pyb.I2C(2, pyb.I2C.SLAVE, addr=0x12)bus.deinit()  # 完全重置I2C设备...bus = pyb.I2C(2, pyb.I2C.SLAVE, addr=0x12)print("Waiting for Arduino...")

就是python是更加的抽象的厉害,你可以看到就是几行代码,用C系得语言写是更多得

要注意:

为了使同步正常工作,OpenMV Cam必须在运行此脚本之前,Arduino开始轮询OpenMV Cam以获取数据。 否则,I2C字节帧会混乱,因此,保持Arduino处于重置状态,直到OpenMV Cam是“ Waiting for Arduino ...”。

while(True):    try:        # 首先发送len(16位)。        bus.send(ustruct.pack(", len(data)), timeout=10000)        try:            bus.send(data, timeout=10000)  # 第二次发送数据。            print("Sent Data!")  # 只达到没有错误。        except OSError as err:            pass    except OSError as err:        pass       

接着就是一个死循环

这个是一个Try-except得语句.属于防御性编程得一种吧.下次再见,写作业去了

8a03c8925f9852b3058c4e541fca5dd0.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值