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