SMBus/I2C in Python 请求读取时一直触发接收回调
SMBus/I2C in Python keeps triggering receive callback when requesting read
我试图通过从我的 PC 发送读取请求来从 Arduino 微控制器读取一些值,但它没有触发请求回调,而是触发了接收,这根本没有意义吗?我是 运行 I2C,因此 SMBus 似乎要慢得多。
Arduino 代码:
void dataReceive() {
Serial.println("Receive");
}
void dataRequest() {
Serial.println("Request");
Wire.write(1);
}
void setup()
{
Wire.begin(4);
Wire.onReceive(dataReceive);
Wire.onRequest(dataRequest);
}
电脑代码:
import smbus
bus = smbus.SMBus(1)
data = bus.read_i2c_block_data(0x04, 0x09, 1)
print data
我也收到以下错误:
Traceback (most recent call last):
File "./i2ctest.py", line 16, in <module>
data = bus.read_i2c_block_data(0x04, 0x09, 1)
IOError: [Errno 11] Resource temporarily unavailable
尽管我能够在 Arduino 串行监视器中看到触发了 dataReceive
回调。
Arduino 在 Wire.h 库中没有重复启动信号。您的解决方案是这样的:
Arduino 方面:
void dataReceive() {
x = 0;
for (int i = 0; i < byteCount; i++) {
if (i==0) {
x = Wire.read();
cmd = ""
} else {
char c = Wire.read();
cmd = cmd + c;
}
}
if (x == 0x09) {
// Do something arduinoish here with cmd if you need no answer
// or result from Arduino
x = 0;
cmd = ""
}
}
这会将收到的第一个字符存储为 "command",然后其余部分将作为参数部分。在你的例子中命令是 0x09,参数是 1.
在 PC 端,python 命令是这样的:
bus.write_i2c_block_data(0x05,0x09,buff)
其中 buff 为“1”。
您可能需要数据请求事件:
void dataRequest() {
x = 0;
Wire.write(0xFF);
}
这将发回一个简单的 FF。
如果你需要arduino的回答,那么在这里处理cmd参数。在这种情况下,在 python 一侧,您将需要更多:
bus.write_i2c_block_data(0x05,0x09,buff)
tl = bus.read_byte(0x05)
这会将“1”发送到设备“0x05”的命令“0x09”中。然后,您只需从设备“0x05”读取命令即可获取答案。
我试图通过从我的 PC 发送读取请求来从 Arduino 微控制器读取一些值,但它没有触发请求回调,而是触发了接收,这根本没有意义吗?我是 运行 I2C,因此 SMBus 似乎要慢得多。
Arduino 代码:
void dataReceive() {
Serial.println("Receive");
}
void dataRequest() {
Serial.println("Request");
Wire.write(1);
}
void setup()
{
Wire.begin(4);
Wire.onReceive(dataReceive);
Wire.onRequest(dataRequest);
}
电脑代码:
import smbus
bus = smbus.SMBus(1)
data = bus.read_i2c_block_data(0x04, 0x09, 1)
print data
我也收到以下错误:
Traceback (most recent call last):
File "./i2ctest.py", line 16, in <module>
data = bus.read_i2c_block_data(0x04, 0x09, 1)
IOError: [Errno 11] Resource temporarily unavailable
尽管我能够在 Arduino 串行监视器中看到触发了 dataReceive
回调。
Arduino 在 Wire.h 库中没有重复启动信号。您的解决方案是这样的:
Arduino 方面:
void dataReceive() {
x = 0;
for (int i = 0; i < byteCount; i++) {
if (i==0) {
x = Wire.read();
cmd = ""
} else {
char c = Wire.read();
cmd = cmd + c;
}
}
if (x == 0x09) {
// Do something arduinoish here with cmd if you need no answer
// or result from Arduino
x = 0;
cmd = ""
}
}
这会将收到的第一个字符存储为 "command",然后其余部分将作为参数部分。在你的例子中命令是 0x09,参数是 1.
在 PC 端,python 命令是这样的:
bus.write_i2c_block_data(0x05,0x09,buff)
其中 buff 为“1”。
您可能需要数据请求事件:
void dataRequest() {
x = 0;
Wire.write(0xFF);
}
这将发回一个简单的 FF。
如果你需要arduino的回答,那么在这里处理cmd参数。在这种情况下,在 python 一侧,您将需要更多:
bus.write_i2c_block_data(0x05,0x09,buff)
tl = bus.read_byte(0x05)
这会将“1”发送到设备“0x05”的命令“0x09”中。然后,您只需从设备“0x05”读取命令即可获取答案。