【问题标题】:The SoftwareSerial Library of Arduino, why it needs PCINT (pin change inturrupt feature.)?Arduino的SoftwareSerial库,为什么需要PCINT(pin change inturrupt feature)?
【发布时间】:2023-06-14 08:15:01
【问题描述】:

Arduino 的 SoftwareSerial 库不适用于由 ATMEGA32 制成的克隆,因为它没有 PCINT 功能。串行通信如何与 PCINT 链接? ATMEGA32/16的INT引脚可以通过修改SoftwareSerial.cpp文件以某种方式使用吗?

【问题讨论】:

    标签: serial-port arduino atmega atmel software-serial


    【解决方案1】:

    在 IDE 1.0.+ 之前,SoftwareSerial 曾经是 Rx 引脚的轮询。这是阻塞,需要不断检查 RX 的服务并限制波特率的质量。由于 NewSoftSerial 使用 PCint 替换了以前较旧的 Polled SoftwareSerial。这会在 RX 引脚的变化上创建一个中断,然后检查时间。这不再阻塞并更好地模拟硬件串行端口,需要更少(无)服务(或轮询)。

    可以从 1.+ 之前返回到旧 IDE 的 SoftwareSerial 并尝试将其向前移植或尝试在旧 IDE 中使用 ATmega32。我以为我在某处看到了一个 DEFINE 开关,可以让它在轮询模式下运行。但我无法在当前版本中找到它。可能没有进入已发布的 IDE。

    或者您可以尝试寻找 SoftwareSerial 的替代品。例如tinyserial 我看到的可以追溯到 2010 年,可能需要一些更新。特别是在 1.5.8 上。在 1.0.6 上尝试可能会更好

    【讨论】:

    • 你很幸运! ATmega32 的 INT0、1、2 引脚可配置为在上升或下降或电平时产生中断。因此,可以使用 INT0 (或其他),原则上(几乎是)简单地从 attachInterrupt(0,myRXhandle_interrupt(),FA​​LLING) 开始,它依次分离先前的中断并在调用 SoftwareSerial::handle_interrupt( )。这将使用 PCint 使用的相同功能捕获和处理波特率的上升和下降。
    • 非常感谢@mpflag,事实上,过去几天我一直在努力解决这个问题。我尝试安装旧软件序列号。将它们重命名为 pSoftwareserial.h 、 pSoftwareserial.cpp 并在 .cpp 内部更正包含 和“pSoftwareserial.h” 它编译时带有一定的警告,但最后 SoftwareSerial 没有工作。我对可能从 Stream 对象继承的 mySerial.readString() 之类的函数不太习惯。现在我正在尝试使用一个名为 AltSoftSerial 的库,但即使它也没有继承 Stream 对象。
    • 你能编译 AltSoftSerial 的 test.pde。我可以同时使用 IDE 1.0.6 和 1.5.8。我希望这条路线是最可靠的,因为 PJRC 的工作非常好。
    • #define ALTSS_USE_TIMER1 #define INPUT_CAPTURE_PIN >> ICP1 #define OUTPUT_COMPARE__PIN >> OC1 对吗?那是我看到 AltSoftSerial_Board.h 后的想法……在你建议的第二个想法上,我尝试了 mySerial.handle_interrupt();它给出了一个错误,说未定义对 SoftwareSerial::handle_interrupt()' 的引用这个函数可能没有在 中定义我该如何解决这个问题?
    • 你能发布代码吗?听起来很值得分享。