| 指令 | 發出耆 | 作用 |
|---|---|---|
| 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 中.
以下例子, 就是用最通用的方式處理,
#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;
}
執行後, 跟之前的是沒分別的.
當然, 你也可以嘗試把 i2c 的 buffer 加大或收細, 看看有什麼影響.
相關程式下載 (master_03 跟 master_02 是一樣的)
沒有留言:
張貼留言