有200多个代码之多.我可以分析的完嘛
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的这个文件下做的改动
为了好比较的样子把
先引入一个库,定于俩宏
配置,启动
先缩进来看看是什么样的
内部变量定义,
没什么好说的
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, 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
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得语句.属于防御性编程得一种吧.下次再见,写作业去了