【发布时间】:2016-12-15 15:06:50
【问题描述】:
我有步进器在 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();
}
【问题讨论】:
-
您使用的是软件(bit-banged?)串口吗?串行数据速率是多少,步进中断的速率是多少?
-
中断时间为 50 毫秒。 serial0 USB 上的波特率为 115200。最终,我将在引脚 2 和 3 上运行软件串行,我相信蓝牙(如果我能弄明白的话)我仍在努力寻找能够解释 Marlin 固件如何可靠地同时完成步进和串行的人。 Marlin 一次读取 1 个字符,我将切换回它,这样它就不会阻塞其他内容。我以为他们使用中断来驱动步进器,但我不再确定这一点。我正在使用 2560 和 RAMPS。对于高级的东西,我还是个新手。
-
您应该首先尝试降低串行波特率:115200 波特大约是每字节 80 微秒 - 因此,如果您的步进中断服务例程花费超过 80 微秒,您将立即面临丢失串行字符的风险。尝试 9600 波特(或更慢),即每字节大约一毫秒。如果您不确定 ISR 需要多长时间并且有可用的示波器,请在 ISR 开始时将 ISR 输出为 1 到端口,最后为 0,并查看脉冲的宽度和多少它因人而异。对于 bit-banged,您肯定必须降低串行数据速率。
-
说到示波器,我一直想要一台,但不想花 200 美元买一个*便宜的。 20 美元的 DSO 138 是否符合您的建议?
标签: arduino serial-port interrupt