OpenMV IDE 自带demo分析.Ar_i2c_slave
有200多个代码之多.我可以分析的完嘛
i2c,spi,uart被放在了第一个文件夹中.是在讲述Arduino的地位呢?
还是说指通信能力呢?我想都是有的,但是我不是设计者,就不知道了
import pyb, ustruct
text = "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 2
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...")
就是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得语句.属于防御性编程得一种吧.下次再见,写作业去了