0

単純な自動化プロジェクトの一環として、シリアル ポートを介していくつかの LED を制御しようとしました。次のコードを機能させることができません

int pin =0;
int state = 0;

void setup() {
    Serial.begin(9600);     // opens serial port, sets data rate to 9600 bps
}

void loop() {
    // send data only when you receive data:
    if (Serial.available() > 0) {
        // read the incoming byte:
        if(Serial.read() == 'S' && Serial.read() == 'S') {
            // Command to set the pin
            pin  = Serial.read() - 65;
            state = Serial.read() - '0';
            Serial.print("Set State Command received");
            // Set the Pin
            pinMode(pin, OUTPUT);          
            digitalWrite(pin, state == 0? LOW:HIGH);
        }
    }
}

テストのためにPythonプログラムからArduinoシリアルポートに「SSN1」を送信していますが、何も起こりません(ピン13にLEDが接続されています)

SS -  Set State Command
N  - (pin no) + 'A'  - Pin number 13
1  - State ( 0 = LOW, 1= HIGH)
4

4 に答える 4

2

シリアル バッファに4シリアル バイトが蓄積されるまで待ちたいとします。

void loop() {
    // polls the serial buffer
    while (Serial.available() < 4);
    if (Serial.read() == 'S' && Serial.read() == 'S') {
       char type = Serial.read();
       char pin = Serial.read() - 65;
       // do something with the results
    }
}

入力間にある種のパディング (固定長のスペースを追加するなど) を実装したい場合があることに注意してください。これは、シリアル バッファーが 1 バイトを削除したり、オーバーフローしたりすると、予期しない結果が生じる可能性があるためです。また、コンピューターサイエンティストは「ポーリング=悪い!」と考えるように訓練されているため、コマンドについて不満を言う人もwhile (Serial.available() < 4)いますが、Arduinoの場合は単一のタスクしか実行していないため、違いはありません.

ちなみに、Serial データで割り込みを使うこともできますが、それはこのレスポンスの範囲外です。

于 2013-04-23T11:56:17.623 に答える
0

このようにコードを改善しました

int pin =0;
int state = 0;

void setup() {
        Serial.begin(9600);     // opens serial port, sets data rate to 9600 bps
}

void loop() {

        // send data only when you receive data:
        if (Serial.available() > 3) { // I am using chunk of 4 characters/bytes as a command 
                // read the incoming byte:
                if(Serial.read() == 'S' && Serial.read() == 'S') {
                  // Command to set the pin
                  pin  = Serial.read() - 65;
                  state = Serial.read() - '0';
                  Serial.print("Set State Command received");
                  // Set the Pin
                  pinMode(pin, OUTPUT);          
                  digitalWrite(pin, state == 0? LOW:HIGH);
                }
                delay(50); 
        }
}

それは私にとって完璧に機能します。ループの頻度が高いため、Arduino は連続読み取り用のバイトを取得できませんでした。したがって、それらを読み取るためにバッファに4バイトが蓄積されるのを待っています(Arduinoのシリアルバッファは64バイトです)。

于 2013-04-28T21:37:19.047 に答える
0

Arduino の物理ピクセル チュートリアルのこのサンプル コードを見てください。

const int ledPin = 13; // the pin that the LED is attached to
int incomingByte;      // a variable to read incoming serial data into

void setup() {
  // initialize serial communication:
  Serial.begin(9600);
  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);
}

void loop() {
  // see if there's incoming serial data:
  if (Serial.available() > 0) {
    // read the oldest byte in the serial buffer:
    incomingByte = Serial.read();
    // if it's a capital H (ASCII 72), turn on the LED:
    if (incomingByte == 'H') {
      digitalWrite(ledPin, HIGH);
    } 
    // if it's an L (ASCII 76) turn off the LED:
    if (incomingByte == 'L') {
      digitalWrite(ledPin, LOW);
    }
  }

SSN1シリアル モニタで通過していることを確認します。

于 2013-04-23T03:29:11.093 に答える