与arduino进行pyserial通信(用于电机控制)

时间:2016-11-02 23:47:39

标签: python arduino serial-port pyserial

我想从python do arduino发送数据,以便通过继电器控制电机。想法是发送一个数字,以便识别电机和一个值,最后移动它。不幸的是我在努力解决一些问题。数据正在丢失。

因此,在该最小示例中,存在标识符“n”,以指示所接收的数据是变量“number”和标识符“c”以识别所接收的数据是计数器。为了找出问题所在,我将数据发送回Python并尝试阅读。这是设置仅适用于第一个字符。所有其他数据都会丢失。

有人可以给我一个提示吗?这些标识符是否必要?我是否需要延迟(),或者可能是另一种延迟?

我猜这是第二个标识符。如果我只使用“计数器”,那么设置工作正常。

非常感谢你!

Pyhton:

import serial
import time

Port = "/dev/cu.usbserial-A601FZBL"
ser = serial.Serial(Port,9600,timeout=1)

time.sleep(1)

counter = 0

def Test(counter):
    ser.write(b"n")
    ser.write(str(1).encode())
    print("number:", 1)

    get = ser.readline().decode()
    print("get:", get)    


    ser.write(b"c")
    ser.write(str(counter).encode())
    print("counter:", counter)

    get = ser.readline().decode()
    print("get:", get)
    print()


while True:
    Test(counter)
    counter += 1

Arduino的:

void setup() {
  Serial.begin(9600);
}

int number;
int counter;

void loop() {
  if (Serial.available() > 0) {
    if (Serial.peek() == 'n') {
      Serial.read();
      number = Serial.parseInt();
      Serial.println(number);

      if (Serial.peek() == 'c') {
        Serial.read();
        counter = Serial.parseInt();
        Serial.println(counter);
      }

      while (Serial.available() > 0) {
        Serial.read();
      }
    }
  }
}

抱歉!这是我的样本运行: (我很困惑,为什么在输出中的print()旁边还有其他空行

number: 1
get: 1


counter: 0
get: 

number: 1
get: 
counter: 1
get: 

number: 1
get: 
counter: 2
get: 

number: 1
get: 
counter: 3
get: 

number: 1
get: 
counter: 4
get: 

number: 1
get: 
counter: 5

1 个答案:

答案 0 :(得分:1)

感谢您的支持。所以,最后没有数据丢失;)问题是:Arduino在发送数据时创建了一个空白行。所以“ser.readline()[: - 2] .decode()”解决了这个问题。当发送大于9的整数时,我遇到了另一个问题。为了做到这一点,必须将整数分成单独的字符并对它们进行编码。这是我的解决方法:

的Python:

import serial
import time

Port = "/dev/cu.usbserial-A601FZBL"
ser = serial.Serial(Port,9600,timeout=1)

time.sleep(1)

counter = 0

def Test(counter):
    data = [b"n", b"0", b"c"]
    value = list(str(counter))

    for char in value:
        data.append(char.encode())

    ser.write(data)
    print("write:", "0", counter)

    get_1 = ser.readline()[:-2].decode()
    get_2 = ser.readline()[:-2].decode()
    print("get:  ", get_1, get_2)
    print()

while True:
    Test(counter)
    counter += 1

Arduino的:

void setup() {
  Serial.begin(9600);
}

int number;
int counter;

void loop() {
  while (Serial.available() > 0) {
    if (Serial.peek() == 'n') {
      Serial.read();
      number = Serial.parseInt();
      Serial.println(number);

      if (Serial.peek() == 'c') {
        Serial.read();
        counter = Serial.parseInt();
        Serial.println(counter);
      }

      while (Serial.available() > 0) {
        Serial.read();
      }
    }
  }
}

最终输出:

write: 0 0
get:   0 0

write: 0 1
get:   0 1

write: 0 2
get:   0 2

write: 0 3
get:   0 3

write: 0 4
get:   0 4

write: 0 5
get:   0 5

write: 0 6
get:   0 6

write: 0 7
get:   0 7

write: 0 8
get:   0 8

write: 0 9
get:   0 9

write: 0 10
get:   0 10

write: 0 11
get:   0 11