2016-12-02 4 views
1

Ich habe Stepper während eines Interrupt-Timers bei 50 und habe alle meine Code arbeiten zwischen den Interrupts, bis ich versuchte, serielle Befehle mehr als ein Zeichen lang zu lesen.Wie lese ich serielle zwischen Interrupts auf Arduino?

Ich bekomme Bytes fallen gelassen, so dass meine Zeichenfolgen alle 4-5 Zeichen einen Buchstaben fehlen. Ich recherchierte den ganzen Tag, um zu versuchen, eine Lösung zu finden, habe aber nichts gefunden. Wenn ich keinen Interrupt verwende, stoppt mein Stepper 2 Sekunden lang und liest eine ein Zeichen lange serielle Eingabe als String.

Mein Ziel ist es, eine Fernsteuerungs-App zu haben, die Geschwindigkeitsbefehle sendet. Ich brauche Hilfe, um dieses Problem zu lösen.

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

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

Mit Accelstepper Bibliothek

Alarm:

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

Verwenden Sie eine Software (bit-banged?) Serielle Schnittstelle? Was ist die serielle Datenrate und die Rate der Stepper-Interrupts? – barny

+0

Unterbrechung ist 50ms. Baud ist 115200 auf serial0 USB. Irgendwann werde ich eine Software-Seriennummer auf Pins 2 & 3 laufen lassen, glaube ich für Bluetooth (wenn ich es herausfinden kann) Ich versuche immer noch jemanden zu finden, der erklären kann, wie Marlin-Firmware Schritt für Schritt und seriell gleichzeitig zuverlässig leistet. Marlin liest jeweils 1 Char, zu dem ich zurückwechseln werde, um andere Dinge nicht zu blockieren. Ich dachte, sie benutzten einen Interrupt, um die Stepper zu fahren, aber ich bin mir nicht mehr sicher. Ich benutze ein 2560 und ein RAMPS. Ich bin immer noch ein Anfänger auf fortgeschrittenem Zeug. – naps1saps

+0

Zuerst sollten Sie versuchen, die serielle Baudrate zu reduzieren: 115200 Baud sind ungefähr 80 Mikrosekunden pro Byte - wenn also Ihre Stepper-Interrupt-Service-Routine mehr als 80us benötigt, riskieren Sie sofort, eine Serien-Char zu verpassen. Versuchen Sie 9600 Baud (oder langsamer), das ist etwa eine Millisekunde pro Byte.Wenn Sie nicht sicher sind, wie lange der ISR braucht und einen Bereich verfügbar hat, stellen Sie am Anfang des ISR die ISR-Ausgabe auf 1 und am Ende auf 0, und schauen Sie sich die Breite des Impulses an und wie viel es variiert. Für Bit-Banged müssen Sie die serielle Datenrate definitiv verlangsamen. – barny

Antwort

0

Schnelle Antwort: Sie nicht, wenn der Interrupt-Timer zu oft einschneidet.

Ich löste das Problem mit einem variablen Interrupt-Timer und einem Schrittmultiplikator. Grundsätzlich werden die Schritte jedes Mal aufgerufen, wenn der Timer unterbricht, anstatt Millis innerhalb der Interrupt-Funktion zu prüfen. Dies hat viele Probleme gelöst. Die Geschwindigkeit des Steppers wird jetzt vom Interrupt-Timer gesteuert. Dies gab mir mehr freie Zyklen, um die eingehende Serie ohne Korruption und verbesserte Effizienz vollständig zu lesen. Der Aufruf von mehr Schritten pro Zyklus bei mehr als 4 k Schritten/s verbessert auch die Effizienz, da weniger Zyklen für eine große Anzahl von Schritten erforderlich sind.

Die Serie wird eine Char pro Zyklus verarbeitet, um Blockierungen zu verhindern.

Insgesamt, wenn Sie serielle und einen Interrupt-Timer verwenden, jede Unterbrechung passiert < 100us sollten Sie vorsichtig sein, wie viel Code Sie während der Unterbrechung ausgeführt werden. Dies führt zu Problemen mit eingehenden seriellen und Benutzereingaben. Ein paar Zeilen Code in einem 25us-Timer-Interrupt, eingehende serielle wird nicht funktionieren.

0

Ich bin nicht sicher, wenn es um Ihr Problem zu helfen, aber ich sah an der Zeit, dass der String Typ ist nicht sicher zu verwenden, wenn andere Dinge passieren müssen. ich bevorzuge Char-Array und lesen Sie jeweils ein Zeichen nach dem anderen.

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

Ich finde es viel zuverlässiger.

hoffe es hilft!

+0

Leider würde die Verwendung in meinem Code keinen Unterschied machen, da die while-Schleife durch den Timer-Interrupt unterbrochen würde, was das Problem war, das ich hatte. Danke für den Vorschlag. – naps1saps