分享

OpenMV IDE 自带demo分析.Ar_i2c_slave

 云深无际 2021-11-03

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

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

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

import pyb, ustructtext = "Hello World!\n"data = ustruct.pack("<%ds" % 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("<h", 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 <Wire.h>#define BAUD_RATE 19200#define CHAR_BUF 128
void 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的这个文件下做的改动

为了好比较的样子把

先引入一个库,定于俩宏

配置,启动

先缩进来看看是什么样的

内部变量定义,

没什么好说的

else

最后的俩句


我们先来看第一个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, ustruct
text = "Hello World!\n"data = ustruct.pack("<%ds" % 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


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("<h", 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得语句.属于防御性编程得一种吧.下次再见,写作业去了

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多