我有步進器在50的中斷計時器中步進,並讓我所有的代碼在中斷之間工作,直到我嘗試讀取長度超過一個字符的串行命令。如何在Arduino上的中斷之間讀取串行?
我得到了丟失的字節,所以我的字符串每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?)串口嗎?什麼是串行數據速率和步進中斷的速率? – barny
中斷是50ms。串口0 USB上的波特率爲115200。最終,我將有一個軟件序列在針腳2和3上運行,我相信藍牙(如果我能弄明白的話) 我仍然試圖找到能夠解釋Marlin固件如何在同一時間可靠地完成步進和串行的人。馬林一次讀取1個字符,我將切換回所以它不會阻止其他事情。我以爲他們用中斷來驅動步進機,但我不再確定這一點。我使用的是2560和RAMPS。我對先進的東西還是一個新手。 – naps1saps
您應該先嚐試降低串口波特率:115200波特大約是每個字節80微秒 - 所以如果您的步進中斷服務程序需要超過80us,您立即可能會丟失串行字符。嘗試9600波特(或更慢),即每個字節大約1毫秒。如果您不確定ISR需要多長時間並且有可用範圍,請在ISR開始時將ISR輸出端口設置爲1,並在末端設置爲0,然後查看脈衝寬度以及多少它有所不同。對於有點臃腫的你肯定不得不減慢串行數據速率。 – barny