Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arduino与Python之间的通信_Python_Arduino_Pyserial - Fatal编程技术网

Arduino与Python之间的通信

Arduino与Python之间的通信,python,arduino,pyserial,Python,Arduino,Pyserial,我需要使用我的笔记本电脑与Arduino对话(发送一个命令来控制状态机,使之成为一个简单的自动售货机)。当我试图将该命令放入串行监视器时,一切看起来都很好,但当我通过python发送该命令时,该命令不起作用。看起来状态并没有像我预期的那样改变 以下是python代码: def query(): cmd = "0" dev = serial.Serial("COM3", 9600,timeout=5) time.sleep(2) dev.write(cmd.encode("

我需要使用我的笔记本电脑与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,有人能给我建议吗?如何解决此问题?

在每个函数中,您都有以下行:

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

该线路打开串行端口,复位Arduino板。为了避免这种情况,您应该在程序开始时打开该端口一次,然后每次只使用相同的串行端口实例,而不是在每个函数中重新创建它

你是说Serial.readStringUntil('\n');在Arduino?如果是,它不在使用中。为什么在每个函数中反复出现这一行:dev=serial.serial(“COM3”,9600)。这应该在开始时发生一次,然后继续使用相同的串行端口。每次打开该端口时,都会重置电路板。在你的设置功能中输入一些东西来打印一些东西,这样你就可以在每次发送数据时看到电路板是否被重置。非常感谢你现在正在工作。到时候我会给你一个答案。请接受,非常感谢。这对我很有帮助。