我试过这个例子: http://arduino.cc/en/Reference/WireRead
但是如果我从从机发送少于6个字节,主机仍然会尝试读取所有6个字节,然后读取功能输出-1/255。实际上,在这种情况下,可用函数实际上是无用的,我宁愿使用for到6。
知道我做错了什么或者我怎么能解决这个问题?我不能简单地只过滤所有255个值,因为有时我发送它们。我只是不明白这里的图书馆行为。
编辑:奇怪的是read函数返回一个int,而不是一个byte。所以我可以看到它是-1还是255.而它的确定为255而不是-1。如果我尝试读取7次而不是使用可用功能,则最后读数为-1。奴隶是否发送了错误的字节,或者我可能需要上拉或最新发生什么?
我的解决方案是读取,直到读取为-1而不是使用可用功能。但必须有另一种解决方案。
答案 0 :(得分:0)
虽然这似乎很尴尬,但这是预期的行为。 I2C协议1不提供从设备的任何方式来结束所请求的传输。
长度仅由quantity
的{{1}}参数定义。这样主设备决定并且必须知道从设备将发送多少字节。 Wire.requestFrom
仅表示是否达到先前给定的长度。
要提供可变长度的消息,您可以为字符串传输选择分隔符字符,如Wire.available
,或者在消息前加上一个存储后续字节数的字节,如果达到了告知的数量,则停止读取。< / p>