arduino - 如何在 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 缓冲区填满的速度快,消息只会突然出现,所以不必关心溢出。
解决方案
推荐阅读
- javascript - 在 javascript 中使用 Pivotal API
- wpf - 填充数据网格后状态栏消失
- android - 应用程序 react-native-openalpr 在启动时崩溃
- android - 同时将日志输出到文件和系统日志
- angular - 如何解决引导角度 6 的问题
- javascript - 从 Javascript 模块中的父范围继承变量
- json - 无法使用 JSON.parse 解析 json 字符串?
- sql - 我想在访问 sql 中写一个 if else 语句,我确实写了一个代码,但它不工作
- azure - 无法在 Azure 分析服务中添加/连接 CosmosDB
- python-3.x - 无法从特定 python 路径创建 MSI 和 exe 文件