我想从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
答案 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