gpt4 book ai didi

Arduino 软件串口与 SPI 冲突?

转载 作者:行者123 更新时间:2023-12-04 20:26:28 31 4
gpt4 key购买 nike

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

这两个模块分别与 sleep 和中断代码一起工作,但是当结合到一个草图中时,Arduino 将由于 RFID 标签而唤醒,读取它,然后尝试通过 radio 发送一些东西,然后挂起,等待库调用 write() 返回。

我已经对这两个库进行了一些研究,但我对软件序列库几乎一无所知。它似乎在幕后使用了与我的 nRF 模块相同的 ISR,但我没有立即明白为什么这应该是一个大问题,而且我不明白为什么它会导致 radio 挂起。

我知道这可能不太可能,但是有人知道会发生什么吗?也许有人知道这些图书馆?关于变通的任何想法?谢谢。

最佳答案

我遇到了同样的症状,结果证明问题是我的代码中的缓冲区溢出。溢出本身是由于 SoftwareSerial 丢弃字节造成的,因为 RF24 库正在中断处理。

有问题的代码使用 SoftwareSerial 从 GPS 接收器读取数据,解析 NMEA 语句并提取纬度和经度信息,以便使用 RF24 通过 radio 发送。它是这样的:

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. 中的范围检查停止
  5. \r 下一个 NMEA 语句被反驳
  6. buf[bdx] = '\0'; 写入 buf
  7. 的结尾

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

解决方法是在 if 之前添加这一行:

if (bdx >= BUFLEN) bdx = 0;

除了这一行没有其他修改,代码现在已经运行了 5 个多小时而没有问题,而以前在 write“ block ”之前它不会持续超过 30 秒。

关于Arduino 软件串口与 SPI 冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33050206/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com