こんにちは、シリアルモニターに何かを入力すると、Hello worldが出力されるプログラムを作成するように求められましたが、問題はそれだけです。シリアルモニターへの入力が3ビット入力であるという条件下でhelloworldを印刷します。その後、コードが必要になり、それが何度も印刷されないようにします。私の唯一の問題は、入力のビット数をカウントする方法と、入力が継続的に印刷されないようにする方法がわからないことです。
void setup() { Serial.begin(9600); } void loop() { String readSerial; String input; while(Serial.available() > 0){// put your main code here, to run repeatedly: delay(2); input.concat(String((char)Serial.read())); return input; } Serial.println("HELLO WORLD"); }
コメント
- これは学校のクラスの課題ですか?
- コードを追加してください。
- はい、そうです。また、課題でもあります。実際のレッスンの前に
- 3ビット入力とは正確にはどういう意味ですか?シリアルインターフェイスはバイト全体のみを送信します。これは、1バイトの8ビットのうち3つの特定の値に関するものですか?
- ここでは、3つの読み取り可能な文字(バイト)は3ビットですか?それとも私の仮定は間違っていますか?
回答
コメントから判断すると、いくつかの基本的な知識が遅れています。この課題で何を学ぶべきかを実際に学ぶには、Web上の学習資料またはC / C ++およびArduinoチュートリアルを確認する必要があります。 。ここでは、課題の解決に役立つ可能性のある、推論に関するヒントのみを示します。(Unfortu当然のことながら、実際には明確ではありません。正確なタスクはここにあります)
- Arduinoの
Serial
インターフェイス(UARTインターフェイス)は、バイト、一度に1つずつ、次々に(したがって、名前はserial
)。 1バイトは一連の8ビットであり、それぞれの値は1または0です。8ビットが一緒になって値を形成し、0〜255の10進値として表すこともできます。たとえば、01001011
は、10進数の75に相当する2進数です。(詳細については、2進数システムを参照してください)バイトデータは、ASCII標準で定義されているため、文字として表すこともできます。すべてのバイナリ値は特定の文字を参照します。これは、ArduinoIDEのシリアルモニターで発生することです。 (詳細については、google ASCIIで説明してください) - データはシリアルに送信されるため、送信に遅延が発生する場合があります。これは人間には気付かれませんが、Arduinoは十分に高速であるため、
Serial.available()
コマンドは0を返す場合があります。これは、その時点で送信に少し遅延が発生したためです。したがって、メッセージを処理する前に、メッセージ全体を把握することが重要です。これを行うには、バイトをカウントする(バッファーで少なくとも3バイトが使用可能になるまで待機する)か、メッセージの終わりを特殊文字(たとえば、改行文字 “\ n”)でマークします。両方を行う方法については、Web上に多くのチュートリアルがあります。 Majenkoのブログから始めることができます。 - 受信されたバイト数は、戻り値
Serial.available()
。バッファに読み取る準備ができたバイトが3つある場合、3を返します。 - 、関数が終了して再定義されたとき、関数が再び開始されたときに破棄されます(Arduinoの世界では、
void loop()
関数は何度も何度も呼び出されます) 。この変数に書き込まれたすべてのコンテンツが失われます。void loop()
関数の実行中にデータを永続化する場合は、関数の外部で変数を定義できます。プログラムの先頭。この変数はグローバルであり、プログラムの開始時に1回だけ定義され、プログラムの存続期間全体にわたって保持されます。 - コメントに記載されているように、値を返さないでください。
void
関数から、s incevoid
は、ほとんどの場合、戻り値がないことを意味します。また、void loop()
関数から戻ると、この関数のみが再起動します(Arduinoの世界にいるため)。 - 。その必要はありません。そして、それが遅延でのみ機能する場合は、他の何かが正しくなく、実際の問題ではなく症状を処理しているだけです。
また、すべてを構築しようとしないでください。車輪を所有し、再発明します。代わりに、ArduinoIDEに付属している例を見てみてください。たとえば、SerialEvent
の例は、シリアルメッセージ(改行文字 “\ n”で終わる)の受信方法を示しています。他の関連する例も見てください。それらがどのように機能するかを理解していれば、問題なく割り当てを行うことができます。
コメント
- こんにちは、私は'取得に近づいていますが、シリアルをリセットする方法について簡単な質問が1つあります。値とそれを0に戻しますか?
- が0を返すまで、戻り値を使用せずに
Serial.read()
を実行できます。
回答
入力文字の高さが3ビットのときにスケッチが「HelloWorld」を出力すると仮定します。 バイトに設定されたビット数をカウントするいくつかの異なるバリエーションを次に示します。
int bits1(int c) { int res = 0; for (int i = 0; i < 8; i++) { if ((1 << i) & c) res = res + 1; } return (res); } int bits2(int c) { int m = 0x80; int res = 0; do { if (m & c) res++; } while (m >>= 1); return (res); } int bits3(int c) { int m = 0x80; int res = 0; do { res += (m & c) != 0; } while (m >>= 1); return (res); } #define bits4(c) __builtin_popcount(c) #define bits bits4 void setup() { Serial.begin(9600); while (!Serial); } void loop() { if (Serial.available() > 0) { int c = Serial.read(); if (bits(c) == 3) { Serial.print((char) c); Serial.print(":"); Serial.print(c, BIN); Serial.println(": Hello World"); } } }