Связь между Arduino и Python - PullRequest
0 голосов
/ 19 июня 2020

Мне нужно использовать свой ноутбук для разговора с Arduino (отправить команду для управления конечным автоматом, чтобы создать простой торговый автомат), все выглядит нормально, когда я пытался ввести команду в последовательный монитор, но когда я отправляю команду через python не работает. похоже, что состояние не изменилось, как я ожидал.

Вот код python:

def query():
   cmd = "0"
   dev = serial.Serial("COM3", 9600,timeout=5)
   time.sleep(2)
   dev.write(cmd.encode("utf-8"))
   print("Pyhton: Query                  ",dev.readline())
   #time.sleep(1)
   #print(dev.readline())

def up():
   cmd = "1"
   dev = serial.Serial("COM3", 9600)
   time.sleep(2)
   dev.write(cmd.encode("utf-8"))
   print("Pyhton: up                     ",dev.readline())
   #time.sleep(1)
   #print(dev.readline())

def pickup():
   cmd = "2"
   dev = serial.Serial("COM3", 9600)
   time.sleep(2)
   dev.write(cmd.encode("utf-8"))
   print("Pyhton: pickup                  ",dev.readline())
   #time.sleep(1)
   #print(dev.readline())


def ship():
   cmd = "3"
   dev = serial.Serial("COM3", 9600)
   time.sleep(2)
   dev.write(cmd.encode("utf-8"))
   print("Pyhton: ship                 ",dev.readline())
   #time.sleep(1)
   #print(dev.readline())


def origin():
   cmd = "4"
   dev = serial.Serial("COM3", 9600)
   time.sleep(2)
   dev.write(cmd.encode("utf-8"))
   print("Pyhton: origin               ",dev.readline())
   #time.sleep(1)
   #print(dev.readline())


tokenDict = {
   "001":query,
   "002":up,
   "003":ship,
   "004":pickup,
   "005":origin
   }

lineList = [line.rstrip('\n') for line in open("cmd.txt")]

for line in lineList:
   time.sleep(1)
   functionToCall = tokenDict[line]
   functionToCall()

Вот код Arduino:

int cmd = 0;
enum {IDLEx, UP, PICKUP, SHIP, ORIGIN};
uint8_t STATE = IDLEx;

void setup() {
  Serial.begin(9600);
  //Serial.flush();
  pinMode(LED_BUILTIN, OUTPUT);
}

void readSerialData() {
  if (Serial.available()>0) {
    delay(300);
    //cmd = Serial.readStringUntil('\n');
    cmd = Serial.read();
    process_serial(cmd, &STATE);
    //test(cmd);
  }
}

  void process_serial(int data, uint8_t *state)
  {
    switch (*state)

    {
      case IDLEx: {
          if (data == '0') {
            *state = IDLEx;
            Serial.println("Arduino: IDLE");

          } else if (data == '1' ) { //go to up state
            *state = UP;
            //Serial.println("Arduino: Up");
          } else if (data == '2') {
            *state = PICKUP;
            //Serial.println("Arduino: PICKUP");
          } else if (data == '3') {
            //Serial.println("Arduino: SHIP");
            *state = SHIP;
          } else if (data == '4') {
            //Serial.println("Arduino: ORIGIN");
            *state = ORIGIN;
          } 
          break;
        }
      case UP: {
          Serial.println("Arduino: UP");
          delay(1000);
          *state = PICKUP;
          break;
        }
      case PICKUP: {
          Serial.println("Arduino: PICKUP");
          delay(1000);
          *state = SHIP;
          break;
        }
      case SHIP: {
          Serial.println("Arduino: SHIP");
          delay(1000);
          *state = ORIGIN;
          break;
        }
      case ORIGIN: {
          Serial.println("Arduino: ORIGIN");
          delay(1000);
          *state = IDLEx;
        }
        break;
    }
  }
  void loop() {
    //Serial.println(STATE);
    readSerialData();
  }

Я прочитал команда из текстового файла что-то вроде

001
001
002
001
001
003
001
004
001
005

Вот результат, который я ожидаю:

Pyhton: Query                   b'Arduino: IDLE\r\n'
Pyhton: Query                   b'Arduino: IDLE\r\n'
Pyhton: up                      b'Arduino: Up\r\n'
Pyhton: Query                   b'Arduino: Up\r\n'
Pyhton: Query                   b'Arduino: Up\r\n'
Pyhton: ship                  b'Arduino: SHIP\r\n'
Pyhton: Query                   b'Arduino: SHIP\r\n'
Pyhton: pickup                   b'Arduino: PICKUP\r\n'
Pyhton: Query                   b'Arduino: PICKUP\r\n'
Pyhton: origin                b'Arduino: ORIGIN\r\n'

Моя проблема в том, что когда я отправляю данные в Arduino, похоже, что Arduino не меняет состояние (Используйте чехол в качестве кода) обратите внимание, что я использую Arduino nano 328 и python 3.x. Может ли кто-нибудь мне предложить? Как я могу решить эту проблему?

1 Ответ

1 голос
/ 19 июня 2020

В каждой из ваших функций у вас есть эта строка:

dev = serial.Serial("COM3", 9600)

Эта строка открывает последовательный порт, который сбрасывает плату Arduino. Чтобы избежать этого, вы должны открыть этот порт один раз в начале своей программы, а затем просто продолжать использовать тот же самый экземпляр последовательного порта каждый раз, вместо того, чтобы воссоздавать его в каждой функции.

...