擅长:python、mysql、java
<p>我正在创建一个带有覆盆子Pi和Arduino UNO i2c的buzzing服务器,遇到了同样的问题。我的设计是,当Pi从套接字(由网络上的一些外部机器)接收到连接请求时,它会将“1”写入Arduino,Arduino将通过更改全局变量启用loop in loop()。写入后,Pi将连续从Arduino读取字节,以检查按钮状态。当Pi想要停止读取时,它发送“0”来停止循环并重置所有计数器和LED。</p>
<p>结果是Python在写入字节时会随机通过IOError。在带有Arduino的串行监视器上,我注意到接收到的最后一个字节是1,而不是0,这是pi应该发送的。在查看i2cdetect-y 1时,我注意到地址是错误的,我尝试了Jon的方法,但是正如user3126397所提到的,坏数据已经发送,Arduino已经停止。我尝试了他的modprobe,但它只抑制了错误消息,而Arduino仍处于停止状态。</p>
<p>我最初怀疑数据因为不完整的读/写而变酸,因此添加了一个Serial.println()来检查onReceive()中的参数byteCount。在没有修改任何其他代码的情况下,我发现IOError之前成功操作的次数增加了很多。因此,我尝试添加更多println()来测试相关性,并注意到失败率急剧增加。最后,我评论了所有的串行语句,我最终能够在相当长的时间内无故障地使用服务器(我测试了大约30次,仍然没有IOError)。</p>
<p>我怀疑,关于用户3126397重置波特率的解决方案和我对Serial.println()关系的观察,这个错误确实是由pi和Arduino之间的同步问题引起的(因为Serial相对较慢,导致程序延迟更多,因此增加了失败的机会)。</p>