1

シリアルを使用してモーターを制御するために Python スクリプトと同期させたいモーターを動かす Arduino コードがいくつかあります。

これはArduinoコードです:

#define BUFFER_SIZE 100

#define P1_STEP_PIN         31
#define P1_DIR_PIN          33
#define P1_ENABLE_PIN       29

#define V1_STEP_PIN         25
#define V1_DIR_PIN          27
#define V1_ENABLE_PIN       23

char buffer[BUFFER_SIZE];

int pins[1][2][2] = { 
    { {P1_STEP_PIN, P1_DIR_PIN}, {V1_STEP_PIN, V1_DIR_PIN} }
};

void setup()
{
  Serial.begin(115200);
  Serial.flush();

  // pins setup
}

void loop()
{
  get_command();
}


void get_command()
{
  if (Serial.available() > 0) {

    int index = 0;
    delay(100); // let the buffer fill up
    int numChar = Serial.available();

    if ( numChar > ( BUFFER_SIZE - 3 ) ) { //avoid overflow
      numChar = ( BUFFER_SIZE - 3 );
    }

    while (numChar--) {
      buffer[index++] = Serial.read();
    }

    process_command(buffer);
  }
}

void process_command(char* data)
{
  char* parameter;
  parameter = strtok (data, " "); // strtok splits char* in " "

  while (parameter != NULL) {
    long dir, pump, motor, sp, steps;

    switch ( parameter[0] ) {
      // moves the motor around
    }

    parameter = strtok(NULL, " ");
  }

  for ( int x=0; x < BUFFER_SIZE; x++) {
    buffer[x] = '\0';
  }
  Serial.flush();
  Serial.write("ok");
}

Python の部分は、私が問題を抱えている場所です。Arduino コードは、Python からコマンドを送信してモーターを動かすとうまく動作しますが、複数のコマンドを続けて送信すると、Python がすべてを同時に送信し、Arduino が各アクションを完了するのを待たずに送信すると思われるため、失敗します。

したがって、基本的に Python では、主に ser.readline() や ser.read(2) などのすべてを少し試して、コマンドが「OK」かどうかを確認しました。

奇妙なことに、コマンドごとに「ok」があるはずですが、そうではなく、すべてが Python に到達するわけではありません。「フラッシュ」しようとしましたが、同じです。

シリアルから常にリッスンし、コマンドが「OK」かどうかを確認するスレッドを作成しましたが、そうではありません.4つのコマンドを送信すると、2つの「OK」、時には0、時には1を受け取ります。

4

1 に答える 1

0

一度に 97 バイト ( ) まで単純に読み取るのではなくBUFFER_SIZE - 3、Python コードから「コマンドの終わり」文字 (または一連の文字) を送信してみてください。

Arduino スケッチでは、この「コマンドの終わり」シーケンスを受け取るまで読んでから、コマンドを実行します。

于 2013-05-09T09:43:37.407 に答える