|
本帖最后由 Super169 于 2015-8-1 23:34 编辑
相关指令:
指令 | 发出者 | 作用 | Wire.begin([<address>]); | master / slave | 启动 Wire (由於 i2c 是用 Wire 的, 这就等同启动 i2c 了) | Wire.beginTransmission(<address>); | master | 开始对 <address> 的连线 | Wire.endTransmission(); | master | 关闭之前的连线 | Wire.write(<data>); | master | 在连线上送出 一个 byte 的资料 | Wire.onReceive(<function>); | slave | 设定用来接收资料的函数 | Wire.available(); | slave | 检查连线上是否有可接收的资料 | Wire.read(); | slave | 读取连线上的一个 byte 的资料 |
slave 延迟处理
之前的一篇, 不是已经可以由 master 向 slave 发送资料, 而 slave 亦成功收到了, 为什麽又搅个 延迟处理出来?
之前一篇, 处理 master 送来的资料, 都是在接收的函数之内. 但大家不要忘记, arduino 的主线, 是在 loop 之内执行的. 接收函数太大, 或会影响主程式进行, 而且, 有些时候, 主程式或许需要用到接收回来的资料.
延後处理就是把资料放进缓存一样, 让主程式去处理.
方法很简单, 可以直接把资料放有有关变数, 又或用最通用的方式, 先放入一个 buffer 中.
以下例子, 就是用最通用的方式处理,
[pre lang="arduino" line="1" file="slave_03.ino"]#include <Wire.h>
#define SLAVE_ADDRESS 0x12
#define SERIAL_BAUD 57600
#define I2C_BUFFER_SIZE 32
uint8_t i2cBuffer[I2C_BUFFER_SIZE];
uint8_t i2cBufferCnt = 0;
boolean dataPending = false;
void setup() {
Wire.begin(SLAVE_ADDRESS); // join I2C bus as a slave with address 1
Wire.onReceive(receiveEvent); // register event
Serial.begin(SERIAL_BAUD);
Serial.println("I2C Slave.03 started\n");
}
void loop() {
if (dataPending) {
Serial.println("Receive Data:");
for (int idx = 0; idx < i2cBufferCnt; idx++) Serial.print((char) i2cBuffer[idx]);
Serial.println("\n");
dataPending = false;
}
}
void receiveEvent(int count) {
i2cBufferCnt = 0;
while(Wire.available()) {
i2cBuffer[i2cBufferCnt++] = Wire.read();
}
dataPending = true;
}[/code]
执行後, 跟之前的是没分别的.
当然, 你也可以尝试把 i2c 的 buffer 加大或收细, 看看有什麽影响.
相关程式下载 (master_03 跟 master_02 是一样的)
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|