2015-10-10 42 views
2

我有一个使用nRF24l01 +射频模块的SPI(使用这个库:http://tmrh20.github.io/RF24/)和一个基于软件串口的RFID阅读器的Arduino项目。我正在睡觉我的Arduino,并让他们在收到消息或准备好读取RFID标签时通过中断将其唤醒。 RFID在引脚4和引脚5上,而nRF引脚9-13和中断引脚2。Arduino软件与SPI的冲突?

这两个模块都可以单独与睡眠和中断代码一起工作,但是当结合到一个草图中时,Arduino将由于RFID标签而醒来,读取它,然后尝试通过无线电发送某些内容,然后挂起,等待库调用write()返回。

我已经钻研了一下两个库,但我大多无法制作软件串行库的正面或反面。它似乎可能在幕后使用与我的nRF模块相同的ISR,但我不会立即明白为什么这应该是一个大问题,我不明白为什么它应该导致无线电挂断。

我知道这可能是一个长镜头,但没有人有任何想法可能会发生什么?也许有人知道这些库?任何关于工作的想法?谢谢。

+0

你的意思是软件SPI与RFID阅读器? –

+0

RFID阅读器使用softwareserial,因此使用UART类型的协议。 nRF使用SPI。 – MaxStrange

+0

所以我把它的硬件串行端口都采取?无论如何,他们应该一起努力。收音机是如何供电的?一个单独的供应?这是不是一个?如果它是一个uno,并且您使用的是3.3v,那么我将使用单独的3.3v电源,因为它的电流容量非常小,并且添加另一个设备可能会使其停止工作。但是,如果情况并非如此,那么在从RFID读取禁用软件串行之后,它不会关闭中断(如果它在您尝试传输时又得到另一个中断)。看看它是否有效。它的一个软件问题或电台的电源问题 –

回答

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模块中不间断的字符流,此代码可以正常工作,因为我们在buf的空间用完之前总会遇到\r。但是,通过RF24发送信息会导致足够的延迟,导致字符被丢弃或被SoftwareSerial损坏,并且此假设不再成立。

所以,现在发生的事情是这样的:

  1. 一个\r被错过了,以前的NMEA语句不被丢弃
  2. 下一个NMEA句子被读入buf
  3. bdx进步,直到被停止范围检查else
  4. \r下一个NMEA句子被反驳
  5. buf[bdx] = '\0';写过去的buf

末此时的Arduino停止响应,它看起来像write阻止。

解决方法是此行的if前加入:

if (bdx >= BUFLEN) bdx = 0; 

没有其他修饰超过这条线,代码现在已经运行了超过5个小时没有问题,而之前它不会持续超过在write“块”之前30秒。