18

ロボットの9つの異なるセンサーからデータを読み取っています。値を比較して、読み取り値のいずれかがオフになっていないかどうかを確認できるように、すべてを同じウィンドウに着実に表示する必要があります。

Serial.printとlcd.printの両方で私が抱えている問題は、値が絶えず動いていて、ロボットを動かしている間、それらを実際によく見ることができないということです。

他のものを表示する前にSerial.clear()のようなものを呼び出すことを考えていました。これにより、値のみが変更され、物事が安定して1か所に保持されます。

私がこれまでに見つけたものから、たとえばSerial.print(17、BYTE)はサポートされなくなりました(ESCキーの呼び出し)。

それで...もう少しArduinoの経験がある人のために...これを行うための適切な方法は何ですか?

4

14 に答える 14

40

Arduinoシリアルモニターは通常の端末ではないため、標準の端末コマンドを使用して画面をクリアすることはできません。Puttyのような実際のターミナルエミュレータを使用することをお勧めします。

端末画面をクリアするためのコマンドはESC[2J

Arduinoコードで達成するには:

  Serial.write(27);       // ESC command
  Serial.print("[2J");    // clear screen command
  Serial.write(27);
  Serial.print("[H");     // cursor to home command

ソース: http:
//www.instructables.com/id/A-Wirelessly-Controlled-Arduino-Powered-Message-B/step6/Useful-Code-Explained-Clearing-a-Serial-Terminal/

于 2013-03-21T22:20:50.620 に答える
8

画面をクリアする方法はありませんがSerial.println();、古いデータをすべて画面に表示しないようにするために必要なだけ印刷することで、画面を偽造することができます。

于 2012-04-14T02:14:06.837 に答える
6

ASCII 12がフォームフィード、つまり新しいページを作成することを発見しました。これがウィキペディアの定義です

「フォームフィードはページ分割ASCII制御文字です。これにより、プリンタは現在のページを取り出し、別のページの先頭で印刷を続行します。」

コードは

Serial.write(12);

Arduino Terminateはキャラクターをサポートしていませんが、軽量のオープンソースtelnetクライアントであるPuttyはサポートできます

コードの例

void setup() {
  Serial.begin(9600);//Initializase the serial transmiter speed

}

void loop() {
    //Code tested with Putty terminal

    Serial.write(12);//ASCII for a Form feed
    Serial.println("This is the title of a new page");// your code

    delay(500);//delay for visual
    }
于 2016-01-19T19:28:38.873 に答える
3

あなたは試すことができます:

Serial.write(13);

キャリッジリターンを提供し、反復ごとに行の先頭に戻るのはどれですか?追跡していることを実行する必要がありますか?(特にすべてが固定幅の場合)。

于 2012-12-08T04:05:04.847 に答える
1

私が考えることができる最善の方法は、処理を使用することです。シリアルデータarduinoグラフarduinoレーダーの表示など、ネット上にいくつかの紹介があります。Arduino
は処理に基づいているため、習得はそれほど難しくありません。

于 2012-04-11T14:20:15.017 に答える
1

ESCは文字_2_7であり、 _1_7ではありません。10進数の12(別名、FF、フォームフィード)を試すこともできます。

これらの特殊文字はすべて、Arduinoではなく、受信側のプログラムによって処理されることに注意してください。したがって、標準のUnixターミナル(xterm、gnome-terminal、kterm、...)は、異なる制御シーケンスのセットを処理し、HTermのようなWindowsターミナルプログラムを言います。

したがって、表示に使用しているプログラムを正確に指定する必要があります。その後、どの制御文字と制御シーケンスが使用可能かを知ることができます。

于 2012-04-11T16:32:15.983 に答える
1

着信シリアルデータに基づいてシリアルモニターウィンドウをクリアすることはできません。

いくつかのオプションを考えることができます。最も簡単な(そして最も簡単な)のはprintln()、センサーデータを含む生成した固定幅の文字列で使用することです。

ArduinoIDEのSerialMonitorのAutoscrollチェックボックスは、固定幅の文字列を永続的に送信する場合(おそらく、500ミリ秒の遅延で)、下部に到達してスクロールを開始すると更新されているという印象を与えることを意味します。ウィンドウの高さを縮小して、1行しかないように見せることもできます。

シリアルに適した固定幅の文字列を作成println()するには、センサー値を文字列に変換する関数と、永続的なサイズにパッド/トリムする関数が必要です。次に、値を連結します(データが読みやすくなる場合は区切り文字を含みます)

これに似たものの出力は、私がほのめかしているものです:

| 1.0 | 1.1 | 1.2 | 1.3 | 1.4 | 1.5 | 1.6 | 1.7 | 1.8 |

すべてを考慮すると、これは優れたソリューションではありませんが、結果が得られます。

はるかに賢いアイデアは、Arduinoの外部に別のプログラムを構築することです。これは、Arduinoから送信されたセンサー値のCOMポートをリッスンするIDEです。Arduinoプログラムは、外部プログラムが明確に解釈できるメッセージを送信する必要があります。たとえば1=0.5;、1=センサーIDおよび0.5=センサー値です。外部プログラムはこれらの値を保持します(センサーごとに1つ)。その後、外部プログラムはこの情報を好きなように表示できます。優れたコンソール出力は比較的簡単に実現できます:-)

