2016-12-02 29 views
1

私はステッパーを50で割り込みタイマーの間に踏み込んでいて、シリアルコマンドを2文字以上読み込もうとするまで、すべてのコードが割り込みの間で働いています。Arduinoの割り込み間でシリアルを読み取るにはどうすればよいですか?

私の文字列には4〜5文字ごとに文字が欠けています。私は一日中研究を試みて解決策を見つけたが、何も出てこなかった。割り込みを使用しない場合、ステッパーは2秒間停止し、1文字のシリアル入力を文字列として読み込みます。

私の目標は、リモコンアプリにスピードコマンドを送信させることです。私はこの問題を解決する助けが必要です。 Accelstepperライブラリを使用して

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

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

割り込み:

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

ソフトウェア(bit-banged?)シリアルポートを使用していますか?シリアルデータレートとステッパー割り込みのレートはどのくらいですか? – barny

+0

割り込みは50msです。ボーレートはシリアル0 USBで115200です。最終的に私はソフトウェアシリアルを2番ピンと3番ピンで実行していますが、私はブルートゥースを信じています(もし私がそれを理解できれば) マーリンファームウェアがステッピングとシリアルを確実に達成する方法を説明できる人物を探しています。マーリンは一度に1つの文字を読みますが、他のものをブロックしないように私は元に戻すつもりです。私は彼らがステッパーを運転するために割り込みを使用したと思ったが、私はもはやそれについてはわからない。私は2560とRAMPSを使用しています。私はまだ高度なものについては少し初心者です。 – naps1saps

+0

シリアルボーレートを減らすことをお勧めします:115200ボーはバイトあたり約80マイクロ秒です。したがって、ステッパー割り込みサービスルーチンが80usを超えると、直ちにシリアルチャンクが失われる危険性があります。 9600ボー(またはそれより遅い)を試してみてください。それは1バイトあたり約1ミリ秒です。ISRがどれくらい時間がかかり、有効範囲があるかわからない場合は、ISRの出力をISRの開始点の1に、最後を0にして、パルスの幅とその量を調べますそれは変化する。ビットバンギングの場合は、間違いなくシリアルデータレートを遅くする必要があります。 – barny

答えて

0

クイックアンサー:割り込みタイマーがあまりにも頻繁にカットされている場合、あなたはしません。

可変割り込みタイマとステップ乗算器を使用して問題を解決しました。基本的には、割り込み関数内でmillisをチェックするのではなく、タイマーが割り込みするたびにステップが呼び出されます。これは多くの問題を解決しました。ステッパーの速度は割り込みタイマによって制御されるようになりました。これにより、破損や効率の改善なしに、着信シリアルを完全に読み取るためのフリーサイクルが増えました。 4kステップ以上でサイクルごとに多くのステップを呼び出すと、高いステップ数でより少ないサイクルで効率を改善できました。

シリアルは、ブロックされないようにサイクルごとに1つのチャールで処理されます。

全体的に、シリアルと割り込みタイマを使用している場合、割り込みが発生している間にどのくらいのコードが実行されているか慎重になる必要があります< 100us。シリアル入力とユーザー入力の問題が発生します。 25usタイマー割り込みのコードが数行あり、受信シリアルは機能しません。

0

それはあなたの問題に役立つ場合、私はわからないんだけど、私は文字列がその時間に沿って見ました他のものが起こる必要があるときには使用するのが安全ではありません。 私はchar配列を使い、一度に1つのcharを読み込む方が好きです。

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

私はそれをはるかに信頼性が高いと考えています。

願っています!

+0

残念ながら、whileループは私が持っていた問題であったタイマ割り込みによって中断されるため、私のコードでそれを使用しても差はありません。しかし、提案をありがとう。 – naps1saps

関連する問題