我有一个Arduino项目,它通过SPI使用nRF24l01 +无线电模块(使用此库:http://tmrh20.github.io/RF24/)和通过软件序列使用RFID阅读器。我正在睡觉我的Arduino并让他们在收到消息或准备好读取RFID标签时通过中断唤醒它。 RFID位于引脚4和5上,而nRF覆盖引脚9-13以及2号中断引脚。
这两个模块分别与睡眠和中断代码一起工作正常,但当合并到一个草图时,Arduino会因RFID标签唤醒,读取它,然后尝试通过无线电发送一些东西然后只需挂起,等待库调用write()返回。
我已经深入研究了两个库,但我大多数都无法对软件序列库做出正面或反面。它似乎可能在幕后使用与我的nRF模块相同的ISR,但我不会立即明白为什么这应该是一个大问题,我不明白为什么它应该导致无线电挂起。
我知道这可能是一个很长的镜头,但有人知道可能会发生什么吗?也许有人知道这些图书馆?有关解决方法的任何想法?感谢。
答案 0 :(得分:0)
我遇到了相同的症状,问题结果是我的代码中的缓冲区溢出。溢出本身是由于SoftwareSerial
丢弃字节,因为RF24
库正在插入其中断处理。
有问题的代码使用SoftwareSerial
从GPS接收器读取,解析NMEA语句并提取纬度和经度信息,以便使用RF24
通过无线电发送。它是这样的:
if (gpsSerial.available()) {
int c = gpsSerial.read();
if (c == '\r') {
buf[bdx] = '\0';
// process buf here, which contains a null terminated NMEA sentence
// and then send via RF24
bdx = 0;
else if (c != '\n' && bdx < BUFLEN) buf[bdx++] = c;
}
BUFLEN
的大小大于任何单个NMEA句子。
经验丰富的读者会回答有问题的一句话:
buf[bdx] = '\0';
写入buf 没有范围检查。在正常操作中,如果GPS模块中的字符流不间断,则此代码可以正常工作,因为在\r
空间不足之前,我们总会遇到buf
。但是,通过RF24
发送信息会导致SoftwareSerial
字符被丢弃或损坏的延迟,并且此假设不再适用。
所以现在发生的是:
\r
,之前的NMEA句子不会被丢弃buf
bdx
一直前进,直到else
\r
下一个NMEA句子遭到反击buf[bdx] = '\0';
写过buf
此时Arduino停止响应,看起来write
正在阻止。
此修复是在if
:
if (bdx >= BUFLEN) bdx = 0;
除了这一行之外没有其他任何修改,代码现在已经运行了5个多小时而没有问题,而之前它在write
&#34;阻止&#34;之前不会超过30秒。< / p>