Arduino软件与SPI发生冲突?

时间:2015-10-10 04:13:48

标签: arduino spi software-serial

我有一个Arduino项目,它通过SPI使用nRF24l01 +无线电模块(使用此库:http://tmrh20.github.io/RF24/)和通过软件序列使用RFID阅读器。我正在睡觉我的Arduino并让他们在收到消息或准备好读取RFID标签时通过中断唤醒它。 RFID位于引脚4和5上,而nRF覆盖引脚9-13以及2号中断引脚。

这两个模块分别与睡眠和中断代码一起工作正常,但当合并到一个草图时,Arduino会因RFID标签唤醒,读取它,然后尝试通过无线电发送一些东西然后只需挂起,等待库调用write()返回。

我已经深入研究了两个库,但我大多数都无法对软件序列库做出正面或反面。它似乎可能在幕后使用与我的nRF模块相同的ISR,但我不会立即明白为什么这应该是一个大问题,我不明白为什么它应该导致无线电挂起。

我知道这可能是一个很长的镜头,但有人知道可能会发生什么吗?也许有人知道这些图书馆?有关解决方法的任何想法?感谢。

1 个答案:

答案 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字符被丢弃或损坏的延迟,并且此假设不再适用。

所以现在发生的是:

  1. 错过\r,之前的NMEA句子不会被丢弃
  2. 下一个NMEA句子被读入buf
  3. bdx一直前进,直到else
  4. 中的范围检查停止
  5. \r下一个NMEA句子遭到反击
  6. buf[bdx] = '\0';写过buf
  7. 的结尾

    此时Arduino停止响应,看起来write正在阻止。

    此修复是在if

    之前添加的这一行
    if (bdx >= BUFLEN) bdx = 0;
    

    除了这一行之外没有其他任何修改,代码现在已经运行了5个多小时而没有问题,而之前它在write&#34;阻止&#34;之前不会超过30秒。< / p>