シリアルを使用してモーターを制御するために 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を受け取ります。