首页 > 解决方案 > 如何在 Arduino 中正确使用 Wire.onReceive

问题描述

我有一个消息流从它的主设备进入一个 I2C 从设备。

如何正确解决以下问题?

如果我做:

Wire.onReceive(handler);

void handler(int howMany) {
    byte message = Wire.read();
}

我该怎么办message?我不应该在 ISR 中处理它以使中断保持苗条和快速。如果我改为:

volatile byte message;

然后从 ISR 设置它并在里面读取它loop(),我可能循环速度不够快,无法快速读取传入的消息 - 从而丢失消息。

因此,我可以创建一个缓冲区,并从 ISR 内部推送到它,然后从中读取,loop()但这更容易受到竞争条件的影响 - 除非我在获取缓冲区的本地副本时禁用中断 - 但中断我'会错过消息。

Wire 有一个内部 rx 缓冲区,所以我认为我可以从我的内部调用Wire.available()and ,但是 Wire.cpp 的实现状态:Wire.read()loop

// must be called in:
// slave rx event callback
// or after requestFrom(address, numBytes)
int TwoWire::available(void);

那么,这样做的正确方法是什么?如何处理/排队快速传入的 i2c 消息并在不丢失数据的情况下处理它们?

假设我处理消息的速度比我的 rx 缓冲区填满的速度快,消息只会突然出现,所以不必关心溢出。

标签: arduino

解决方案


推荐阅读