我如何在 Arduino 的中断之间读取串行?

How do I read serial between interrupts on Arduino?

我在中断定时器 50 期间让步进器步进,并让我的所有代码在中断之间工作,直到我尝试读取长度超过一个字符的串行命令。

我的字节丢失,所以我的字符串每 4-5 个字符缺少一个字母。我研究了一整天,试图找出解决方案,但一无所获。如果我不使用中断,我的步进器将停止 2 秒,将一个字符的串行输入作为字符串读取。

我的目标是让远程控制应用程序发送速度命令。我需要帮助解决这个问题。

https://sourceforge.net/p/open-slider/code/ci/master/tree/OpenSliderFirmware/

String incomingString = "";
if (Serial.available() > 0) {
    incomingString = Serial.readString();
    Serial.println(incomingString);
}

使用 Accelstepper 库

中断:

//Interrupt Timer1
void ISR_stepperManager() {
    Slide.runSpeed();
    Xaxis.runSpeed();
    Yaxis.runSpeed(); 
}

我不确定它是否对您的问题有帮助,但我一直看到当需要发生其他事情时使用 String 类型是不安全的。 我更喜欢使用 char 数组并一次读取一个字符。

while(Serial.available())
{
 data[x] = Serial.read();
 x++;
}

我发现它更可靠。

希望对您有所帮助!

快速回答:如果中断计时器过于频繁地切入,则不会。

我通过使用可变中断定时器和步进乘法器解决了这个问题。基本上每次定时器中断时都会调用这些步骤,而不是在中断函数中检查毫秒数。这解决了很多问题。步进器的速度现在由中断定时器控制。这给了我更多的自由周期来完全阅读传入的序列而不会损坏并提高效率。在超过 4k 时每个周期调用更多步骤 steps/s 也提高了效率,需要更少的周期来实现高速率的步骤。

串行每个周期处理一个字符以防止阻塞。

总的来说,如果您使用串行和中断定时器,任何中断发生时间 < 100us,您应该注意在中断期间有多少代码 运行。它会导致传入的串行和用户输入出现问题。 25us 定时器中断中的几行代码,传入串行将不起作用。