C#使用するのが楽しい.NETのクラスがあります。serialport(ほとんどの時間!)

Pythonには、と呼ばれるモジュールがありますpyserial。これも簡単です。

この方法を選択した場合、どちらの言語でもコンソール出力をより細かく制御できます。

于 2012-04-11T16:34:17.950 に答える
1

たとえば、ボーレートを前後に変更すると、IntelGalileo開発用のArduinoIDEのバージョン1.5.3のシリアルモニターウィンドウがクリアされます。

于 2014-04-03T09:39:58.913 に答える
1

缶での別のキック:

void setup(){     /*123456789 123456789 123456789 123456789 123*/
  String newRow="\n|________________________________________";
  String scrSiz="\n|\n|\n|\n|\n|\n|\n|\n|\n|\t";
  Serial.begin(115200);  
       // this baudrate should not have flicker but it does as seen when
       // the persistence of vision threshold is insufficiently exceeded
       // 115200 baud should display ~10000 cps or a char every 0.1 msec
       // each 'for' loop iteration 'should' print 65 chars. in < 7 msec
       // Serial.print() artifact inefficiencies are the flicker culprit
       // unfortunately '\r' does not render in the IDE's Serial Monitor

  Serial.print( scrSiz+"\n|_____ size screen vertically to fit _____"  );
  for(int i=0;i<30;i++){
     delay(1000); 
     Serial.print((String)scrSiz +i +"\t" + (10*i) +newRow);}
}
void loop(){}
于 2016-06-13T05:43:25.930 に答える
0

あなたはただすることができます:

Serial.println("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");

または必要に応じて:

for (int i=0; i<100; i++) {
   Serial.print("\n");
}
于 2016-07-28T09:59:36.383 に答える
0

私はこれsimple functionを達成するためにこれを作りました:

void clearscreen() { 
    for(int i=0; i<10; i++) {
        Serial.println("\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
    }
}

それは私にとってうまくいきますdefault terminal

于 2017-01-12T05:23:36.797 に答える
0

imprime en linea los datos con un espaciado determinado、asítendráscolumnasde datos de lamismavariableyserámásclaro

すべてのデータを一列に印刷して、必要なデータを含む行を作成します。このような同じ問題を解決します。一定のデータサイズと間隔を指定して、これを作成しました。

Serial.print("cuenta q2: ");
Serial.print( cuenta_pulsos_encoder_1,3);
Serial.print("\t");
Serial.print(q2_real,4);
Serial.print("\t");
Serial.print("cuenta q3: ");
Serial.print( cuenta_pulsos_encoder_2,3);
Serial.print("\t");
Serial.print(q3_real,4);
Serial.print("\t");
Serial.print("cuenta q4: ");
Serial.print( cuenta_pulsos_encoder_3,3);
Serial.print("\t");
Serial.println(q4_real,4);
于 2018-11-19T20:49:44.660 に答える
0

プロテウスで仮想端末を使用していて、それをクリアしたい場合は、Serial.write(0x0C);を追加してください。そしてそれはうまくいくだろう

于 2019-06-14T11:15:18.183 に答える
-1
/*
As close as I can get to Clear Screen

*/


void setup() {
// put your setup code here, to run once:
Serial.begin(115200);

}

void loop() {

Serial.println("This is Line ZERO ");

// put your main code here, to run repeatedly:

for (int i = 1; i < 37; i++)
{

 // Check and print Line
  if (i == 15)
  {
   Serial.println("Line 15");
  }

  else
   Serial.println(i);  //Prints line numbers   Delete i for blank line
  }

  delay(5000);  

  }
于 2014-12-09T20:10:08.103 に答える